From e7b406f4e20e248d24079f97d7c8b93e5a45249e Mon Sep 17 00:00:00 2001 From: Michael Morehouse <640167+yawpitch@users.noreply.github.com> Date: Mon, 23 Dec 2019 14:37:47 +0000 Subject: [PATCH 001/380] [typo] fix dupe in datetime.fromisoformat docs (GH-17295) Fixes a nearly word for word duplication of a sentence that appears earlier in the caution section of datetime.datetime.fromisoformat in Doc/Library/datetime.rst. No issue created as it's a trivial change. Automerge-Triggered-By: @pganssle --- Doc/library/datetime.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 401118f980a..22ecbb551d8 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -997,8 +997,6 @@ Other constructors, all class methods: as the inverse operation of :meth:`datetime.isoformat`. A more full-featured ISO 8601 parser, ``dateutil.parser.isoparse`` is available in the third-party package `dateutil `__. - This does not support parsing arbitrary ISO 8601 strings - it is only intended - as the inverse operation of :meth:`datetime.isoformat`. Examples:: From 9f9dac0a4e58d5c72aa3b644701cb155c009cb2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Gmach?= Date: Mon, 23 Dec 2019 15:53:18 +0100 Subject: [PATCH 002/380] bpo-38914 Do not require email field in setup.py. (GH-17388) When checking `setup.py` and when the `author` field was provided, but the `author_email` field was missing, erroneously a warning message was displayed that the `author_email` field is required. The specs do not require the `author_email`field: https://packaging.python.org/specifications/core-metadata/#author The same is valid for `maintainer` and `maintainer_email`. The warning message has been adjusted. modified: Doc/distutils/examples.rst modified: Lib/distutils/command/check.py https://bugs.python.org/issue38914 --- Doc/distutils/examples.rst | 2 +- Lib/distutils/command/check.py | 13 ++++++++----- .../2019-11-26-23-21-56.bpo-38914.8l-g-T.rst | 5 +++++ 3 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index 44f70831d0b..e492b7f6057 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -255,7 +255,7 @@ Running the ``check`` command will display some warnings: running check warning: check: missing required meta-data: version, url warning: check: missing meta-data: either (author and author_email) or - (maintainer and maintainer_email) must be supplied + (maintainer and maintainer_email) should be supplied If you use the reStructuredText syntax in the ``long_description`` field and diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py index 04c2f9642d7..7ceabd3adf2 100644 --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -80,8 +80,11 @@ class check(Command): def check_metadata(self): """Ensures that all required elements of meta-data are supplied. - name, version, URL, (author and author_email) or - (maintainer and maintainer_email)). + Required fields: + name, version, URL + + Recommended fields: + (author and author_email) or (maintainer and maintainer_email)) Warns if any are missing. """ @@ -97,15 +100,15 @@ class check(Command): if metadata.author: if not metadata.author_email: self.warn("missing meta-data: if 'author' supplied, " + - "'author_email' must be supplied too") + "'author_email' should be supplied too") elif metadata.maintainer: if not metadata.maintainer_email: self.warn("missing meta-data: if 'maintainer' supplied, " + - "'maintainer_email' must be supplied too") + "'maintainer_email' should be supplied too") else: self.warn("missing meta-data: either (author and author_email) " + "or (maintainer and maintainer_email) " + - "must be supplied") + "should be supplied") def check_restructuredtext(self): """Checks if the long string fields are reST-compliant.""" diff --git a/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst b/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst new file mode 100644 index 00000000000..2dfc1ea149b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst @@ -0,0 +1,5 @@ +Adjusted the wording of the warning issued by distutils' ``check`` command when +the ``author`` and ``maintainer`` fields are supplied but no corresponding +e-mail field (``author_email`` or ``maintainer_email``) is found. The wording +now reflects the fact that these fields are suggested, but not required. Patch +by Juergen Gmach. From 4b3b1226e86df6cd45e921c8f2ad23c3639c43b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Mon, 23 Dec 2019 19:11:00 +0300 Subject: [PATCH 003/380] bpo-38870: Refactor delimiting with context managers in ast.unparse (GH-17612) Co-Authored-By: Victor Stinner Co-authored-by: Pablo Galindo --- Lib/ast.py | 284 ++++++++++++++++++++++++++--------------------------- 1 file changed, 137 insertions(+), 147 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index ee3f74358ee..76e0cac838b 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -26,6 +26,7 @@ """ import sys from _ast import * +from contextlib import contextmanager, nullcontext def parse(source, filename='', mode='exec', *, @@ -613,6 +614,21 @@ class _Unparser(NodeVisitor): def block(self): return self._Block(self) + @contextmanager + def delimit(self, start, end): + """A context manager for preparing the source for expressions. It adds + *start* to the buffer and enters, after exit it adds *end*.""" + + self.write(start) + yield + self.write(end) + + def delimit_if(self, start, end, condition): + if condition: + return self.delimit(start, end) + else: + return nullcontext() + def traverse(self, node): if isinstance(node, list): for item in node: @@ -636,11 +652,10 @@ class _Unparser(NodeVisitor): self.traverse(node.value) def visit_NamedExpr(self, node): - self.write("(") - self.traverse(node.target) - self.write(" := ") - self.traverse(node.value) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.target) + self.write(" := ") + self.traverse(node.value) def visit_Import(self, node): self.fill("import ") @@ -669,11 +684,8 @@ class _Unparser(NodeVisitor): def visit_AnnAssign(self, node): self.fill() - if not node.simple and isinstance(node.target, Name): - self.write("(") - self.traverse(node.target) - if not node.simple and isinstance(node.target, Name): - self.write(")") + with self.delimit_if("(", ")", not node.simple and isinstance(node.target, Name)): + self.traverse(node.target) self.write(": ") self.traverse(node.annotation) if node.value: @@ -715,28 +727,25 @@ class _Unparser(NodeVisitor): self.interleave(lambda: self.write(", "), self.write, node.names) def visit_Await(self, node): - self.write("(") - self.write("await") - if node.value: - self.write(" ") - self.traverse(node.value) - self.write(")") + with self.delimit("(", ")"): + self.write("await") + if node.value: + self.write(" ") + self.traverse(node.value) def visit_Yield(self, node): - self.write("(") - self.write("yield") - if node.value: - self.write(" ") - self.traverse(node.value) - self.write(")") + with self.delimit("(", ")"): + self.write("yield") + if node.value: + self.write(" ") + self.traverse(node.value) def visit_YieldFrom(self, node): - self.write("(") - self.write("yield from") - if node.value: - self.write(" ") - self.traverse(node.value) - self.write(")") + with self.delimit("(", ")"): + self.write("yield from") + if node.value: + self.write(" ") + self.traverse(node.value) def visit_Raise(self, node): self.fill("raise") @@ -782,21 +791,20 @@ class _Unparser(NodeVisitor): self.fill("@") self.traverse(deco) self.fill("class " + node.name) - self.write("(") - comma = False - for e in node.bases: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - for e in node.keywords: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - self.write(")") + with self.delimit("(", ")"): + comma = False + for e in node.bases: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) with self.block(): self.traverse(node.body) @@ -812,10 +820,10 @@ class _Unparser(NodeVisitor): for deco in node.decorator_list: self.fill("@") self.traverse(deco) - def_str = fill_suffix + " " + node.name + "(" + def_str = fill_suffix + " " + node.name self.fill(def_str) - self.traverse(node.args) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.args) if node.returns: self.write(" -> ") self.traverse(node.returns) @@ -931,13 +939,12 @@ class _Unparser(NodeVisitor): def visit_Constant(self, node): value = node.value if isinstance(value, tuple): - self.write("(") - if len(value) == 1: - self._write_constant(value[0]) - self.write(",") - else: - self.interleave(lambda: self.write(", "), self._write_constant, value) - self.write(")") + with self.delimit("(", ")"): + if len(value) == 1: + self._write_constant(value[0]) + self.write(",") + else: + self.interleave(lambda: self.write(", "), self._write_constant, value) elif value is ...: self.write("...") else: @@ -946,39 +953,34 @@ class _Unparser(NodeVisitor): self._write_constant(node.value) def visit_List(self, node): - self.write("[") - self.interleave(lambda: self.write(", "), self.traverse, node.elts) - self.write("]") + with self.delimit("[", "]"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) def visit_ListComp(self, node): - self.write("[") - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - self.write("]") + with self.delimit("[", "]"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) def visit_GeneratorExp(self, node): - self.write("(") - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) def visit_SetComp(self, node): - self.write("{") - self.traverse(node.elt) - for gen in node.generators: - self.traverse(gen) - self.write("}") + with self.delimit("{", "}"): + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) def visit_DictComp(self, node): - self.write("{") - self.traverse(node.key) - self.write(": ") - self.traverse(node.value) - for gen in node.generators: - self.traverse(gen) - self.write("}") + with self.delimit("{", "}"): + self.traverse(node.key) + self.write(": ") + self.traverse(node.value) + for gen in node.generators: + self.traverse(gen) def visit_comprehension(self, node): if node.is_async: @@ -993,24 +995,20 @@ class _Unparser(NodeVisitor): self.traverse(if_clause) def visit_IfExp(self, node): - self.write("(") - self.traverse(node.body) - self.write(" if ") - self.traverse(node.test) - self.write(" else ") - self.traverse(node.orelse) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.body) + self.write(" if ") + self.traverse(node.test) + self.write(" else ") + self.traverse(node.orelse) def visit_Set(self, node): if not node.elts: raise ValueError("Set node should has at least one item") - self.write("{") - self.interleave(lambda: self.write(", "), self.traverse, node.elts) - self.write("}") + with self.delimit("{", "}"): + self.interleave(lambda: self.write(", "), self.traverse, node.elts) def visit_Dict(self, node): - self.write("{") - def write_key_value_pair(k, v): self.traverse(k) self.write(": ") @@ -1026,29 +1024,27 @@ class _Unparser(NodeVisitor): else: write_key_value_pair(k, v) - self.interleave( - lambda: self.write(", "), write_item, zip(node.keys, node.values) - ) - self.write("}") + with self.delimit("{", "}"): + self.interleave( + lambda: self.write(", "), write_item, zip(node.keys, node.values) + ) def visit_Tuple(self, node): - self.write("(") - if len(node.elts) == 1: - elt = node.elts[0] - self.traverse(elt) - self.write(",") - else: - self.interleave(lambda: self.write(", "), self.traverse, node.elts) - self.write(")") + with self.delimit("(", ")"): + if len(node.elts) == 1: + elt = node.elts[0] + self.traverse(elt) + self.write(",") + else: + self.interleave(lambda: self.write(", "), self.traverse, node.elts) unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} def visit_UnaryOp(self, node): - self.write("(") - self.write(self.unop[node.op.__class__.__name__]) - self.write(" ") - self.traverse(node.operand) - self.write(")") + with self.delimit("(", ")"): + self.write(self.unop[node.op.__class__.__name__]) + self.write(" ") + self.traverse(node.operand) binop = { "Add": "+", @@ -1067,11 +1063,10 @@ class _Unparser(NodeVisitor): } def visit_BinOp(self, node): - self.write("(") - self.traverse(node.left) - self.write(" " + self.binop[node.op.__class__.__name__] + " ") - self.traverse(node.right) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.left) + self.write(" " + self.binop[node.op.__class__.__name__] + " ") + self.traverse(node.right) cmpops = { "Eq": "==", @@ -1087,20 +1082,18 @@ class _Unparser(NodeVisitor): } def visit_Compare(self, node): - self.write("(") - self.traverse(node.left) - for o, e in zip(node.ops, node.comparators): - self.write(" " + self.cmpops[o.__class__.__name__] + " ") - self.traverse(e) - self.write(")") + with self.delimit("(", ")"): + self.traverse(node.left) + for o, e in zip(node.ops, node.comparators): + self.write(" " + self.cmpops[o.__class__.__name__] + " ") + self.traverse(e) - boolops = {And: "and", Or: "or"} + boolops = {"And": "and", "Or": "or"} def visit_BoolOp(self, node): - self.write("(") - s = " %s " % self.boolops[node.op.__class__] - self.interleave(lambda: self.write(s), self.traverse, node.values) - self.write(")") + with self.delimit("(", ")"): + s = " %s " % self.boolops[node.op.__class__.__name__] + self.interleave(lambda: self.write(s), self.traverse, node.values) def visit_Attribute(self, node): self.traverse(node.value) @@ -1114,27 +1107,25 @@ class _Unparser(NodeVisitor): def visit_Call(self, node): self.traverse(node.func) - self.write("(") - comma = False - for e in node.args: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - for e in node.keywords: - if comma: - self.write(", ") - else: - comma = True - self.traverse(e) - self.write(")") + with self.delimit("(", ")"): + comma = False + for e in node.args: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) def visit_Subscript(self, node): self.traverse(node.value) - self.write("[") - self.traverse(node.slice) - self.write("]") + with self.delimit("[", "]"): + self.traverse(node.slice) def visit_Starred(self, node): self.write("*") @@ -1225,12 +1216,11 @@ class _Unparser(NodeVisitor): self.traverse(node.value) def visit_Lambda(self, node): - self.write("(") - self.write("lambda ") - self.traverse(node.args) - self.write(": ") - self.traverse(node.body) - self.write(")") + with self.delimit("(", ")"): + self.write("lambda ") + self.traverse(node.args) + self.write(": ") + self.traverse(node.body) def visit_alias(self, node): self.write(node.name) From d69cbeb99d5fd0d5464e937202cca6a2024d1bcf Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 23 Dec 2019 16:42:48 +0000 Subject: [PATCH 004/380] Revert "bpo-38870: Remove dependency on contextlib to avoid performance regression on import (GH-17376)" (GH-17687) This reverts commit ded8888fbc33011dd39b7b1c86a5adfacc4943f3. --- Lib/ast.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 76e0cac838b..62f6e075a09 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -597,22 +597,15 @@ class _Unparser(NodeVisitor): self._buffer.clear() return value - class _Block: + @contextmanager + def block(self): """A context manager for preparing the source for blocks. It adds the character':', increases the indentation on enter and decreases the indentation on exit.""" - def __init__(self, unparser): - self.unparser = unparser - - def __enter__(self): - self.unparser.write(":") - self.unparser._indent += 1 - - def __exit__(self, exc_type, exc_value, traceback): - self.unparser._indent -= 1 - - def block(self): - return self._Block(self) + self.write(":") + self._indent += 1 + yield + self._indent -= 1 @contextmanager def delimit(self, start, end): From 3c75f31bb2b88b3e3d858448e789b2c0d2e3e082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Araujo?= Date: Mon, 23 Dec 2019 12:03:30 -0500 Subject: [PATCH 005/380] Add comment to avoid ACKS losing order (GH-17678) --- Misc/ACKS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Misc/ACKS b/Misc/ACKS index de532fc9646..8ab7a6cee5a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1901,3 +1901,5 @@ Jelle Zijlstra Gennadiy Zlobin Doug Zongker Peter Åstrand + +(Entries should be added in rough alphabetical order by last names) From 025eeaa19607b2a80c979668dad405f567444573 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Tue, 24 Dec 2019 12:46:42 +0200 Subject: [PATCH 006/380] Fix import path for asyncio.TimeoutError (#17691) --- Lib/asyncio/staggered.py | 4 ++-- .../next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py index 27c665a9910..451a53a16f3 100644 --- a/Lib/asyncio/staggered.py +++ b/Lib/asyncio/staggered.py @@ -6,7 +6,7 @@ import contextlib import typing from . import events -from . import futures +from . import exceptions as exceptions_mod from . import locks from . import tasks @@ -83,7 +83,7 @@ async def staggered_race( previous_failed: typing.Optional[locks.Event]) -> None: # Wait for the previous task to finish, or for delay seconds if previous_failed is not None: - with contextlib.suppress(futures.TimeoutError): + with contextlib.suppress(exceptions_mod.TimeoutError): # Use asyncio.wait_for() instead of asyncio.wait() here, so # that if we get cancelled at this point, Event.wait() is also # cancelled, otherwise there will be a "Task destroyed but it is diff --git a/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst b/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst new file mode 100644 index 00000000000..6667697671a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst @@ -0,0 +1 @@ +Fix import path for ``asyncio.TimeoutError`` From 5c7ed7550ec2da16d7679e538fcd7c1a5631811f Mon Sep 17 00:00:00 2001 From: William Ayd Date: Tue, 24 Dec 2019 23:25:56 -0500 Subject: [PATCH 007/380] Minor C API documentation improvements. (GH-17696) The added parentheses around the PyIter_Next assignment suppress the following warning which gcc throws without: ``` warning: using the result of an assignment as a condition without parentheses [-Wparentheses] ``` The other change is a typo fix --- Doc/c-api/iter.rst | 2 +- Doc/includes/custom.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index 0224d37f1a4..a2992b3452f 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -29,7 +29,7 @@ something like this:: /* propagate error */ } - while (item = PyIter_Next(iterator)) { + while ((item = PyIter_Next(iterator))) { /* do something with item */ ... /* release reference when done */ diff --git a/Doc/includes/custom.c b/Doc/includes/custom.c index bda32e2ad81..f361baf830d 100644 --- a/Doc/includes/custom.c +++ b/Doc/includes/custom.c @@ -37,7 +37,7 @@ PyInit_custom(void) Py_INCREF(&CustomType); if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { Py_DECREF(&CustomType); - PY_DECREF(m); + Py_DECREF(m); return NULL; } From dd117c33a83ae0a7532848d3e0b8d96b098c9c46 Mon Sep 17 00:00:00 2001 From: toonarmycaptain Date: Wed, 25 Dec 2019 05:25:36 -0600 Subject: [PATCH 008/380] Update 3.9.0a2.rst - correct small typos (GH-17665) Small typo/formatting corrections. `whethen` -> `whether` `exaustion' -> `exhaustion` Assorted appending periods `.` and slight reformattings to place `Path contributed by` on the same line as description, matching the majority of document. NB Some of these might need to be backported, as I saw the first error in the [changelog for 3.8.1](https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-1) --- Misc/NEWS.d/3.9.0a2.rst | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index a418fe0ef80..074e80fbb1e 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -81,7 +81,7 @@ sys.argv to be unmodified. .. section: Core and Builtins :c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used for size -arguments in the format string, regardless of whethen ``PY_SSIZE_T_CLEAN`` +arguments in the format string, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined at include time. .. @@ -112,7 +112,7 @@ event. .. section: Core and Builtins Add audit hooks for when :func:`sys.excepthook` and -:func:`sys.unraisablehook` are invoked +:func:`sys.unraisablehook` are invoked. .. @@ -215,9 +215,7 @@ Patch by hongweipeng. .. section: Core and Builtins Provide a platform tag for AIX that is sufficient for PEP425 binary -distribution identification. - -Patch by Michael Felt +distribution identification. Patch by Michael Felt. .. @@ -300,7 +298,7 @@ parsing the header. .. nonce: IJYhz_ .. section: Library -Implement ``__class_getitem__`` for ``os.PathLike``, ``pathlib.Path`` +Implement ``__class_getitem__`` for ``os.PathLike``, ``pathlib.Path``. .. @@ -402,7 +400,7 @@ locale encoding is not UTF-8. .. nonce: WZnAPQ .. section: Library -Prevent UnboundLocalError to pop up in parse_message_id +Prevent UnboundLocalError to pop up in parse_message_id. parse_message_id() was improperly using a token defined inside an exception handler, which was raising `UnboundLocalError` on parsing an invalid value. @@ -444,7 +442,7 @@ random.choices() now raises a ValueError when all the weights are zero. .. section: Library Raise pickle.UnpicklingError when loading an item from memo for invalid -input +input. The previous code was raising a `KeyError` for both the Python and C implementation. This was caused by the specified index of an invalid input @@ -506,7 +504,7 @@ by Pablo Galindo and Batuhan Taskaya. .. nonce: AZUzL8 .. section: Library -AsyncMock now returns StopAsyncIteration on the exaustion of a side_effects +AsyncMock now returns StopAsyncIteration on the exhaustion of a side_effects iterable. Since PEP-479 its Impossible to raise a StopIteration exception from a coroutine. From 527f9de6efdcf09983d0764be0b978ddc1fd1653 Mon Sep 17 00:00:00 2001 From: cocoatomo Date: Thu, 26 Dec 2019 00:39:35 +0900 Subject: [PATCH 009/380] Fix the miscellaneous typo (GH-17700) A character "i" is omitted. --- Doc/c-api/code.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 45a6b4a753a..6f8c41ccbf6 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -42,7 +42,7 @@ bound into a function. .. c:function:: PyCodeObject* PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab) - Similar to :c:func:`PyCode_New`, but with an extra "posonlyargcount" for positonal-only arguments. + Similar to :c:func:`PyCode_New`, but with an extra "posonlyargcount" for positional-only arguments. .. versionadded:: 3.8 From e28aff54d95236ea1b64b648d89a1516e446e621 Mon Sep 17 00:00:00 2001 From: Fabio Sangiovanni <4040184+sanjioh@users.noreply.github.com> Date: Wed, 25 Dec 2019 23:45:30 +0100 Subject: [PATCH 010/380] bpo-33961: Adjusted dataclasses docs to correct exceptions raised. (GH-7917) (GH-17677) --- Doc/library/dataclasses.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index 71768abf80c..c125a1130a9 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -60,8 +60,9 @@ Module-level decorators, classes, and functions The :func:`dataclass` decorator will add various "dunder" methods to the class, described below. If any of the added methods already - exist on the class, a :exc:`TypeError` will be raised. The decorator - returns the same class that is called on: no new class is created. + exist on the class, the behavior depends on the parameter, as documented + below. The decorator returns the same class that is called on; no new + class is created. If :func:`dataclass` is used just as a simple decorator with no parameters, it acts as if it has the default values documented in this @@ -115,7 +116,7 @@ Module-level decorators, classes, and functions If the class already defines any of :meth:`__lt__`, :meth:`__le__`, :meth:`__gt__`, or :meth:`__ge__`, then - :exc:`ValueError` is raised. + :exc:`TypeError` is raised. - ``unsafe_hash``: If ``False`` (the default), a :meth:`__hash__` method is generated according to how ``eq`` and ``frozen`` are set. From 03c8e5d46673e4704c8dc955d52735966ffdc2a4 Mon Sep 17 00:00:00 2001 From: Aurora Lanes <58722611+opensource-assist@users.noreply.github.com> Date: Thu, 26 Dec 2019 14:22:13 +0000 Subject: [PATCH 011/380] Update 3.9.0a2.rst (GH-17703) Fixed small grammatical issue Automerge-Triggered-By: @Mariatta --- 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 074e80fbb1e..1919ccb5604 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -257,7 +257,7 @@ Fix :exc:`NameError` in :mod:`zipimport`. Patch by Karthikeyan Singaravelan. .. nonce: QDtIxI .. section: Library -Update importliib.metadata to include improvements from importlib_metadata +Update importlib.metadata to include improvements from importlib_metadata 1.3 including better serialization of EntryPoints and improved documentation for custom finders. From f460eea5c5cd555dfdc29558cb990addc5bd35aa Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 26 Dec 2019 21:56:40 +0000 Subject: [PATCH 012/380] Update what's new with the latest GC improvements (GH-17708) --- Doc/whatsnew/3.9.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 64361bb17f8..b315604af51 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -159,6 +159,14 @@ Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK` and :data:`~fcntl.F_OFD_SETLKW`. (Contributed by Dong-hee Na in :issue:`38602`.) +gc +-- + +When the garbage collector makes a collection in which some objects resurrect +(they are reachable from outside the isolated cycles after the finalizers have +been executed), do not block the collection of all objects that are still +unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) + os -- From c0052f3fe3d19820b2d4f76e383035439affe32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Fri, 27 Dec 2019 05:51:34 +0300 Subject: [PATCH 013/380] closes bpo-30364: Replace deprecated no_address_safety_analysis attribute. (GH-17702) --- Objects/obmalloc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 722e91e3db4..3881ff17e06 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -31,8 +31,8 @@ static void _PyMem_SetupDebugHooksDomain(PyMemAllocatorDomain domain); #if defined(__has_feature) /* Clang */ # if __has_feature(address_sanitizer) /* is ASAN enabled? */ -# define _Py_NO_ADDRESS_SAFETY_ANALYSIS \ - __attribute__((no_address_safety_analysis)) +# define _Py_NO_SANITIZE_ADDRESS \ + __attribute__((no_sanitize("address"))) # endif # if __has_feature(thread_sanitizer) /* is TSAN enabled? */ # define _Py_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread)) @@ -42,8 +42,8 @@ static void _PyMem_SetupDebugHooksDomain(PyMemAllocatorDomain domain); # endif #elif defined(__GNUC__) # if defined(__SANITIZE_ADDRESS__) /* GCC 4.8+, is ASAN enabled? */ -# define _Py_NO_ADDRESS_SAFETY_ANALYSIS \ - __attribute__((no_address_safety_analysis)) +# define _Py_NO_SANITIZE_ADDRESS \ + __attribute__((no_sanitize_address)) # endif // TSAN is supported since GCC 5.1, but __SANITIZE_THREAD__ macro // is provided only since GCC 7. @@ -52,8 +52,8 @@ static void _PyMem_SetupDebugHooksDomain(PyMemAllocatorDomain domain); # endif #endif -#ifndef _Py_NO_ADDRESS_SAFETY_ANALYSIS -# define _Py_NO_ADDRESS_SAFETY_ANALYSIS +#ifndef _Py_NO_SANITIZE_ADDRESS +# define _Py_NO_SANITIZE_ADDRESS #endif #ifndef _Py_NO_SANITIZE_THREAD # define _Py_NO_SANITIZE_THREAD @@ -1407,7 +1407,7 @@ obmalloc controls. Since this test is needed at every entry point, it's extremely desirable that it be this fast. */ -static bool _Py_NO_ADDRESS_SAFETY_ANALYSIS +static bool _Py_NO_SANITIZE_ADDRESS _Py_NO_SANITIZE_THREAD _Py_NO_SANITIZE_MEMORY address_in_range(void *p, poolp pool) From 91874bb07161bb481b6f5ea18ffafe69cb8cac30 Mon Sep 17 00:00:00 2001 From: Michael Wayne Goodman Date: Fri, 27 Dec 2019 11:01:08 +0800 Subject: [PATCH 014/380] closes bpo-39135: Remove 'time.clock()' mention in docs. (GH17709) `time.clock()` was removed in Python 3.8, but it was still mentioned in the documentation for when `time.get_clock_info()` is given the argument `'clock'`. This commit removes that mention. --- Doc/library/time.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index e628ac44e80..6842e9075e1 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -218,7 +218,6 @@ Functions Supported clock names and the corresponding functions to read their value are: - * ``'clock'``: :func:`time.clock` * ``'monotonic'``: :func:`time.monotonic` * ``'perf_counter'``: :func:`time.perf_counter` * ``'process_time'``: :func:`time.process_time` From 90913985b62845a58f6b9e815121bcf614bd107f Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 27 Dec 2019 21:55:56 +0000 Subject: [PATCH 015/380] Move comment about permanent generation to gcmodule.c (GH-17718) The comment about the collection rules for the permanent generation was incorrectly referenced by a comment in gcmodule.c (the comment has been moved long ago into a header file). Moving the comment into the relevant code helps with readability and avoids broken references. --- Include/internal/pycore_pymem.h | 36 --------------------------------- Modules/gcmodule.c | 36 +++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index a4e97206834..06d0d06c75c 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -16,42 +16,6 @@ extern "C" { /* If we change this, we need to change the default value in the signature of gc.collect. */ #define NUM_GENERATIONS 3 - -/* - NOTE: about the counting of long-lived objects. - - To limit the cost of garbage collection, there are two strategies; - - make each collection faster, e.g. by scanning fewer objects - - do less collections - This heuristic is about the latter strategy. - - In addition to the various configurable thresholds, we only trigger a - full collection if the ratio - long_lived_pending / long_lived_total - is above a given value (hardwired to 25%). - - The reason is that, while "non-full" collections (i.e., collections of - the young and middle generations) will always examine roughly the same - number of objects -- determined by the aforementioned thresholds --, - the cost of a full collection is proportional to the total number of - long-lived objects, which is virtually unbounded. - - Indeed, it has been remarked that doing a full collection every - of object creations entails a dramatic performance - degradation in workloads which consist in creating and storing lots of - long-lived objects (e.g. building a large list of GC-tracked objects would - show quadratic performance, instead of linear as expected: see issue #4074). - - Using the above ratio, instead, yields amortized linear performance in - the total number of objects (the effect of which can be summarized - thusly: "each full garbage collection is more and more costly as the - number of objects grows, but we do fewer and fewer of them"). - - This heuristic was suggested by Martin von Löwis on python-dev in - June 2008. His original analysis and proposal can be found at: - http://mail.python.org/pipermail/python-dev/2008-June/080579.html -*/ - /* NOTE: about untracking of mutable objects. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 64afe831c84..b11ae842e22 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1381,8 +1381,40 @@ collect_generations(PyThreadState *tstate) for (int i = NUM_GENERATIONS-1; i >= 0; i--) { if (gcstate->generations[i].count > gcstate->generations[i].threshold) { /* Avoid quadratic performance degradation in number - of tracked objects. See comments at the beginning - of this file, and issue #4074. + of tracked objects (see also issue #4074): + + To limit the cost of garbage collection, there are two strategies; + - make each collection faster, e.g. by scanning fewer objects + - do less collections + This heuristic is about the latter strategy. + + In addition to the various configurable thresholds, we only trigger a + full collection if the ratio + + long_lived_pending / long_lived_total + + is above a given value (hardwired to 25%). + + The reason is that, while "non-full" collections (i.e., collections of + the young and middle generations) will always examine roughly the same + number of objects -- determined by the aforementioned thresholds --, + the cost of a full collection is proportional to the total number of + long-lived objects, which is virtually unbounded. + + Indeed, it has been remarked that doing a full collection every + of object creations entails a dramatic performance + degradation in workloads which consist in creating and storing lots of + long-lived objects (e.g. building a large list of GC-tracked objects would + show quadratic performance, instead of linear as expected: see issue #4074). + + Using the above ratio, instead, yields amortized linear performance in + the total number of objects (the effect of which can be summarized + thusly: "each full garbage collection is more and more costly as the + number of objects grows, but we do fewer and fewer of them"). + + This heuristic was suggested by Martin von Löwis on python-dev in + June 2008. His original analysis and proposal can be found at: + http://mail.python.org/pipermail/python-dev/2008-June/080579.html */ if (i == NUM_GENERATIONS - 1 && gcstate->long_lived_pending < gcstate->long_lived_total / 4) From ef7eaafc9d2e370cf79b3674e56f643bbfe239e2 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Sat, 28 Dec 2019 13:32:48 +1100 Subject: [PATCH 016/380] bpo-39144 Align ctags and etags behaviours in the makefile and include Python stdlib files (GH-17721) --- Makefile.pre.in | 3 +++ .../NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst | 1 + 2 files changed, 4 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst diff --git a/Makefile.pre.in b/Makefile.pre.in index d08c78df394..cfe42b4f21e 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1730,6 +1730,7 @@ tags:: ctags -w $(srcdir)/Include/*.h $(srcdir)/Include/cpython/*.h $(srcdir)/Include/internal/*.h for i in $(SRCDIRS); do ctags -f tags -w -a $(srcdir)/$$i/*.[ch]; done ctags -f tags -w -a $(srcdir)/Modules/_ctypes/*.[ch] + find $(srcdir)/Lib -type f -name "*.py" -not -name "test_*.py" -not -path "*/test/*" -not -path "*/tests/*" -not -path "*/*_test/*" | ctags -f tags -w -a -L - LC_ALL=C sort -o tags tags # Create a tags file for GNU Emacs @@ -1737,6 +1738,8 @@ TAGS:: cd $(srcdir); \ etags Include/*.h Include/cpython/*.h Include/internal/*.h; \ for i in $(SRCDIRS); do etags -a $$i/*.[ch]; done + etags -a $(srcdir)/Modules/_ctypes/*.[ch] + find $(srcdir)/Lib -type f -name "*.py" -not -name "test_*.py" -not -path "*/test/*" -not -path "*/tests/*" -not -path "*/*_test/*" | etags - -a # Sanitation targets -- clean leaves libraries, executables and tags # files, which clobber removes as well diff --git a/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst b/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst new file mode 100644 index 00000000000..8b90da19622 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst @@ -0,0 +1 @@ +The ctags and etags build targets both include Modules/_ctypes and Python standard library source files. \ No newline at end of file From 98f0f04b5016e63561d313a3446b7b58f2c12611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sat, 28 Dec 2019 05:53:03 +0300 Subject: [PATCH 017/380] bpo-38731: Fix function signature of quiet in docs (GH-17719) --- 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 3824353abda..a12a5bb0b1a 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -27,7 +27,7 @@ byte-code cache files in the directory containing the source code. Exception raised when an error occurs while attempting to compile the file. -.. function:: compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP) +.. function:: compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0) Compile a source file to byte-code and write out the byte-code cache file. The source code is loaded from the file named *file*. The byte-code is From 6c7bb38ff2799ac218e6df598b2b262f89e2bc1e Mon Sep 17 00:00:00 2001 From: Gurupad Hegde Date: Sat, 28 Dec 2019 17:16:02 -0500 Subject: [PATCH 018/380] bpo-39136: Fixed typos (GH-17720) funtion -> function; configuraton -> configuration; defintitions -> definitions; focusses -> focuses; necesarily -> necessarily; follwing -> following; Excape -> Escape, --- Doc/c-api/init.rst | 2 +- Doc/c-api/init_config.rst | 2 +- Doc/c-api/structures.rst | 2 +- Doc/faq/programming.rst | 2 +- Doc/library/ast.rst | 2 +- Doc/library/test.rst | 2 +- Lib/idlelib/NEWS.txt | 2 +- Lib/tkinter/tix.py | 4 ++-- Misc/NEWS.d/3.9.0a2.rst | 6 +++--- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 86bf7f9eec6..38879373829 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1189,7 +1189,7 @@ It is usually the only Python interpreter in a process. Unlike sub-interpreters the main interpreter has unique process-global responsibilities like signal handling. It is also responsible for execution during runtime initialization and is usually the active interpreter during runtime finalization. The -:c:func:`PyInterpreterState_Main` funtion returns a pointer to its state. +:c:func:`PyInterpreterState_Main` function returns a pointer to its state. You can switch between sub-interpreters using the :c:func:`PyThreadState_Swap` function. You can create and destroy them using the following functions: diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 6b16b5bb728..79a8815ed41 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -757,7 +757,7 @@ configuration, and then override some parameters:: PyConfig config; PyConfig_InitPythonConfig(&config); - /* Set the program name before reading the configuraton + /* Set the program name before reading the configuration (decode byte string from the locale encoding). Implicitly preinitialize Python. */ diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 1bd769f275b..0c661389021 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -350,7 +350,7 @@ Accessing attributes of extension types .. _pymemberdef-offsets: Heap allocated types (created using :c:func:`PyType_FromSpec` or similar), - ``PyMemberDef`` may contain defintitions for the special members + ``PyMemberDef`` may contain definitions for the special members ``__dictoffset__`` and ``__weaklistoffset__``, corresponding to :c:member:`~PyTypeObject.tp_dictoffset` and :c:member:`~PyTypeObject.tp_weaklistoffset` in type objects. diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index 9d45765abaa..70b11d6e930 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1019,7 +1019,7 @@ That's a tough one, in general. First, here are a list of things to remember before diving further: * Performance characteristics vary across Python implementations. This FAQ - focusses on :term:`CPython`. + focuses on :term:`CPython`. * Behaviour can vary across operating systems, especially when talking about I/O or multi-threading. * You should always find the hot spots in your program *before* attempting to diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index baf563f5d78..190d9286eff 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -168,7 +168,7 @@ and classes for traversing abstract syntax trees: back with :func:`ast.parse`. .. warning:: - The produced code string will not necesarily be equal to the original + The produced code string will not necessarily be equal to the original code that generated the :class:`ast.AST` object. .. versionadded:: 3.9 diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 73b3fe5cf06..54ad620d7da 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -1577,7 +1577,7 @@ script execution tests. The :mod:`test.support.bytecode_helper` module provides support for testing and inspecting bytecode generation. -The module defines the follwing class: +The module defines the following class: .. class:: BytecodeTestCase(unittest.TestCase) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 304cf6375f7..cbf55d9adef 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -6,7 +6,7 @@ Released on 2020-10-05? bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. -bpo-38944: Excape key now closes IDLE completion windows. Patch by +bpo-38944: Escape key now closes IDLE completion windows. Patch by Johnny Najera. bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py index d9c097a77cd..ac545502e45 100644 --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -1890,7 +1890,7 @@ class Grid(TixWidget, XView, YView): containing the current size setting of the given column. When option-value pairs are given, the corresponding options of the size setting of the given column are changed. Options may be one - of the follwing: + of the following: pad0 pixels Specifies the paddings to the left of a column. pad1 pixels @@ -1915,7 +1915,7 @@ class Grid(TixWidget, XView, YView): When no option-value pair is given, this command returns a list con- taining the current size setting of the given row . When option-value pairs are given, the corresponding options of the size setting of the - given row are changed. Options may be one of the follwing: + given row are changed. Options may be one of the following: pad0 pixels Specifies the paddings to the top of a row. pad1 pixels diff --git a/Misc/NEWS.d/3.9.0a2.rst b/Misc/NEWS.d/3.9.0a2.rst index 1919ccb5604..60d0ea5a99b 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -69,7 +69,7 @@ the "elif" keyword and not to its condition, making it consistent with the .. nonce: 8OyT5P .. section: Core and Builtins -In Python 3.9.0a1, sys.argv[0] was made an asolute path if a filename was +In Python 3.9.0a1, sys.argv[0] was made an absolute path if a filename was specified on the command line. Revert this change, since most users expect sys.argv to be unmodified. @@ -516,7 +516,7 @@ from a coroutine. .. section: Library AsyncMock fix for return values that are awaitable types. This also covers -side_effect iterable values that happend to be awaitable, and wraps +side_effect iterable values that happened to be awaitable, and wraps callables that return an awaitable type. Before these awaitables were being awaited instead of being returned as is. @@ -893,7 +893,7 @@ previous `import posix`. Patch by Benoît Hudson. .. nonce: _3xjKG .. section: IDLE -Excape key now closes IDLE completion windows. Patch by Johnny Najera. +Escape key now closes IDLE completion windows. Patch by Johnny Najera. .. From cbd0408b54c8f9512bfeace2aaf9da064053e86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oleg=20H=C3=B6fling?= Date: Sun, 29 Dec 2019 18:26:35 +0100 Subject: [PATCH 019/380] links in importlib.metadata.rst replaced with sphinx references (GH-17730) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The importlib.metadata documentation uses hardcoded links to internal pages. This results in minor rendering issues. This change replaces the hardcoded links with suitable Sphinx roles. Signed-off-by: Oleg Höfling --- Doc/library/importlib.metadata.rst | 39 ++++++++++++------------------ Doc/reference/import.rst | 2 ++ Misc/ACKS | 1 + 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index dc6b66ca384..15e58b860d9 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -1,8 +1,8 @@ .. _using: -========================== - Using importlib.metadata -========================== +================================= + Using :mod:`!importlib.metadata` +================================= .. note:: This functionality is provisional and may deviate from the usual @@ -12,8 +12,8 @@ package metadata. Built in part on Python's import system, this library intends to replace similar functionality in the `entry point API`_ and `metadata API`_ of ``pkg_resources``. Along with -``importlib.resources`` in `Python 3.7 -and newer`_ (backported as `importlib_resources`_ for older versions of +:mod:`importlib.resources` in Python 3.7 +and newer (backported as `importlib_resources`_ for older versions of Python), this can eliminate the need to use the older and less efficient ``pkg_resources`` package. @@ -21,9 +21,9 @@ By "installed package" we generally mean a third-party package installed into Python's ``site-packages`` directory via tools such as `pip `_. Specifically, it means a package with either a discoverable ``dist-info`` or ``egg-info`` -directory, and metadata defined by `PEP 566`_ or its older specifications. +directory, and metadata defined by :pep:`566` or its older specifications. By default, package metadata can live on the file system or in zip archives on -``sys.path``. Through an extension mechanism, the metadata can live almost +:data:`sys.path`. Through an extension mechanism, the metadata can live almost anywhere. @@ -134,7 +134,7 @@ Distribution files You can also get the full set of files contained within a distribution. The ``files()`` function takes a distribution package name and returns all of the files installed by this distribution. Each file object returned is a -``PackagePath``, a `pathlib.Path`_ derived object with additional ``dist``, +``PackagePath``, a :class:`pathlib.Path` derived object with additional ``dist``, ``size``, and ``hash`` properties as indicated by the metadata. For example:: >>> util = [p for p in files('wheel') if 'util.py' in str(p)][0] # doctest: +SKIP @@ -203,18 +203,18 @@ instance:: >>> d.metadata['License'] # doctest: +SKIP 'MIT' -The full set of available metadata is not described here. See `PEP 566 -`_ for additional details. +The full set of available metadata is not described here. See :pep:`566` +for additional details. Extending the search algorithm ============================== -Because package metadata is not available through ``sys.path`` searches, or +Because package metadata is not available through :data:`sys.path` searches, or package loaders directly, the metadata for a package is found through import -system `finders`_. To find a distribution package's metadata, -``importlib.metadata`` queries the list of `meta path finders`_ on -`sys.meta_path`_. +system :ref:`finders `. To find a distribution package's metadata, +``importlib.metadata`` queries the list of :term:`meta path finders ` on +:data:`sys.meta_path`. The default ``PathFinder`` for Python includes a hook that calls into ``importlib.metadata.MetadataPathFinder`` for finding distributions @@ -224,7 +224,7 @@ The abstract class :py:class:`importlib.abc.MetaPathFinder` defines the interface expected of finders by Python's import system. ``importlib.metadata`` extends this protocol by looking for an optional ``find_distributions`` callable on the finders from -``sys.meta_path`` and presents this extended interface as the +:data:`sys.meta_path` and presents this extended interface as the ``DistributionFinder`` abstract base class, which defines this abstract method:: @@ -247,20 +247,13 @@ a custom finder, return instances of this derived ``Distribution`` in the .. _`entry point API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points .. _`metadata API`: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api -.. _`Python 3.7 and newer`: https://docs.python.org/3/library/importlib.html#module-importlib.resources .. _`importlib_resources`: https://importlib-resources.readthedocs.io/en/latest/index.html -.. _`PEP 566`: https://www.python.org/dev/peps/pep-0566/ -.. _`finders`: https://docs.python.org/3/reference/import.html#finders-and-loaders -.. _`meta path finders`: https://docs.python.org/3/glossary.html#term-meta-path-finder -.. _`sys.meta_path`: https://docs.python.org/3/library/sys.html#sys.meta_path -.. _`pathlib.Path`: https://docs.python.org/3/library/pathlib.html#pathlib.Path .. rubric:: Footnotes .. [#f1] Technically, the returned distribution metadata object is an - `email.message.Message - `_ + :class:`email.message.EmailMessage` instance, but this is an implementation detail, and not part of the stable API. You should only use dictionary-like methods and syntax to access the metadata contents. diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index c95826305b6..20a2ea69e2d 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -202,6 +202,8 @@ named module, the two module objects will *not* be the same. By contrast, reinitialise the module contents by rerunning the module's code. +.. _finders-and-loaders: + Finders and loaders ------------------- diff --git a/Misc/ACKS b/Misc/ACKS index 8ab7a6cee5a..5ecbac13e0b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -751,6 +751,7 @@ Ludwig Hähne Gerhard Häring Fredrik Håård Florian Höch +Oleg Höfling Robert Hölzl Catalin Iacob Mihai Ibanescu From 23a226bf3ae7b462084e899d007d12d9fe398ac5 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 29 Dec 2019 19:20:55 +0000 Subject: [PATCH 020/380] bpo-38870: Run always tests that heavily use grammar features in test_unparse (GH-17738) --- Lib/test/test_unparse.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 45d819f175b..3e796860cbc 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -285,6 +285,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"} _files_to_test = None @@ -301,9 +303,17 @@ class DirectoryTestCase(ASTTestCase): if not item.name.startswith("bad") ] + tests_to_run_always = {item for item in items if + item.name in cls.run_always_files} + # Test limited subset of files unless the 'cpu' resource is specified. if not test.support.is_resource_enabled("cpu"): - items = random.sample(items, 10) + items = set(random.sample(items, 10)) + + # Make sure that at least tests that heavily use grammar features are + # considered to reduce the change of missing something. + + items = list(items | tests_to_run_always) # bpo-31174: Store the names sample to always test the same files. # It prevents false alarms when hunting reference leaks. From be287c319124b7eb59ef32b69cf837ae3e99acab Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 29 Dec 2019 20:18:36 +0000 Subject: [PATCH 021/380] Fix error when running with -uall in test_unparse (GH-17739) --- Lib/test/test_unparse.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 3e796860cbc..49767dbac16 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -303,17 +303,17 @@ class DirectoryTestCase(ASTTestCase): if not item.name.startswith("bad") ] - tests_to_run_always = {item for item in items if - item.name in cls.run_always_files} - # Test limited subset of files unless the 'cpu' resource is specified. if not test.support.is_resource_enabled("cpu"): + + tests_to_run_always = {item for item in items if + item.name in cls.run_always_files} + items = set(random.sample(items, 10)) - # Make sure that at least tests that heavily use grammar features are - # considered to reduce the change of missing something. - - items = list(items | tests_to_run_always) + # Make sure that at least tests that heavily use grammar features are + # always considered in order to reduce the chance of missing something. + items = list(items | tests_to_run_always) # bpo-31174: Store the names sample to always test the same files. # It prevents false alarms when hunting reference leaks. From 8f0703ff92ed2d9ccd52d7e083c7bc26e732a428 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 29 Dec 2019 21:35:54 +0000 Subject: [PATCH 022/380] bpo-39157: Skip test_pidfd_send_signal if the system does not have enough privileges to use pidfd (GH-17740) --- Lib/test/test_signal.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 5c02c28a90e..5b072b0c60e 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -1284,6 +1284,8 @@ class PidfdSignalTest(unittest.TestCase): signal.pidfd_send_signal(0, signal.SIGINT) if cm.exception.errno == errno.ENOSYS: self.skipTest("kernel does not support pidfds") + elif cm.exception.errno == errno.EPERM: + self.skipTest("Not enough privileges to use pidfs") self.assertEqual(cm.exception.errno, errno.EBADF) my_pidfd = os.open(f'/proc/{os.getpid()}', os.O_DIRECTORY) self.addCleanup(os.close, my_pidfd) From 32a12aed6da41f49a5ca05e6de34f5f93ea1dc33 Mon Sep 17 00:00:00 2001 From: Antoine <43954001+awecx@users.noreply.github.com> Date: Sun, 29 Dec 2019 23:14:22 +0100 Subject: [PATCH 023/380] Fix typos and remove deprecated deprecation warning. (GH-17741) --- Doc/library/ctypes.rst | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index e0bc28f5e50..2d6c6d0a1c3 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -161,13 +161,6 @@ as the ``NULL`` pointer):: 0x1d000000 >>> -.. note:: - - :mod:`ctypes` may raise a :exc:`ValueError` after calling the function, if - it detects that an invalid number of arguments were passed. This behavior - should not be relied upon. It is deprecated in 3.6.2, and will be removed - in 3.7. - :exc:`ValueError` is raised when you call an ``stdcall`` function with the ``cdecl`` calling convention, or vice versa:: @@ -624,7 +617,7 @@ Structure/union alignment and byte order ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, Structure and Union fields are aligned in the same way the C -compiler does it. It is possible to override this behavior be specifying a +compiler does it. It is possible to override this behavior by specifying a :attr:`_pack_` class attribute in the subclass definition. This must be set to a positive integer and specifies the maximum alignment for the fields. This is what ``#pragma pack(n)`` also does in MSVC. @@ -922,7 +915,7 @@ attribute later, after the class statement:: ... ("next", POINTER(cell))] >>> -Lets try it. We create two instances of ``cell``, and let them point to each +Let's try it. We create two instances of ``cell``, and let them point to each other, and finally follow the pointer chain a few times:: >>> c1 = cell() @@ -1125,8 +1118,8 @@ hit the ``NULL`` entry:: >>> The fact that standard Python has a frozen module and a frozen package -(indicated by the negative size member) is not well known, it is only used for -testing. Try it out with ``import __hello__`` for example. +(indicated by the negative ``size`` member) is not well known, it is only used +for testing. Try it out with ``import __hello__`` for example. .. _ctypes-surprises: From 226e6e7d4326cf91ef37e13528eb1f62de1bb832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Ogam?= Date: Mon, 30 Dec 2019 05:24:51 +0000 Subject: [PATCH 024/380] bpo-39037: Fix lookup order of magic methods in with statement documentation (GH-17608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * __enter__ is now looked up before __exit__ to give a more intuitive error message * add pseudo-code equivalent for the with statement * fix pseudo-code for the async with statement to use a finally clause * use SUITE rather than BLOCK for consistency with the language grammar Patch by Géry Ogam. --- Doc/reference/compound_stmts.rst | 67 +++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 988eec6d254..564d6cc4213 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -399,6 +399,8 @@ The execution of the :keyword:`with` statement with one "item" proceeds as follo #. The context expression (the expression given in the :token:`with_item`) is evaluated to obtain a context manager. +#. The context manager's :meth:`__enter__` is loaded for later use. + #. The context manager's :meth:`__exit__` is loaded for later use. #. The context manager's :meth:`__enter__` method is invoked. @@ -430,17 +432,41 @@ The execution of the :keyword:`with` statement with one "item" proceeds as follo value from :meth:`__exit__` is ignored, and execution proceeds at the normal location for the kind of exit that was taken. +The following code:: + + with EXPRESSION as TARGET: + SUITE + +is semantically equivalent to:: + + manager = (EXPRESSION) + enter = type(manager).__enter__ + exit = type(manager).__exit__ + value = enter(manager) + hit_except = False + + try: + TARGET = value + SUITE + except: + hit_except = True + if not exit(manager, *sys.exc_info()): + raise + finally: + if not hit_except: + exit(manager, None, None, None) + With more than one item, the context managers are processed as if multiple :keyword:`with` statements were nested:: with A() as a, B() as b: - suite + SUITE -is equivalent to :: +is semantically equivalent to:: with A() as a: with B() as b: - suite + SUITE .. versionchanged:: 3.1 Support for multiple context expressions. @@ -772,24 +798,25 @@ iterators. The following code:: async for TARGET in ITER: - BLOCK + SUITE else: - BLOCK2 + SUITE2 Is semantically equivalent to:: iter = (ITER) iter = type(iter).__aiter__(iter) running = True + while running: try: TARGET = await type(iter).__anext__(iter) except StopAsyncIteration: running = False else: - BLOCK + SUITE else: - BLOCK2 + SUITE2 See also :meth:`__aiter__` and :meth:`__anext__` for details. @@ -811,23 +838,27 @@ able to suspend execution in its *enter* and *exit* methods. The following code:: - async with EXPR as VAR: - BLOCK + async with EXPRESSION as TARGET: + SUITE -Is semantically equivalent to:: +is semantically equivalent to:: - mgr = (EXPR) - aexit = type(mgr).__aexit__ - aenter = type(mgr).__aenter__(mgr) + manager = (EXPRESSION) + aexit = type(manager).__aexit__ + aenter = type(manager).__aenter__ + value = await aenter(manager) + hit_except = False - VAR = await aenter try: - BLOCK + TARGET = value + SUITE except: - if not await aexit(mgr, *sys.exc_info()): + hit_except = True + if not await aexit(manager, *sys.exc_info()): raise - else: - await aexit(mgr, None, None, None) + finally: + if not hit_except: + await aexit(manager, None, None, None) See also :meth:`__aenter__` and :meth:`__aexit__` for details. From 88dce26da6bc4838092128d9a6f1c98bf48b7c90 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 30 Dec 2019 09:53:36 +0000 Subject: [PATCH 025/380] Fix handling of line numbers around finally-blocks. (#17737) --- Lib/test/test_dis.py | 66 + Python/compile.c | 4 + Python/importlib.h | 3250 +++++++++++++++++++++--------------------- 3 files changed, 1695 insertions(+), 1625 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 5c1595268c5..313eefd9b88 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -333,6 +333,68 @@ dis_fstring = """\ 28 RETURN_VALUE """ % (_fstring.__code__.co_firstlineno + 1,) +def _tryfinally(a, b): + try: + return a + finally: + b() + +def _tryfinallyconst(b): + try: + return 1 + finally: + b() + +dis_tryfinally = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 LOAD_FAST 0 (a) + 4 POP_BLOCK + +%3d 6 LOAD_FAST 1 (b) + 8 CALL_FUNCTION 0 + 10 POP_TOP + +%3d 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 1 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_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, + ) + +dis_tryfinallyconst = """\ +%3d 0 SETUP_FINALLY 12 (to 14) + +%3d 2 POP_BLOCK + +%3d 4 LOAD_FAST 0 (b) + 6 CALL_FUNCTION 0 + 8 POP_TOP + +%3d 10 LOAD_CONST 1 (1) + 12 RETURN_VALUE + +%3d >> 14 LOAD_FAST 0 (b) + 16 CALL_FUNCTION 0 + 18 POP_TOP + 20 RERAISE + 22 LOAD_CONST 0 (None) + 24 RETURN_VALUE +""" % (_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, + ) + def _g(x): yield x @@ -563,6 +625,10 @@ class DisTests(unittest.TestCase): def test_disassemble_fstring(self): self.do_disassembly_test(_fstring, dis_fstring) + def test_disassemble_try_finally(self): + self.do_disassembly_test(_tryfinally, dis_tryfinally) + self.do_disassembly_test(_tryfinallyconst, dis_tryfinallyconst) + def test_dis_none(self): try: del sys.last_traceback diff --git a/Python/compile.c b/Python/compile.c index 98a4afa168c..ce6f18a1f57 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1686,7 +1686,11 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, return 0; } } + /* Emit the finally block, restoring the line number when done */ + int saved_lineno = c->u->u_lineno; VISIT_SEQ(c, stmt, info->fb_datum); + c->u->u_lineno = saved_lineno; + c->u->u_lineno_set = 0; if (preserve_tos) { compiler_pop_fblock(c, POP_VALUE, NULL); } diff --git a/Python/importlib.h b/Python/importlib.h index d837bdd9d4c..dea619e29d7 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -168,1637 +168,1637 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 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,35,0,0,0,114,10, 0,0,0,114,10,0,0,0,114,11,0,0,0,114,38,0, - 0,0,78,0,0,0,115,38,0,0,0,0,6,8,1,8, - 1,2,2,8,1,20,1,6,1,14,1,14,9,6,247,2, - 9,2,248,8,1,12,1,12,1,44,2,10,1,14,2,8, - 0,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,37,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,39,0,0,0,114,40,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,39,0,0, - 0,103,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,116,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,36,0,0,0,114,38,0,0,0,114,39,0,0,0, - 114,47,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,12,8, - 25,8,13,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,124,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,37,0,0,0,84,41,1,114,27,0, - 0,0,114,46,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,38,0,0,0,128,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,41,0,0, - 0,114,37,0,0,0,41,2,114,27,0,0,0,114,42,0, - 0,0,114,46,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,39,0,0,0,132,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,43,0,0,0,114,46,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,47, - 0,0,0,137,0,0,0,115,2,0,0,0,0,1,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,38,0,0,0,114,39,0,0,0,114, - 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,48,0,0,0,120,0,0, - 0,115,10,0,0,0,8,1,4,3,8,4,8,4,8,5, - 114,48,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,143,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,50,0,0,0,114,51,0,0,0,114,38, - 0,0,0,114,46,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,147,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,51,0,0,0,114,39,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,151,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,53,0,0,0,114,55,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,49,0,0,0,141,0,0,0,115,6, - 0,0,0,8,2,8,4,8,4,114,49,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,138,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,24,4,0,116,3,107,10,114,48,1,0, - 1,0,1,0,100,1,125,1,89,0,110,2,48,0,124,1, - 100,1,107,8,114,112,116,4,100,1,107,8,114,76,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,107,8,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,34,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,176,0,0,0,115,12,0,0, - 0,0,1,8,1,2,4,14,1,8,2,10,0,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,56,0, - 0,0,114,57,0,0,0,114,58,0,0,0,218,8,75,101, - 121,69,114,114,111,114,114,23,0,0,0,114,48,0,0,0, - 114,20,0,0,0,218,8,95,119,101,97,107,114,101,102,114, - 60,0,0,0,114,59,0,0,0,41,3,114,17,0,0,0, - 114,24,0,0,0,114,61,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,52,0,0,0,157,0, - 0,0,115,30,0,0,0,0,6,8,1,2,1,2,1,14, - 1,14,1,10,2,8,1,8,1,10,2,8,2,12,11,18, - 2,10,0,10,2,114,52,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,107,10,114,40,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,52,0,0,0,114,38,0,0,0,114,19,0,0, - 0,114,39,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,194,0,0,0,115,12,0,0,0,0, - 6,8,1,2,1,12,1,14,3,6,2,114,64,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,3,0,0,0,79,0,0,0,115,10,0,0,0,124,0, - 124,1,124,2,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,54,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,211,0,0,0, - 115,2,0,0,0,0,8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115, - 116,100,101,114,114,41,3,218,7,109,101,115,115,97,103,101, - 114,67,0,0,0,114,54,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,222,0,0,0,115, - 8,0,0,0,0,2,12,1,10,1,8,1,114,75,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,107,7,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,44,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,232,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,82,0,0,0,114,83,0,0, - 0,114,10,0,0,0,114,81,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,230,0,0,0,115,6,0,0,0,0,2,12,5, - 10,1,114,85,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,56,0, - 0,0,218,9,105,115,95,102,114,111,122,101,110,114,78,0, - 0,0,114,44,0,0,0,114,79,0,0,0,114,81,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,243,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,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,84,0,0, - 0,41,2,114,82,0,0,0,114,88,0,0,0,114,10,0, - 0,0,114,81,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,241,0, - 0,0,115,6,0,0,0,0,2,12,5,10,1,114,89,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,62,0,0,0, - 116,0,124,1,124,0,131,2,125,2,124,1,116,1,106,2, - 107,6,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,100,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,80,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,253, - 0,0,0,115,12,0,0,0,0,6,10,1,10,1,10,1, - 10,1,10,2,114,96,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,226,0,0,0,116,0,124,0,100,1,100,0,131, - 3,125,1,116,1,124,1,100,2,131,2,114,56,122,12,124, - 1,160,2,124,0,161,1,87,0,83,0,4,0,116,3,107, - 10,114,54,1,0,1,0,1,0,89,0,110,2,48,0,122, - 10,124,0,106,4,125,2,87,0,110,20,4,0,116,5,107, - 10,114,86,1,0,1,0,1,0,89,0,110,18,48,0,124, - 2,100,0,107,9,114,104,116,6,124,2,131,1,83,0,122, - 10,124,0,106,7,125,3,87,0,110,24,4,0,116,5,107, - 10,114,138,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,58,4, - 0,116,5,107,10,114,208,1,0,1,0,1,0,124,1,100, - 0,107,8,114,188,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,89,0,110,14,48,0,100,6,160,9,124,3,124, - 4,161,2,83,0,100,0,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,98,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,44,0,0,0,41,5,114,95,0,0,0,218, - 6,108,111,97,100,101,114,114,94,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,13,1,0,0,115,46,0,0, - 0,0,2,12,1,10,4,2,1,12,1,14,1,6,1,2, - 1,10,1,14,1,6,2,8,1,8,4,2,1,10,1,14, - 1,10,1,2,1,10,1,14,1,8,1,14,2,22,2,114, - 110,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,108,0,0,0, - 114,112,0,0,0,114,113,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,108,0,0,0,114, - 112,0,0,0,114,113,0,0,0,114,114,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,31,0, - 0,0,86,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,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,107,9,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,107,9,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,44,0,0,0,114,17,0,0, - 0,114,108,0,0,0,114,112,0,0,0,218,6,97,112,112, - 101,110,100,114,115,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,54,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,47,0,0,0,98,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,108,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,107,10,114,102,1,0,1,0,1,0,116,7,6,0, - 89,0,83,0,48,0,100,0,83,0,114,13,0,0,0,41, - 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, - 114,112,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,105,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,108,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, - 14,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,107,8,114,52,124,0,106, - 1,100,0,107,9,114,52,124,0,106,2,114,52,116,3,100, - 0,107,8,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,117,0,0,0,114,112,0,0,0,114,116, - 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,46,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, - 0,0,0,120,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,117,0,0,0,41, - 2,114,30,0,0,0,114,121,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,121,0,0,0,129, - 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,36,0,0,0,124,0,106,0,100,1,107,8, - 114,26,124,0,106,1,160,2,100,2,161,1,100,3,25,0, - 83,0,124,0,106,1,83,0,100,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,115,0,0,0, - 114,17,0,0,0,218,10,114,112,97,114,116,105,116,105,111, - 110,114,46,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,133,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,116,0,0,0,114, - 46,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,122,0,0,0,141,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,116,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,122,0,0,0,145,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,47,0,0,0,114,124,0,0,0,218,8,112,114, - 111,112,101,114,116,121,114,121,0,0,0,218,6,115,101,116, - 116,101,114,114,129,0,0,0,114,122,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,111,0,0,0,49,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, - 111,0,0,0,169,2,114,112,0,0,0,114,114,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,154,0,0,0,116,0, - 124,1,100,1,131,2,114,74,116,1,100,2,107,8,114,22, - 116,2,130,1,116,1,106,3,125,4,124,3,100,2,107,8, - 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,107,8,114,138, - 116,0,124,1,100,5,131,2,114,134,122,14,124,1,160,4, - 124,0,161,1,125,3,87,0,113,138,4,0,116,5,107,10, - 114,130,1,0,1,0,1,0,100,2,125,3,89,0,113,138, - 48,0,110,4,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,108,0,0,0,41,2,114,108,0,0,0,114,115, - 0,0,0,114,114,0,0,0,70,114,134,0,0,0,41,7, - 114,4,0,0,0,114,125,0,0,0,114,126,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,114,0,0,0,114,78,0, - 0,0,114,111,0,0,0,41,6,114,17,0,0,0,114,108, - 0,0,0,114,112,0,0,0,114,114,0,0,0,114,135,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,90,0,0,0,150,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,14,1,12,3,4,2,114,90,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,56,1,0,0,122,10, - 124,0,106,0,125,3,87,0,110,20,4,0,116,1,107,10, - 114,30,1,0,1,0,1,0,89,0,110,14,48,0,124,3, - 100,0,107,9,114,44,124,3,83,0,124,0,106,2,125,4, - 124,1,100,0,107,8,114,90,122,10,124,0,106,3,125,1, - 87,0,110,20,4,0,116,1,107,10,114,88,1,0,1,0, - 1,0,89,0,110,2,48,0,122,10,124,0,106,4,125,5, - 87,0,110,24,4,0,116,1,107,10,114,124,1,0,1,0, - 1,0,100,0,125,5,89,0,110,2,48,0,124,2,100,0, - 107,8,114,184,124,5,100,0,107,8,114,180,122,10,124,1, - 106,5,125,2,87,0,113,184,4,0,116,1,107,10,114,176, - 1,0,1,0,1,0,100,0,125,2,89,0,113,184,48,0, - 110,4,124,5,125,2,122,10,124,0,106,6,125,6,87,0, - 110,24,4,0,116,1,107,10,114,218,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,26,4,0,116,1,107,10, - 144,1,114,4,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,107,8,144,1,114,34,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,112,0,0,0, - 70,84,41,13,114,104,0,0,0,114,105,0,0,0,114,1, - 0,0,0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0,114,121,0,0, - 0,114,115,0,0,0,41,8,114,95,0,0,0,114,108,0, - 0,0,114,112,0,0,0,114,94,0,0,0,114,17,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,121,0,0,0, - 114,115,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,176,1,0,0,115,72,0,0,0, - 0,2,2,1,10,1,14,1,6,2,8,1,4,2,6,1, - 8,1,2,1,10,1,14,2,6,1,2,1,10,1,14,1, - 10,1,8,1,8,1,2,1,10,1,14,1,12,2,4,1, - 2,1,10,1,14,1,10,1,2,1,14,1,16,1,10,2, - 14,1,20,1,6,1,6,1,114,141,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,226,1,0,0,124,2,115,20,116,0,124,1, - 100,1,100,0,131,3,100,0,107,8,114,54,122,12,124,0, - 106,1,124,1,95,2,87,0,110,20,4,0,116,3,107,10, - 114,52,1,0,1,0,1,0,89,0,110,2,48,0,124,2, - 115,74,116,0,124,1,100,2,100,0,131,3,100,0,107,8, - 114,178,124,0,106,4,125,3,124,3,100,0,107,8,114,146, - 124,0,106,5,100,0,107,9,114,146,116,6,100,0,107,8, - 114,110,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,20,4,0,116,3,107,10,114,176,1,0, - 1,0,1,0,89,0,110,2,48,0,124,2,115,198,116,0, - 124,1,100,3,100,0,131,3,100,0,107,8,114,232,122,12, - 124,0,106,13,124,1,95,14,87,0,110,20,4,0,116,3, - 107,10,114,230,1,0,1,0,1,0,89,0,110,2,48,0, - 122,10,124,0,124,1,95,15,87,0,110,22,4,0,116,3, - 107,10,144,1,114,8,1,0,1,0,1,0,89,0,110,2, - 48,0,124,2,144,1,115,34,116,0,124,1,100,4,100,0, - 131,3,100,0,107,8,144,1,114,82,124,0,106,5,100,0, - 107,9,144,1,114,82,122,12,124,0,106,5,124,1,95,16, - 87,0,110,22,4,0,116,3,107,10,144,1,114,80,1,0, - 1,0,1,0,89,0,110,2,48,0,124,0,106,17,144,1, - 114,222,124,2,144,1,115,114,116,0,124,1,100,5,100,0, - 131,3,100,0,107,8,144,1,114,150,122,12,124,0,106,18, - 124,1,95,11,87,0,110,22,4,0,116,3,107,10,144,1, - 114,148,1,0,1,0,1,0,89,0,110,2,48,0,124,2, - 144,1,115,174,116,0,124,1,100,6,100,0,131,3,100,0, - 107,8,144,1,114,222,124,0,106,19,100,0,107,9,144,1, - 114,222,122,12,124,0,106,19,124,1,95,20,87,0,110,22, - 4,0,116,3,107,10,144,1,114,220,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,97,0,0,0,218,11,95,95,112,97,99,107,97, - 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, - 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, - 1,0,0,0,114,105,0,0,0,114,108,0,0,0,114,115, - 0,0,0,114,125,0,0,0,114,126,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, - 107,0,0,0,114,97,0,0,0,114,129,0,0,0,114,144, - 0,0,0,114,104,0,0,0,114,140,0,0,0,114,122,0, - 0,0,114,112,0,0,0,114,121,0,0,0,114,138,0,0, - 0,41,5,114,94,0,0,0,114,95,0,0,0,114,143,0, - 0,0,114,108,0,0,0,114,145,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,221, - 1,0,0,115,96,0,0,0,0,4,20,1,2,1,12,1, - 14,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,14,1, - 6,2,20,1,2,1,12,1,14,1,6,2,2,1,10,1, - 16,1,6,2,24,1,12,1,2,1,12,1,16,1,6,2, - 8,1,24,1,2,1,12,1,16,1,6,2,24,1,12,1, - 2,1,12,1,16,1,6,1,114,147,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,107,8,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,108,0,0,0,114,148,0,0,0,114,78, - 0,0,0,114,18,0,0,0,114,17,0,0,0,114,147,0, - 0,0,169,2,114,94,0,0,0,114,95,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,37, - 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,151,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,106,0,0,0,124,0,106, - 0,100,1,107,8,114,14,100,2,110,4,124,0,106,0,125, - 1,124,0,106,1,100,1,107,8,114,66,124,0,106,2,100, - 1,107,8,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,110,36,124, - 0,106,4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0,114,101,0,0, - 0,114,102,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,112,0,0,0,114,108,0,0,0,114,44,0,0,0, - 114,122,0,0,0,41,2,114,94,0,0,0,114,17,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, - 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, - 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,1,107,9,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,107, - 8,114,106,124,0,106,8,100,3,107,8,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,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,142,0,0, - 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, - 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, - 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, - 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,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,92,0,0,0, - 71,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, - 92,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,26,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,107,6,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,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, - 107,8,114,148,122,12,124,0,106,0,124,1,95,7,87,0, - 110,20,4,0,116,8,107,10,114,146,1,0,1,0,1,0, - 89,0,110,2,48,0,116,6,124,1,100,2,100,0,131,3, - 100,0,107,8,114,226,122,40,124,1,106,9,124,1,95,10, - 116,11,124,1,100,3,131,2,115,202,124,0,106,2,160,12, - 100,4,161,1,100,5,25,0,124,1,95,10,87,0,110,20, - 4,0,116,8,107,10,114,224,1,0,1,0,1,0,89,0, - 110,2,48,0,116,6,124,1,100,6,100,0,131,3,100,0, - 107,8,144,1,114,22,122,10,124,0,124,1,95,13,87,0, - 110,22,4,0,116,8,107,10,144,1,114,20,1,0,1,0, - 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, - 97,0,0,0,114,144,0,0,0,114,140,0,0,0,114,127, - 0,0,0,114,22,0,0,0,114,104,0,0,0,41,14,114, - 108,0,0,0,114,154,0,0,0,114,17,0,0,0,114,15, - 0,0,0,114,91,0,0,0,114,155,0,0,0,114,6,0, - 0,0,114,97,0,0,0,114,105,0,0,0,114,1,0,0, - 0,114,144,0,0,0,114,4,0,0,0,114,128,0,0,0, - 114,104,0,0,0,114,150,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,101,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,14,1,6,1,16,1,2,4,8, - 1,10,1,22,1,14,1,6,1,18,1,2,1,10,1,16, - 1,6,1,114,157,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,226,0,0,0,124,0,106,0,100,0,107,9,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,168,124,1,116,5,106,6,124,0,106,7,60,0, - 122,52,124,0,106,0,100,0,107,8,114,96,124,0,106,8, - 100,0,107,8,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,50,1,0,1,0,1,0,122,14,116,5, - 106,6,124,0,106,7,61,0,87,0,110,20,4,0,116,11, - 107,10,114,152,1,0,1,0,1,0,89,0,110,2,48,0, - 130,0,89,0,110,2,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,149,0,0,0, - 84,114,153,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,108,0,0,0,114,4,0,0,0,114,157,0,0, - 0,114,151,0,0,0,90,13,95,105,110,105,116,105,97,108, - 105,122,105,110,103,114,15,0,0,0,114,91,0,0,0,114, - 17,0,0,0,114,115,0,0,0,114,78,0,0,0,114,149, - 0,0,0,114,62,0,0,0,114,155,0,0,0,114,75,0, - 0,0,114,150,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,138,2,0,0,115,48,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,14, - 1,6,1,8,5,14,1,12,1,18,2,8,0,8,2,114, - 158,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,49, - 0,0,0,114,17,0,0,0,114,158,0,0,0,41,1,114, - 94,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,93,0,0,0,180,2,0,0,115,4,0,0, - 0,0,9,12,1,114,93,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,159,0,0,0,114,137,0,0, - 0,41,1,114,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,98,0,0,0,206,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,46, - 0,0,0,124,2,100,0,107,9,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,100,0,83, - 0,169,2,78,114,136,0,0,0,41,4,114,56,0,0,0, - 90,10,105,115,95,98,117,105,108,116,105,110,114,90,0,0, - 0,114,137,0,0,0,169,4,218,3,99,108,115,114,80,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,215,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,107,9,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,166,0,0,0,114, - 108,0,0,0,41,4,114,163,0,0,0,114,80,0,0,0, - 114,164,0,0,0,114,94,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,224,2,0,0,115,4,0,0,0,0, - 9,12,1,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, + 0,0,78,0,0,0,115,36,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,8,0,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,37,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,39,0,0,0,114,40,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,39,0,0,0,103, + 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,116,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, + 36,0,0,0,114,38,0,0,0,114,39,0,0,0,114,47, + 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,12,8,25,8, + 13,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,4,0,0,0,67,0,0,0,115,46,0,0,0,124,1, - 106,0,116,1,106,2,107,7,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,76,0,0,0,114,16,0, - 0,0,41,8,114,17,0,0,0,114,15,0,0,0,114,77, - 0,0,0,114,78,0,0,0,114,44,0,0,0,114,66,0, - 0,0,114,56,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,94, + 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,124,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,37,0,0,0,84,41,1,114,27,0,0,0, + 114,46,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,38,0,0,0,128,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,41,0,0,0,114, + 37,0,0,0,41,2,114,27,0,0,0,114,42,0,0,0, + 114,46,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,39,0,0,0,132,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,43,0,0,0,114,46,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,47,0,0, + 0,137,0,0,0,115,2,0,0,0,0,1,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,38,0,0,0,114,39,0,0,0,114,47,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,48,0,0,0,120,0,0,0,115, + 10,0,0,0,8,1,4,3,8,4,8,4,8,5,114,48, + 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,148,0,0,0,236,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,66,0,0,0,114,56,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,95,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,149,0,0,0,244,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,163,0,0,0, - 114,80,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,249,2, - 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, + 0,0,114,31,0,0,0,143,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,50,0,0,0,114,51,0,0,0,114,38,0,0, + 0,114,46,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, + 147,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,51, + 0,0,0,114,39,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,151,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,53,0,0,0,114,55,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,49,0,0,0,141,0,0,0,115,6,0,0, + 0,8,2,8,4,8,4,114,49,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,138,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,24,4,0,116,3,107,10,114,48,1,0,1,0, + 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, + 107,8,114,112,116,4,100,1,107,8,114,76,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,107,8,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,34,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,176,0,0,0,115,12,0,0,0,0, + 1,8,1,2,4,14,1,8,2,10,0,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,56,0,0,0, + 114,57,0,0,0,114,58,0,0,0,218,8,75,101,121,69, + 114,114,111,114,114,23,0,0,0,114,48,0,0,0,114,20, + 0,0,0,218,8,95,119,101,97,107,114,101,102,114,60,0, + 0,0,114,59,0,0,0,41,3,114,17,0,0,0,114,24, + 0,0,0,114,61,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,52,0,0,0,157,0,0,0, + 115,30,0,0,0,0,6,8,1,2,1,2,1,14,1,14, + 1,10,2,8,1,8,1,10,2,8,2,12,11,18,2,10, + 0,10,2,114,52,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, + 107,10,114,40,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,52,0,0,0,114,38,0,0,0,114,19,0,0,0,114, + 39,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,194,0,0,0,115,12,0,0,0,0,6,8, + 1,2,1,12,1,14,3,6,2,114,64,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,79,0,0,0,115,10,0,0,0,124,0,124,1, + 124,2,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,54,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,211,0,0,0,115,2, + 0,0,0,0,8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,67, + 0,0,0,114,54,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,222,0,0,0,115,8,0, + 0,0,0,2,12,1,10,1,8,1,114,75,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, + 107,7,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,44,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,232,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,82,0,0,0,114,83,0,0,0,114, + 10,0,0,0,114,81,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,230,0,0,0,115,6,0,0,0,0,2,12,5,10,1, + 114,85,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,56,0,0,0, + 218,9,105,115,95,102,114,111,122,101,110,114,78,0,0,0, + 114,44,0,0,0,114,79,0,0,0,114,81,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,243,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,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,84,0,0,0,41, + 2,114,82,0,0,0,114,88,0,0,0,114,10,0,0,0, + 114,81,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,241,0,0,0, + 115,6,0,0,0,0,2,12,5,10,1,114,89,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,62,0,0,0,116,0, + 124,1,124,0,131,2,125,2,124,1,116,1,106,2,107,6, + 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,100,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,80,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,253,0,0, + 0,115,12,0,0,0,0,6,10,1,10,1,10,1,10,1, + 10,2,114,96,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,226,0,0,0,116,0,124,0,100,1,100,0,131,3,125, + 1,116,1,124,1,100,2,131,2,114,56,122,12,124,1,160, + 2,124,0,161,1,87,0,83,0,4,0,116,3,107,10,114, + 54,1,0,1,0,1,0,89,0,110,2,48,0,122,10,124, + 0,106,4,125,2,87,0,110,20,4,0,116,5,107,10,114, + 86,1,0,1,0,1,0,89,0,110,18,48,0,124,2,100, + 0,107,9,114,104,116,6,124,2,131,1,83,0,122,10,124, + 0,106,7,125,3,87,0,110,24,4,0,116,5,107,10,114, + 138,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,58,4,0,116, + 5,107,10,114,208,1,0,1,0,1,0,124,1,100,0,107, + 8,114,188,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,89,0,110,14,48,0,100,6,160,9,124,3,124,4,161, + 2,83,0,100,0,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,98,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,44,0,0,0,41,5,114,95,0,0,0,218,6,108, + 111,97,100,101,114,114,94,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,13,1,0,0,115,46,0,0,0,0, + 2,12,1,10,4,2,1,12,1,14,1,6,1,2,1,10, + 1,14,1,6,2,8,1,8,4,2,1,10,1,14,1,10, + 1,2,1,10,1,14,1,8,1,14,2,22,2,114,110,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,108,0,0,0,114,112, + 0,0,0,114,113,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,108,0,0,0,114,112,0, + 0,0,114,113,0,0,0,114,114,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,31,0,0,0, + 86,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,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,107,9,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,107,9,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,44,0,0,0,114,17,0,0,0,114, + 108,0,0,0,114,112,0,0,0,218,6,97,112,112,101,110, + 100,114,115,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,54,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,47,0,0,0,98,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,108,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, + 107,10,114,102,1,0,1,0,1,0,116,7,6,0,89,0, + 83,0,48,0,100,0,83,0,114,13,0,0,0,41,8,114, + 115,0,0,0,114,17,0,0,0,114,108,0,0,0,114,112, + 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,105,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,108,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,14,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,107,8,114,52,124,0,106,1,100, + 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, + 8,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,117,0,0,0,114,112,0,0,0,114,116,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,46,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,121,0,0, + 0,120,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,117,0,0,0,41,2,114, + 30,0,0,0,114,121,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,121,0,0,0,129,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,36,0,0,0,124,0,106,0,100,1,107,8,114,26, + 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, + 124,0,106,1,83,0,100,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,115,0,0,0,114,17, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 46,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,133,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,116,0,0,0,114,46,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,122,0,0,0,141,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,116,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,122,0,0,0,145,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,47,0,0,0,114,124,0,0,0,218,8,112,114,111,112, + 101,114,116,121,114,121,0,0,0,218,6,115,101,116,116,101, + 114,114,129,0,0,0,114,122,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 111,0,0,0,49,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,111,0, + 0,0,169,2,114,112,0,0,0,114,114,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,154,0,0,0,116,0,124,1, + 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, + 130,1,116,1,106,3,125,4,124,3,100,2,107,8,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,107,8,114,138,116,0, + 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, + 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, + 1,0,1,0,1,0,100,2,125,3,89,0,113,138,48,0, + 110,4,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,108,0,0,0,41,2,114,108,0,0,0,114,115,0,0, + 0,114,114,0,0,0,70,114,134,0,0,0,41,7,114,4, + 0,0,0,114,125,0,0,0,114,126,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,114,0,0,0,114,78,0,0,0, + 114,111,0,0,0,41,6,114,17,0,0,0,114,108,0,0, + 0,114,112,0,0,0,114,114,0,0,0,114,135,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,90,0,0,0,150,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,14,1,12,3,4,2,114,90,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,56,1,0,0,122,10,124,0, + 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, + 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, + 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, + 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, + 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, + 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, + 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, + 100,0,125,5,89,0,110,2,48,0,124,2,100,0,107,8, + 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, + 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, + 1,0,1,0,100,0,125,2,89,0,113,184,48,0,110,4, + 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, + 4,0,116,1,107,10,114,218,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,26,4,0,116,1,107,10,144,1, + 114,4,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,107,8,144,1,114,34,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,112,0,0,0,70,84, + 41,13,114,104,0,0,0,114,105,0,0,0,114,1,0,0, + 0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0,114,121,0,0,0,114, + 115,0,0,0,41,8,114,95,0,0,0,114,108,0,0,0, + 114,112,0,0,0,114,94,0,0,0,114,17,0,0,0,90, + 8,108,111,99,97,116,105,111,110,114,121,0,0,0,114,115, + 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,176,1,0,0,115,72,0,0,0,0,2, + 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, + 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, + 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, + 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, + 20,1,6,1,6,1,114,141,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,226,1,0,0,124,2,115,20,116,0,124,1,100,1, + 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, + 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,74, + 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, + 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, + 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, + 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,20,4,0,116,3,107,10,114,176,1,0,1,0, + 1,0,89,0,110,2,48,0,124,2,115,198,116,0,124,1, + 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, + 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, + 114,230,1,0,1,0,1,0,89,0,110,2,48,0,122,10, + 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, + 144,1,114,8,1,0,1,0,1,0,89,0,110,2,48,0, + 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, + 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, + 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, + 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, + 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,222, + 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, + 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, + 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, + 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, + 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, + 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, + 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, + 116,3,107,10,144,1,114,220,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,97,0,0,0,218,11,95,95,112,97,99,107,97,103,101, + 95,95,114,140,0,0,0,114,107,0,0,0,114,138,0,0, + 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, + 0,0,114,105,0,0,0,114,108,0,0,0,114,115,0,0, + 0,114,125,0,0,0,114,126,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,107,0, + 0,0,114,97,0,0,0,114,129,0,0,0,114,144,0,0, + 0,114,104,0,0,0,114,140,0,0,0,114,122,0,0,0, + 114,112,0,0,0,114,121,0,0,0,114,138,0,0,0,41, + 5,114,94,0,0,0,114,95,0,0,0,114,143,0,0,0, + 114,108,0,0,0,114,145,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,221,1,0, + 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,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,14,1,6,2, + 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, + 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, + 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, + 12,1,16,1,6,1,114,147,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,107, + 8,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,108,0,0,0,114,148,0,0,0,114,78,0,0, + 0,114,18,0,0,0,114,17,0,0,0,114,147,0,0,0, + 169,2,114,94,0,0,0,114,95,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,37,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,151,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,106,0,0,0,124,0,106,0,100, + 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, + 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, + 8,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,110,36,124,0,106, + 4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0,114,101,0,0,0,114, + 102,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, + 112,0,0,0,114,108,0,0,0,114,44,0,0,0,114,122, + 0,0,0,41,2,114,94,0,0,0,114,17,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,106, + 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, + 10,1,10,1,10,2,16,2,6,1,14,2,114,106,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,1,107,9,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,107,8,114, + 106,124,0,106,8,100,3,107,8,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,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,142,0,0,0,114, + 149,0,0,0,41,14,114,17,0,0,0,114,49,0,0,0, + 114,15,0,0,0,114,91,0,0,0,114,34,0,0,0,114, + 44,0,0,0,114,78,0,0,0,114,108,0,0,0,114,115, + 0,0,0,114,147,0,0,0,114,4,0,0,0,218,11,108, + 111,97,100,95,109,111,100,117,108,101,114,149,0,0,0,218, + 3,112,111,112,41,4,114,94,0,0,0,114,95,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,92,0,0,0,71,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,92,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,26,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,107,6,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,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,107,8, + 114,148,122,12,124,0,106,0,124,1,95,7,87,0,110,20, + 4,0,116,8,107,10,114,146,1,0,1,0,1,0,89,0, + 110,2,48,0,116,6,124,1,100,2,100,0,131,3,100,0, + 107,8,114,226,122,40,124,1,106,9,124,1,95,10,116,11, + 124,1,100,3,131,2,115,202,124,0,106,2,160,12,100,4, + 161,1,100,5,25,0,124,1,95,10,87,0,110,20,4,0, + 116,8,107,10,114,224,1,0,1,0,1,0,89,0,110,2, + 48,0,116,6,124,1,100,6,100,0,131,3,100,0,107,8, + 144,1,114,22,122,10,124,0,124,1,95,13,87,0,110,22, + 4,0,116,8,107,10,144,1,114,20,1,0,1,0,1,0, + 89,0,110,2,48,0,124,1,83,0,41,7,78,114,97,0, + 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, + 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, + 0,0,114,154,0,0,0,114,17,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,155,0,0,0,114,6,0,0,0, + 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, + 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, + 0,0,0,114,150,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,101,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,14,1,6,1,16,1,2,4,8,1,10, + 1,22,1,14,1,6,1,18,1,2,1,10,1,16,1,6, + 1,114,157,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, + 226,0,0,0,124,0,106,0,100,0,107,9,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,168,124,1,116,5,106,6,124,0,106,7,60,0,122,52, + 124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0, + 107,8,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,50,1,0,1,0,1,0,122,14,116,5,106,6, + 124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10, + 114,152,1,0,1,0,1,0,89,0,110,2,48,0,130,0, + 89,0,110,2,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,149,0,0,0,84,114, + 153,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,108,0,0,0,114,4,0,0,0,114,157,0,0,0,114, + 151,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, + 105,110,103,114,15,0,0,0,114,91,0,0,0,114,17,0, + 0,0,114,115,0,0,0,114,78,0,0,0,114,149,0,0, + 0,114,62,0,0,0,114,155,0,0,0,114,75,0,0,0, + 114,150,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,138,2,0,0,115,48,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,14,1,6, + 1,8,5,14,1,12,1,18,2,8,0,8,2,114,158,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,49,0,0, + 0,114,17,0,0,0,114,158,0,0,0,41,1,114,94,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,93,0,0,0,180,2,0,0,115,4,0,0,0,0, + 9,12,1,114,93,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,159,0,0,0,114,137,0,0,0,41, + 1,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,98,0,0,0,206,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,46,0,0, + 0,124,2,100,0,107,9,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,100,0,83,0,169, + 2,78,114,136,0,0,0,41,4,114,56,0,0,0,90,10, + 105,115,95,98,117,105,108,116,105,110,114,90,0,0,0,114, + 137,0,0,0,169,4,218,3,99,108,115,114,80,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,215,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,107,9,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,166,0,0,0,114,108,0, + 0,0,41,4,114,163,0,0,0,114,80,0,0,0,114,164, + 0,0,0,114,94,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,224,2,0,0,115,4,0,0,0,0,9,12, + 1,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,107,7,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,76,0,0,0,114,16,0,0,0, + 41,8,114,17,0,0,0,114,15,0,0,0,114,77,0,0, + 0,114,78,0,0,0,114,44,0,0,0,114,66,0,0,0, + 114,56,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,94,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,148,0,0,0,236,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,66,0,0,0,114,56,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,95,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,149,0,0,0,244,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,163,0,0,0,114,80, + 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,249,2,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,168,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,255,2,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,168,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, + 114,114,0,0,0,5,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,137,0,0,0,218,12, + 115,116,97,116,105,99,109,101,116,104,111,100,114,98,0,0, + 0,218,11,99,108,97,115,115,109,101,116,104,111,100,114,166, + 0,0,0,114,167,0,0,0,114,148,0,0,0,114,149,0, + 0,0,114,85,0,0,0,114,169,0,0,0,114,170,0,0, + 0,114,114,0,0,0,114,96,0,0,0,114,154,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,159,0,0,0,195,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,159, + 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,160,0,0,0, + 114,152,0,0,0,41,4,114,44,0,0,0,114,1,0,0, + 0,114,173,0,0,0,114,137,0,0,0,41,1,218,1,109, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 98,0,0,0,25,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,34,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,100,0,83,0,114,161,0,0, + 0,41,4,114,56,0,0,0,114,87,0,0,0,114,90,0, + 0,0,114,137,0,0,0,114,162,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,166,0,0,0, + 34,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,56,0, + 0,0,114,87,0,0,0,41,3,114,163,0,0,0,114,80, + 0,0,0,114,164,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,167,0,0,0,41,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,56,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,98,117,105,108,116,45,105,110, + 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,163,0,0,0, + 114,94,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,148,0,0,0,50,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,86,0,0,0,41,10,114,104,0,0,0,114,17,0,0, + 0,114,56,0,0,0,114,87,0,0,0,114,78,0,0,0, + 114,44,0,0,0,114,66,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,95,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,149,0,0,0,54,3, + 0,0,115,14,0,0,0,0,2,8,1,10,1,10,1,2, + 255,6,2,12,1,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,96, + 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,154,0,0,0,63,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,56, + 0,0,0,114,175,0,0,0,114,168,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,169,0,0, + 0,72,3,0,0,115,2,0,0,0,0,4,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,168,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,255,2,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,168, + 0,114,10,0,0,0,114,11,0,0,0,114,170,0,0,0, + 78,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,56,0,0,0,90,17,105,115,95,102,114,111,122, + 101,110,95,112,97,99,107,97,103,101,114,168,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,114, + 0,0,0,84,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,137,0,0,0,114,171,0,0,0, + 114,98,0,0,0,114,172,0,0,0,114,166,0,0,0,114, + 167,0,0,0,114,148,0,0,0,114,149,0,0,0,114,154, + 0,0,0,114,89,0,0,0,114,169,0,0,0,114,170,0, + 0,0,114,114,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,173,0,0,0, + 14,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,173,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, + 56,0,0,0,114,57,0,0,0,114,46,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,53,0, + 0,0,97,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,56,0,0,0,114,59,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,55,0,0, + 0,101,3,0,0,115,2,0,0,0,0,2,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,53,0,0,0,114,55,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,178, + 0,0,0,93,3,0,0,115,6,0,0,0,8,2,4,2, + 8,4,114,178,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,127,0,0,0, + 114,37,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,78,0,0,0,114,44,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,106, + 3,0,0,115,10,0,0,0,0,2,16,1,12,1,8,1, + 8,1,114,187,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,107,8,114,24,100,0,83,0,116,1,124, + 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,167, + 0,0,0,114,90,0,0,0,41,4,218,6,102,105,110,100, + 101,114,114,17,0,0,0,114,164,0,0,0,114,108,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,115,3,0,0,115,8,0,0,0,0,3,12,1, + 8,1,4,1,114,189,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,107,8,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,107,6,125,4,124,3,68,0,93,234,125,5,116, + 7,131,0,143,96,1,0,122,10,124,5,106,8,125,6,87, + 0,110,56,4,0,116,9,107,10,114,130,1,0,1,0,1, + 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, + 1,107,8,114,126,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,164,48,0,1,0,1,0,1, + 0,89,0,1,0,124,7,100,1,107,9,114,52,124,4,144, + 1,115,22,124,0,116,0,106,6,107,6,144,1,114,22,116, + 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, + 9,87,0,110,28,4,0,116,9,107,10,114,248,1,0,1, + 0,1,0,124,7,6,0,89,0,2,0,1,0,83,0,48, + 0,124,9,100,1,107,8,144,1,114,12,124,7,2,0,1, + 0,83,0,124,9,2,0,1,0,83,0,113,52,124,7,2, + 0,1,0,83,0,113,52,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,78,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,91,0,0,0, + 114,178,0,0,0,114,166,0,0,0,114,105,0,0,0,114, + 189,0,0,0,114,104,0,0,0,41,10,114,17,0,0,0, + 114,164,0,0,0,114,165,0,0,0,114,190,0,0,0,90, + 9,105,115,95,114,101,108,111,97,100,114,188,0,0,0,114, + 166,0,0,0,114,94,0,0,0,114,95,0,0,0,114,104, 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,114,0,0,0,5,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,137,0,0,0, - 218,12,115,116,97,116,105,99,109,101,116,104,111,100,114,98, - 0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,100, - 114,166,0,0,0,114,167,0,0,0,114,148,0,0,0,114, - 149,0,0,0,114,85,0,0,0,114,169,0,0,0,114,170, - 0,0,0,114,114,0,0,0,114,96,0,0,0,114,154,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,159,0,0,0,195,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,159,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,160,0, - 0,0,114,152,0,0,0,41,4,114,44,0,0,0,114,1, - 0,0,0,114,173,0,0,0,114,137,0,0,0,41,1,218, - 1,109,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,98,0,0,0,25,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,34,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,100,0,83,0,114,161, - 0,0,0,41,4,114,56,0,0,0,114,87,0,0,0,114, - 90,0,0,0,114,137,0,0,0,114,162,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,166,0, - 0,0,34,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, - 56,0,0,0,114,87,0,0,0,41,3,114,163,0,0,0, - 114,80,0,0,0,114,164,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,167,0,0,0,41,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,163,0, - 0,0,114,94,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,148,0,0,0,50,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,86,0,0,0,41,10,114,104,0,0,0,114,17, - 0,0,0,114,56,0,0,0,114,87,0,0,0,114,78,0, - 0,0,114,44,0,0,0,114,66,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,95,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,149,0,0,0, - 54,3,0,0,115,14,0,0,0,0,2,8,1,10,1,10, - 1,2,255,6,2,12,1,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,96,0,0,0,114,168,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,154,0,0,0,63,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,56,0,0,0,114,175,0,0,0,114,168,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,169, - 0,0,0,72,3,0,0,115,2,0,0,0,0,4,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,168,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,170,0, - 0,0,78,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,56,0,0,0,90,17,105,115,95,102,114, - 111,122,101,110,95,112,97,99,107,97,103,101,114,168,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,114,0,0,0,84,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,137,0,0,0,114,171,0, - 0,0,114,98,0,0,0,114,172,0,0,0,114,166,0,0, - 0,114,167,0,0,0,114,148,0,0,0,114,149,0,0,0, - 114,154,0,0,0,114,89,0,0,0,114,169,0,0,0,114, - 170,0,0,0,114,114,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,173,0, - 0,0,14,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,173,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,56,0,0,0,114,57,0,0,0,114,46,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 53,0,0,0,97,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,56,0,0,0,114, - 59,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,55, - 0,0,0,101,3,0,0,115,2,0,0,0,0,2,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,53,0,0,0,114,55,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,178,0,0,0,93,3,0,0,115,6,0,0,0,8,2, - 4,2,8,4,114,178,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,127,0, - 0,0,114,37,0,0,0,122,50,97,116,116,101,109,112,116, + 0,0,218,10,95,102,105,110,100,95,115,112,101,99,124,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,14,1,12, + 1,8,1,22,2,42,1,8,2,18,1,10,1,2,1,10, + 1,14,4,14,2,10,1,8,2,10,2,10,2,114,194,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,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,78,0,0,0,114,44,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,106,3,0,0,115,10,0,0,0,0,2,16,1,12,1, - 8,1,8,1,114,187,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,107,8,114,24,100,0,83,0,116, - 1,124,1,124,3,131,2,83,0,114,13,0,0,0,41,2, - 114,167,0,0,0,114,90,0,0,0,41,4,218,6,102,105, - 110,100,101,114,114,17,0,0,0,114,164,0,0,0,114,108, - 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,115,3,0,0,115,8,0,0,0,0,3, - 12,1,8,1,4,1,114,189,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,107,8,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,107,6,125,4,124,3,68,0,93,234,125, - 5,116,7,131,0,143,96,1,0,122,10,124,5,106,8,125, - 6,87,0,110,56,4,0,116,9,107,10,114,130,1,0,1, - 0,1,0,116,10,124,5,124,0,124,1,131,3,125,7,124, - 7,100,1,107,8,114,126,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,164,48,0,1,0,1, - 0,1,0,89,0,1,0,124,7,100,1,107,9,114,52,124, - 4,144,1,115,22,124,0,116,0,106,6,107,6,144,1,114, - 22,116,0,106,6,124,0,25,0,125,8,122,10,124,8,106, - 11,125,9,87,0,110,28,4,0,116,9,107,10,114,248,1, - 0,1,0,1,0,124,7,6,0,89,0,2,0,1,0,83, - 0,48,0,124,9,100,1,107,8,144,1,114,12,124,7,2, - 0,1,0,83,0,124,9,2,0,1,0,83,0,113,52,124, - 7,2,0,1,0,83,0,113,52,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,78,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,91,0, - 0,0,114,178,0,0,0,114,166,0,0,0,114,105,0,0, - 0,114,189,0,0,0,114,104,0,0,0,41,10,114,17,0, - 0,0,114,164,0,0,0,114,165,0,0,0,114,190,0,0, - 0,90,9,105,115,95,114,101,108,111,97,100,114,188,0,0, - 0,114,166,0,0,0,114,94,0,0,0,114,95,0,0,0, - 114,104,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, - 124,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,14, - 1,12,1,8,1,22,2,42,1,8,2,18,1,10,1,2, - 1,10,1,14,4,14,2,10,1,8,2,10,2,10,2,114, - 194,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,44,0,0,0,114,14,0,0,0,218,10,86, - 97,108,117,101,69,114,114,111,114,114,78,0,0,0,169,3, - 114,17,0,0,0,114,185,0,0,0,114,186,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,171,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,200,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,8,0,0,0,8,0,0,0,67,0, - 0,0,115,220,0,0,0,100,0,125,2,124,0,160,0,100, - 1,161,1,100,2,25,0,125,3,124,3,114,134,124,3,116, - 1,106,2,107,7,114,42,116,3,124,1,124,3,131,2,1, - 0,124,0,116,1,106,2,107,6,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,50,4,0,116,5,107, - 10,114,132,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,107,8,114,172,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,114,216,116, - 1,106,2,124,3,25,0,125,4,116,11,124,4,124,0,160, - 0,100,1,161,1,100,5,25,0,124,7,131,3,1,0,124, - 7,83,0,41,6,78,114,127,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,41,12,114,128,0,0,0,114,15,0,0,0,114, - 91,0,0,0,114,66,0,0,0,114,140,0,0,0,114,105, - 0,0,0,218,8,95,69,82,82,95,77,83,71,114,44,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,194,0,0,0,114,158,0,0, - 0,114,5,0,0,0,41,8,114,17,0,0,0,218,7,105, - 109,112,111,114,116,95,114,164,0,0,0,114,129,0,0,0, - 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, - 156,0,0,0,114,94,0,0,0,114,95,0,0,0,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,190,3,0,0,115,42,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,14,1,16,1,20,1,10,1,8,1,20, - 2,8,1,4,2,10,1,22,1,114,205,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,107,8,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,107,8,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,49,0,0,0, - 114,15,0,0,0,114,91,0,0,0,114,34,0,0,0,218, - 14,95,78,69,69,68,83,95,76,79,65,68,73,78,71,114, - 205,0,0,0,114,44,0,0,0,114,203,0,0,0,114,64, - 0,0,0,41,4,114,17,0,0,0,114,204,0,0,0,114, - 95,0,0,0,114,74,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,220,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,207,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,200,0,0,0,114,187, - 0,0,0,114,207,0,0,0,218,11,95,103,99,100,95,105, - 109,112,111,114,116,114,199,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,208,0,0,0,236,3, - 0,0,115,8,0,0,0,0,9,12,1,8,1,12,1,114, - 208,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,234,0,0,0,124, - 1,68,0,93,224,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,228,116,5,124, - 0,100,6,131,2,114,228,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,107,10,114,226,1,0,125,7,1, - 0,122,54,124,7,106,11,124,6,107,2,114,204,116,12,106, - 13,160,14,124,6,116,15,161,2,100,10,107,9,114,204,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, - 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, - 0,114,196,0,0,0,114,1,0,0,0,114,197,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,212,0,0, - 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, - 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, - 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, - 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, - 210,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,213,0, - 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, - 1,4,1,12,2,4,1,28,2,8,1,14,1,10,1,2, - 255,8,2,10,1,14,1,2,1,14,1,16,4,10,1,16, - 255,2,2,12,1,26,1,114,213,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,107,9,114,82,124,2,100,3,107,9,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, - 107,9,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,107,7,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,144,0,0,0,114,104,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,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, - 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, - 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, - 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, - 94,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,32,4,0,0,115,38,0,0,0,0, - 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, - 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, - 1,8,1,14,1,114,219,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,180,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,107,9,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,150,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,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, - 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41, - 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, - 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, - 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, - 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, - 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, - 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, - 95,114,185,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,59,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,32,1,10,1,12, - 2,114,222,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,107,8,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,159,0,0,0,114, - 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, - 114,17,0,0,0,114,94,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,96,4,0, - 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, - 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,107,6,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,107,7,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,191,0,0, - 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, - 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, - 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, - 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, - 0,0,114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,103,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,227,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,227,0,0,0,114,15,0,0,0,114,190,0,0,0, - 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, - 2,114,225,0,0,0,114,226,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,138,4,0,0,115,6,0,0,0,0,2,10, - 2,12,1,114,228,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,125,0,0,0,114,228,0,0, - 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, - 41,1,114,229,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,146,4,0,0,115,6,0,0,0,0,3,8,1, - 4,1,114,230,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,125,0,0,0, - 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, - 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, - 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, - 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, - 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, - 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, - 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, - 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, - 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, - 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, - 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, - 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, - 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, - 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, - 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, - 114,227,0,0,0,114,228,0,0,0,114,230,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,68,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,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, - 8,35,8,8, + 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,44,0,0,0,114,14,0,0,0,218,10,86,97,108, + 117,101,69,114,114,111,114,114,78,0,0,0,169,3,114,17, + 0,0,0,114,185,0,0,0,114,186,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,171,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,200,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,8,0,0,0,8,0,0,0,67,0,0,0, + 115,220,0,0,0,100,0,125,2,124,0,160,0,100,1,161, + 1,100,2,25,0,125,3,124,3,114,134,124,3,116,1,106, + 2,107,7,114,42,116,3,124,1,124,3,131,2,1,0,124, + 0,116,1,106,2,107,6,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,50,4,0,116,5,107,10,114, + 132,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,107,8,114,172,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,114,216,116,1,106, + 2,124,3,25,0,125,4,116,11,124,4,124,0,160,0,100, + 1,161,1,100,5,25,0,124,7,131,3,1,0,124,7,83, + 0,41,6,78,114,127,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,41,12,114,128,0,0,0,114,15,0,0,0,114,91,0, + 0,0,114,66,0,0,0,114,140,0,0,0,114,105,0,0, + 0,218,8,95,69,82,82,95,77,83,71,114,44,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,194,0,0,0,114,158,0,0,0,114, + 5,0,0,0,41,8,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, + 0,0,114,94,0,0,0,114,95,0,0,0,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,190,3,0,0,115,42,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,14,1,16,1,20,1,10,1,8,1,20,2,8, + 1,4,2,10,1,22,1,114,205,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,107,8,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,107,8,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,49,0,0,0,114,15, + 0,0,0,114,91,0,0,0,114,34,0,0,0,218,14,95, + 78,69,69,68,83,95,76,79,65,68,73,78,71,114,205,0, + 0,0,114,44,0,0,0,114,203,0,0,0,114,64,0,0, + 0,41,4,114,17,0,0,0,114,204,0,0,0,114,95,0, + 0,0,114,74,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,220,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,207,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,200,0,0,0,114,187,0,0, + 0,114,207,0,0,0,218,11,95,103,99,100,95,105,109,112, + 111,114,116,114,199,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,208,0,0,0,236,3,0,0, + 115,8,0,0,0,0,9,12,1,8,1,12,1,114,208,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,234,0,0,0,124,1,68, + 0,93,224,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,228,116,5,124,0,100, + 6,131,2,114,228,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,107,10,114,226,1,0,125,7,1,0,122, + 54,124,7,106,11,124,6,107,2,114,204,116,12,106,13,160, + 14,124,6,116,15,161,2,100,10,107,9,114,204,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,209,0, + 0,0,114,182,0,0,0,78,41,16,114,195,0,0,0,114, + 196,0,0,0,114,1,0,0,0,114,197,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,212,0,0,0,114, + 44,0,0,0,114,66,0,0,0,114,203,0,0,0,114,17, + 0,0,0,114,15,0,0,0,114,91,0,0,0,114,34,0, + 0,0,114,206,0,0,0,41,8,114,95,0,0,0,218,8, + 102,114,111,109,108,105,115,116,114,204,0,0,0,114,210,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,213,0,0,0, + 251,3,0,0,115,44,0,0,0,0,10,8,1,10,1,4, + 1,12,2,4,1,28,2,8,1,14,1,10,1,2,255,8, + 2,10,1,14,1,2,1,14,1,16,4,10,1,16,255,2, + 2,12,1,26,1,114,213,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, + 107,9,114,82,124,2,100,3,107,9,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,107,9, + 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,107,7,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,144,0,0,0,114,104,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,140, + 0,0,0,114,127,0,0,0,114,22,0,0,0,41,6,114, + 34,0,0,0,114,129,0,0,0,114,191,0,0,0,114,192, + 0,0,0,114,193,0,0,0,114,128,0,0,0,41,3,218, + 7,103,108,111,98,97,108,115,114,185,0,0,0,114,94,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,32,4,0,0,115,38,0,0,0,0,7,10, + 1,10,1,8,1,18,1,22,2,2,0,2,254,6,3,4, + 1,8,1,6,2,6,2,2,0,2,254,6,3,8,1,8, + 1,14,1,114,219,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,180,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,107,9,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,150,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,110, + 26,116,7,124,5,100,4,131,2,114,172,116,8,124,5,124, + 3,116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41,9,114, + 208,0,0,0,114,219,0,0,0,218,9,112,97,114,116,105, + 116,105,111,110,114,184,0,0,0,114,15,0,0,0,114,91, + 0,0,0,114,1,0,0,0,114,4,0,0,0,114,213,0, + 0,0,41,9,114,17,0,0,0,114,218,0,0,0,218,6, + 108,111,99,97,108,115,114,214,0,0,0,114,186,0,0,0, + 114,95,0,0,0,90,8,103,108,111,98,97,108,115,95,114, + 185,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,59,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,32,1,10,1,12,2,114, + 222,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, + 107,8,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,159,0,0,0,114,166,0, + 0,0,114,78,0,0,0,114,158,0,0,0,41,2,114,17, + 0,0,0,114,94,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,96,4,0,0,115, + 8,0,0,0,0,1,10,1,8,1,12,1,114,223,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,107,6,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,107,7,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,191,0,0,0,114, + 63,0,0,0,78,41,15,114,56,0,0,0,114,15,0,0, + 0,114,14,0,0,0,114,91,0,0,0,218,5,105,116,101, + 109,115,114,195,0,0,0,114,77,0,0,0,114,159,0,0, + 0,114,87,0,0,0,114,173,0,0,0,114,141,0,0,0, + 114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,103,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, + 227,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, + 227,0,0,0,114,15,0,0,0,114,190,0,0,0,114,118, + 0,0,0,114,159,0,0,0,114,173,0,0,0,41,2,114, + 225,0,0,0,114,226,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,138,4,0,0,115,6,0,0,0,0,2,10,2,12, + 1,114,228,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,125,0,0,0,114,228,0,0,0,114, + 15,0,0,0,114,91,0,0,0,114,1,0,0,0,41,1, + 114,229,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,146,4,0,0,115,6,0,0,0,0,3,8,1,4,1, + 114,230,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,125,0,0,0,114,12, + 0,0,0,114,18,0,0,0,114,58,0,0,0,114,33,0, + 0,0,114,42,0,0,0,114,19,0,0,0,114,20,0,0, + 0,114,48,0,0,0,114,49,0,0,0,114,52,0,0,0, + 114,64,0,0,0,114,66,0,0,0,114,75,0,0,0,114, + 85,0,0,0,114,89,0,0,0,114,96,0,0,0,114,110, + 0,0,0,114,111,0,0,0,114,90,0,0,0,114,141,0, + 0,0,114,147,0,0,0,114,151,0,0,0,114,106,0,0, + 0,114,92,0,0,0,114,157,0,0,0,114,158,0,0,0, + 114,93,0,0,0,114,159,0,0,0,114,173,0,0,0,114, + 178,0,0,0,114,187,0,0,0,114,189,0,0,0,114,194, + 0,0,0,114,200,0,0,0,90,15,95,69,82,82,95,77, + 83,71,95,80,82,69,70,73,88,114,202,0,0,0,114,205, + 0,0,0,218,6,111,98,106,101,99,116,114,206,0,0,0, + 114,207,0,0,0,114,208,0,0,0,114,213,0,0,0,114, + 219,0,0,0,114,222,0,0,0,114,223,0,0,0,114,227, + 0,0,0,114,228,0,0,0,114,230,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,68,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,27, + 6,3,8,16,10,15,14,37,8,27,10,37,8,7,8,35, + 8,8, }; From 89aa7f0ede1a11c020e83f24394593c577a61509 Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Mon, 30 Dec 2019 06:50:19 -0500 Subject: [PATCH 026/380] bpo-34790: Implement deprecation of passing coroutines to asyncio.wait() (GH-16977) --- Doc/whatsnew/3.9.rst | 3 +++ Lib/asyncio/tasks.py | 6 ++++++ Lib/test/test_asyncio/test_tasks.py | 24 +++++++++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b315604af51..ff0fc24f317 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -290,6 +290,9 @@ Deprecated predicable behavior. (Contributed by Serhiy Storchaka in :issue:`38371`.) +* The explicit passing of coroutine objects to :func:`asyncio.wait` has been + deprecated and will be removed in version 3.11. + (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) Removed ======= diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 894d28eb107..717837d8568 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -424,6 +424,12 @@ 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)): + 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)} 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 dde84b84b10..68f3b8cce9f 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -979,12 +979,12 @@ class BaseTaskTests: def coro(s): return s c = coro('test') - - task =self.new_task( + task = self.new_task( self.loop, asyncio.wait([c, c, coro('spam')])) - done, pending = self.loop.run_until_complete(task) + with self.assertWarns(DeprecationWarning): + done, pending = self.loop.run_until_complete(task) self.assertFalse(pending) self.assertEqual(set(f.result() for f in done), {'test', 'spam'}) @@ -1346,7 +1346,9 @@ class BaseTaskTests: futs = list(asyncio.as_completed(fs, loop=loop)) self.assertEqual(len(futs), 2) waiter = asyncio.wait(futs) - done, pending = loop.run_until_complete(waiter) + # Deprecation from passing coros in futs to asyncio.wait() + with self.assertWarns(DeprecationWarning): + done, pending = loop.run_until_complete(waiter) self.assertEqual(set(f.result() for f in done), {'a', 'b'}) def test_as_completed_duplicate_coroutines(self): @@ -1751,7 +1753,8 @@ class BaseTaskTests: async def outer(): nonlocal proof - d, p = await asyncio.wait([inner()]) + with self.assertWarns(DeprecationWarning): + d, p = await asyncio.wait([inner()]) proof += 100 f = asyncio.ensure_future(outer(), loop=self.loop) @@ -3307,6 +3310,17 @@ class WaitTests(test_utils.TestCase): 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): + self.loop.run_until_complete( + asyncio.wait([coroutine_function()])) + + task = self.loop.create_task(coroutine_function()) + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete( + asyncio.wait([task, coroutine_function()])) + class CompatibilityTests(test_utils.TestCase): # Tests for checking a bridge between old-styled coroutines From 4dc5a9df59837446ec1dc5b7a0e6ce95ae5b5cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Mon, 30 Dec 2019 19:02:04 +0300 Subject: [PATCH 027/380] bpo-39019: Implement missing __class_getitem__ for subprocess classes (GH-17558) --- Lib/subprocess.py | 24 +++++++++++++++++++ Lib/test/test_subprocess.py | 3 +++ .../2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst | 2 ++ 3 files changed, 29 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index ba6f1983a5a..30f0d1be154 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -446,6 +446,19 @@ class CompletedProcess(object): args.append('stderr={!r}'.format(self.stderr)) return "{}({})".format(type(self).__name__, ', '.join(args)) + def __class_getitem__(cls, type): + """Provide minimal support for using this class as generic + (for example in type annotations). + + See PEP 484 and PEP 560 for more details. For example, + `CompletedProcess[bytes]` is a valid expression at runtime + (type argument `bytes` indicates the type used for stdout). + Note, no type checking happens at runtime, but a static type + checker can be used. + """ + return cls + + def check_returncode(self): """Raise CalledProcessError if the exit code is non-zero.""" if self.returncode: @@ -987,6 +1000,17 @@ class Popen(object): obj_repr = obj_repr[:76] + "...>" return obj_repr + def __class_getitem__(cls, type): + """Provide minimal support for using this class as generic + (for example in type annotations). + + See PEP 484 and PEP 560 for more details. For example, `Popen[bytes]` + is a valid expression at runtime (type argument `bytes` indicates the + type used for stdout). Note, no type checking happens at runtime, but + a static type checker can be used. + """ + return cls + @property def universal_newlines(self): # universal_newlines as retained as an alias of text_mode for API diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 87322c6406b..2073fd14617 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1435,6 +1435,9 @@ class ProcessTestCase(BaseTestCase): subprocess.Popen(['exit', '0'], cwd='/some/nonexistent/directory') self.assertEqual(c.exception.filename, '/some/nonexistent/directory') + def test_class_getitems(self): + self.assertIs(subprocess.Popen[bytes], subprocess.Popen) + self.assertIs(subprocess.CompletedProcess[str], subprocess.CompletedProcess) class RunFuncTestCase(BaseTestCase): def run_python(self, code, **kwargs): diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst new file mode 100644 index 00000000000..b64a56edc50 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst @@ -0,0 +1,2 @@ +Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, +``subprocess.CompletedProcess`` From 09c482fad11c769be38b2449f1056e264b701bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Mon, 30 Dec 2019 19:08:08 +0300 Subject: [PATCH 028/380] bpo-39019: Implement missing __class_getitem__ for SpooledTemporaryFile (GH-17560) --- Lib/tempfile.py | 12 ++++++++++++ Lib/test/test_tempfile.py | 3 +++ .../Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst | 1 + 3 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 62875540f8b..448163f0438 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -643,6 +643,18 @@ class SpooledTemporaryFile: 'encoding': encoding, 'newline': newline, 'dir': dir, 'errors': errors} + def __class_getitem__(cls, type): + """Provide minimal support for using this class as generic + (for example in type annotations). + + See PEP 484 and PEP 560 for more details. For example, + `SpooledTemporaryFile[str]` is a valid expression at runtime (type + argument `str` indicates whether the file is open in bytes or text + mode). Note, no type checking happens at runtime, but a static type + checker can be used. + """ + return cls + def _check(self, file): if self._rolled: return max_size = self._max_size diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 232c5dae10f..5fe9506b0b7 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1229,6 +1229,9 @@ class TestSpooledTemporaryFile(BaseTestCase): self.assertTrue(f._rolled) self.assertEqual(os.fstat(f.fileno()).st_size, 20) + def test_class_getitem(self): + self.assertIs(tempfile.SpooledTemporaryFile[bytes], + tempfile.SpooledTemporaryFile) if tempfile.NamedTemporaryFile is not tempfile.TemporaryFile: diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst b/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst new file mode 100644 index 00000000000..7bdf291950f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst @@ -0,0 +1 @@ +Implement dummy ``__class_getitem__`` for :class:`tempfile.SpooledTemporaryFile`. From d9e561d23d994e3ed15f4fcbd7ee5c8fe50f190b Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Mon, 30 Dec 2019 12:32:58 -0700 Subject: [PATCH 029/380] bpo-38610: Fix possible crashes in several list methods (GH-17022) Hold strong references to list elements while calling PyObject_RichCompareBool(). --- Lib/test/test_list.py | 26 +++++++++++++++++++ .../2019-10-31-14-30-39.bpo-38610.fHdVMS.rst | 2 ++ Objects/listobject.c | 15 ++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index fe4b2cd365f..b10a833033f 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -171,5 +171,31 @@ class ListTest(list_tests.CommonTest): self.assertEqual(iter_size, sys.getsizeof(list([0] * 10))) self.assertEqual(iter_size, sys.getsizeof(list(range(10)))) + def test_count_index_remove_crashes(self): + # bpo-38610: The count(), index(), and remove() methods were not + # holding strong references to list elements while calling + # PyObject_RichCompareBool(). + class X: + def __eq__(self, other): + lst.clear() + return NotImplemented + + lst = [X()] + with self.assertRaises(ValueError): + lst.index(lst) + + class L(list): + def __eq__(self, other): + str(other) + return NotImplemented + + lst = L([X()]) + lst.count(lst) + + lst = L([X()]) + with self.assertRaises(ValueError): + lst.remove(lst) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst new file mode 100644 index 00000000000..0ee63bbb40d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst @@ -0,0 +1,2 @@ +Fix possible crashes in several list methods by holding strong references to +list elements when calling :c:func:`PyObject_RichCompareBool`. diff --git a/Objects/listobject.c b/Objects/listobject.c index 645742b801f..86690f764b7 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2553,7 +2553,10 @@ list_index_impl(PyListObject *self, PyObject *value, Py_ssize_t start, stop = 0; } for (i = start; i < stop && i < Py_SIZE(self); i++) { - int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ); + PyObject *obj = self->ob_item[i]; + Py_INCREF(obj); + int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); + Py_DECREF(obj); if (cmp > 0) return PyLong_FromSsize_t(i); else if (cmp < 0) @@ -2580,7 +2583,10 @@ list_count(PyListObject *self, PyObject *value) Py_ssize_t i; for (i = 0; i < Py_SIZE(self); i++) { - int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ); + PyObject *obj = self->ob_item[i]; + Py_INCREF(obj); + int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); + Py_DECREF(obj); if (cmp > 0) count++; else if (cmp < 0) @@ -2607,7 +2613,10 @@ list_remove(PyListObject *self, PyObject *value) Py_ssize_t i; for (i = 0; i < Py_SIZE(self); i++) { - int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ); + PyObject *obj = self->ob_item[i]; + Py_INCREF(obj); + int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); + Py_DECREF(obj); if (cmp > 0) { if (list_ass_slice(self, i, i+1, (PyObject *)NULL) == 0) From ee9ff05ec22ecd47dbffdd361967ccd55963dad2 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 30 Dec 2019 17:16:43 -0500 Subject: [PATCH 030/380] bpo-34118: memoryview, range, and tuple are classes (GH-17761) Tag memoryview, range, and tuple as classes, the same as list, etcetera, in the library manual built-in functions list. --- Doc/library/functions.rst | 6 +++--- .../next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 5abf978c88e..dc3391ffe88 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -952,7 +952,7 @@ are always available. They are listed here in alphabetical order. .. _func-memoryview: -.. function:: memoryview(obj) +.. class:: memoryview(obj) :noindex: Return a "memory view" object created from the given argument. See @@ -1408,7 +1408,7 @@ are always available. They are listed here in alphabetical order. .. _func-range: -.. function:: range(stop) +.. class:: range(stop) range(start, stop[, step]) :noindex: @@ -1655,7 +1655,7 @@ are always available. They are listed here in alphabetical order. .. _func-tuple: -.. function:: tuple([iterable]) +.. class:: tuple([iterable]) :noindex: Rather than being a function, :class:`tuple` is actually an immutable diff --git a/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst b/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst new file mode 100644 index 00000000000..ce95eb5482f --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst @@ -0,0 +1,2 @@ +Tag memoryview, range, and tuple as classes, the same as list, etcetera, in +the library manual built-in functions list. From 2d5bf568eaa5059402ccce9ba5a366986ba27c8a Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 31 Dec 2019 10:04:22 +0900 Subject: [PATCH 031/380] bpo-38588: Fix possible crashes in dict and list when calling PyObject_RichCompareBool (GH-17734) Take strong references before calling PyObject_RichCompareBool to protect against the case where the object dies during the call. --- Lib/test/test_dict.py | 12 ++++++++- Lib/test/test_list.py | 25 +++++++++++++++++++ .../2019-12-29-19-13-54.bpo-38588.pgXnNS.rst | 2 ++ Objects/dictobject.c | 2 ++ Objects/listobject.c | 7 ++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 5b513765f7b..de483ab5521 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -1221,7 +1221,7 @@ class DictTest(unittest.TestCase): support.check_free_after_iterating(self, lambda d: iter(d.items()), dict) def test_equal_operator_modifying_operand(self): - # test fix for seg fault reported in issue 27945 part 3. + # test fix for seg fault reported in bpo-27945 part 3. class X(): def __del__(self): dict_b.clear() @@ -1237,6 +1237,16 @@ class DictTest(unittest.TestCase): dict_b = {X(): X()} self.assertTrue(dict_a == dict_b) + # test fix for seg fault reported in bpo-38588 part 1. + class Y: + def __eq__(self, other): + dict_d.clear() + return True + + dict_c = {0: Y()} + dict_d = {0: set()} + self.assertTrue(dict_c == dict_d) + def test_fromkeys_operator_modifying_dict_operand(self): # test fix for seg fault reported in issue 27945 part 4a. class X(int): diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index b10a833033f..6e3c4c10930 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -163,6 +163,31 @@ class ListTest(list_tests.CommonTest): with self.assertRaises(TypeError): (3,) + L([1,2]) + def test_equal_operator_modifying_operand(self): + # test fix for seg fault reported in bpo-38588 part 2. + class X: + def __eq__(self,other) : + list2.clear() + return NotImplemented + + class Y: + def __eq__(self, other): + list1.clear() + return NotImplemented + + class Z: + def __eq__(self, other): + list3.clear() + return NotImplemented + + list1 = [X()] + list2 = [Y()] + self.assertTrue(list1 == list2) + + list3 = [Z()] + list4 = [1] + self.assertFalse(list3 == list4) + @cpython_only def test_preallocation(self): iterable = [0] * 10 diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst new file mode 100644 index 00000000000..0b81085a89d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst @@ -0,0 +1,2 @@ +Fix possible crashes in dict and list when calling +:c:func:`PyObject_RichCompareBool`. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 4afa19c8a0a..87f88abbe53 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2777,9 +2777,11 @@ dict_equal(PyDictObject *a, PyDictObject *b) return -1; return 0; } + Py_INCREF(bval); cmp = PyObject_RichCompareBool(aval, bval, Py_EQ); Py_DECREF(key); Py_DECREF(aval); + Py_DECREF(bval); if (cmp <= 0) /* error or not equal */ return cmp; } diff --git a/Objects/listobject.c b/Objects/listobject.c index 86690f764b7..abe2604573f 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2662,8 +2662,15 @@ list_richcompare(PyObject *v, PyObject *w, int op) /* Search for the first index where items are different */ for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) { + PyObject *vitem = vl->ob_item[i]; + PyObject *witem = wl->ob_item[i]; + + Py_INCREF(vitem); + Py_INCREF(witem); int k = PyObject_RichCompareBool(vl->ob_item[i], wl->ob_item[i], Py_EQ); + Py_DECREF(vitem); + Py_DECREF(witem); if (k < 0) return NULL; if (!k) From dfef986f12dd92bd6434117bba0db3cbb4e65243 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 31 Dec 2019 10:58:37 +0900 Subject: [PATCH 032/380] bpo-38588: Optimize list comparison. (GH-17766) Mitigate performance regression of the list comparison caused by 2d5bf56. --- Objects/listobject.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Objects/listobject.c b/Objects/listobject.c index abe2604573f..bc8425cae63 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2664,6 +2664,9 @@ list_richcompare(PyObject *v, PyObject *w, int op) for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) { PyObject *vitem = vl->ob_item[i]; PyObject *witem = wl->ob_item[i]; + if (vitem == witem) { + continue; + } Py_INCREF(vitem); Py_INCREF(witem); From d0c92e81aa2171228a23cb2bed36f7dab975257d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Tue, 31 Dec 2019 05:31:52 +0300 Subject: [PATCH 033/380] closes bpo-37446: resolve undefined behavior in Python/hamt.c (GH-17727) --- Python/hamt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/hamt.c b/Python/hamt.c index ea659c800fc..f5586eec5b0 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -1864,7 +1864,7 @@ hamt_node_array_without(PyHamtNode_Array *self, continue; } - bitmap |= 1 << i; + bitmap |= 1U << i; if (IS_BITMAP_NODE(node)) { PyHamtNode_Bitmap *child = (PyHamtNode_Bitmap *)node; From 8e1f26e4f06c43cf52afa26ce30f27d2c1129c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D1=80=D0=B8=D1=81=20=D0=92=D0=B5=D1=80=D1=85?= =?UTF-8?q?=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D0=B9?= Date: Tue, 31 Dec 2019 07:28:18 -0500 Subject: [PATCH 034/380] Minor doc fixes in urllib.parse (GH-17745) --- Doc/library/urllib.parse.rst | 53 ++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 2d4d5a9e609..02f0c01e224 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -42,8 +42,8 @@ or on combining URL components into a URL string. Parse a URL into six components, returning a 6-item :term:`named tuple`. This corresponds to the general structure of a URL: ``scheme://netloc/path;parameters?query#fragment``. - Each tuple item is a string, possibly empty. The components are not broken up in - smaller parts (for example, the network location is a single string), and % + Each tuple item is a string, possibly empty. The components are not broken up + into smaller parts (for example, the network location is a single string), and % escapes are not expanded. The delimiters as shown above are not part of the result, except for a leading slash in the *path* component, which is retained if present. For example: @@ -328,22 +328,22 @@ or on combining URL components into a URL string. .. note:: - If *url* is an absolute URL (that is, starting with ``//`` or ``scheme://``), - the *url*'s host name and/or scheme will be present in the result. For example: + If *url* is an absolute URL (that is, it starts with ``//`` or ``scheme://``), + the *url*'s hostname and/or scheme will be present in the result. For example: - .. doctest:: + .. doctest:: - >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', - ... '//www.python.org/%7Eguido') - 'http://www.python.org/%7Eguido' + >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', + ... '//www.python.org/%7Eguido') + 'http://www.python.org/%7Eguido' - If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and - :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. + If you do not want that behavior, preprocess the *url* with :func:`urlsplit` and + :func:`urlunsplit`, removing possible *scheme* and *netloc* parts. .. versionchanged:: 3.5 - Behaviour updated to match the semantics defined in :rfc:`3986`. + Behavior updated to match the semantics defined in :rfc:`3986`. .. function:: urldefrag(url) @@ -521,11 +521,11 @@ task isn't already covered by the URL parsing functions above. Replace special characters in *string* using the ``%xx`` escape. Letters, digits, and the characters ``'_.-~'`` are never quoted. By default, this - function is intended for quoting the path section of URL. The optional *safe* - parameter specifies additional ASCII characters that should not be quoted - --- its default value is ``'/'``. + function is intended for quoting the path section of a URL. The optional + *safe* parameter specifies additional ASCII characters that should not be + quoted --- its default value is ``'/'``. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. .. versionchanged:: 3.7 Moved from :rfc:`2396` to :rfc:`3986` for quoting URL strings. "~" is now @@ -547,7 +547,7 @@ task isn't already covered by the URL parsing functions above. .. function:: quote_plus(string, safe='', encoding=None, errors=None) - Like :func:`quote`, but also replace spaces by plus signs, as required for + Like :func:`quote`, but also replace spaces with plus signs, as required for quoting HTML form values when building up a query string to go into a URL. Plus signs in the original string are escaped unless they are included in *safe*. It also does not have *safe* default to ``'/'``. @@ -566,12 +566,12 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote(string, encoding='utf-8', errors='replace') - Replace ``%xx`` escapes by their single-character equivalent. + Replace ``%xx`` escapes with their single-character equivalent. The optional *encoding* and *errors* parameters specify how to decode percent-encoded sequences into Unicode characters, as accepted by the :meth:`bytes.decode` method. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. *encoding* defaults to ``'utf-8'``. *errors* defaults to ``'replace'``, meaning invalid sequences are replaced @@ -587,8 +587,8 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote_plus(string, encoding='utf-8', errors='replace') - Like :func:`unquote`, but also replace plus signs by spaces, as required for - unquoting HTML form values. + Like :func:`unquote`, but also replace plus signs with spaces, as required + for unquoting HTML form values. *string* must be a :class:`str`. @@ -597,10 +597,10 @@ task isn't already covered by the URL parsing functions above. .. function:: unquote_to_bytes(string) - Replace ``%xx`` escapes by their single-octet equivalent, and return a + Replace ``%xx`` escapes with their single-octet equivalent, and return a :class:`bytes` object. - *string* may be either a :class:`str` or a :class:`bytes`. + *string* may be either a :class:`str` or a :class:`bytes` object. If it is a :class:`str`, unescaped non-ASCII characters in *string* are encoded into UTF-8 bytes. @@ -631,7 +631,7 @@ task isn't already covered by the URL parsing functions above. When a sequence of two-element tuples is used as the *query* argument, the first element of each tuple is a key and the second is a value. The value element in itself can be a sequence and in that case, if - the optional parameter *doseq* is evaluates to ``True``, individual + the optional parameter *doseq* evaluates to ``True``, individual ``key=value`` pairs separated by ``'&'`` are generated for each element of the value sequence for the key. The order of parameters in the encoded string will match the order of parameter tuples in the sequence. @@ -643,11 +643,12 @@ task isn't already covered by the URL parsing functions above. To reverse this encoding process, :func:`parse_qs` and :func:`parse_qsl` are provided in this module to parse query strings into Python data structures. - Refer to :ref:`urllib examples ` to find out how urlencode - method can be used for generating query string for a URL or data for POST. + Refer to :ref:`urllib examples ` to find out how the + :func:`urllib.parse.urlencode` method can be used for generating the query + string of a URL or data for a POST request. .. versionchanged:: 3.2 - Query parameter supports bytes and string objects. + *query* supports bytes and string objects. .. versionadded:: 3.5 *quote_via* parameter. From ba82ee894cf0f6ec9e9f6a313c870ffd2db377e6 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 31 Dec 2019 13:34:22 -0500 Subject: [PATCH 035/380] Fix idlelib README typo. (GH-17770) --- Lib/idlelib/README.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/README.txt b/Lib/idlelib/README.txt index 48a1f4a425c..bc3d978f43f 100644 --- a/Lib/idlelib/README.txt +++ b/Lib/idlelib/README.txt @@ -90,7 +90,7 @@ Configuration config-extensions.def # Defaults for extensions config-highlight.def # Defaults for colorizing config-keys.def # Defaults for key bindings -config-main.def # Defai;ts fpr font and geneal +config-main.def # Defaults for font and general tabs Text ---- From 37143a8e3b2e9245d52f4ddebbdd1c6121c96884 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 31 Dec 2019 21:40:58 -0500 Subject: [PATCH 036/380] bpo-39176: Improve error message for 'named assignment' (GH-17777) --- Lib/test/test_named_expressions.py | 4 ++-- Lib/test/test_syntax.py | 2 +- Python/ast.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index 01e26c8dfaf..3ae557f78d2 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -32,7 +32,7 @@ class NamedExpressionInvalidTest(unittest.TestCase): def test_named_expression_invalid_06(self): code = """((a, b) := (1, 2))""" - with self.assertRaisesRegex(SyntaxError, "cannot use named assignment with tuple"): + with self.assertRaisesRegex(SyntaxError, "cannot use assignment expressions with tuple"): exec(code, {}, {}) def test_named_expression_invalid_07(self): @@ -90,7 +90,7 @@ class NamedExpressionInvalidTest(unittest.TestCase): code = """(lambda: x := 1)""" with self.assertRaisesRegex(SyntaxError, - "cannot use named assignment with lambda"): + "cannot use assignment expressions with lambda"): exec(code, {}, {}) def test_named_expression_invalid_16(self): diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py index 3829746f179..128c4da1438 100644 --- a/Lib/test/test_syntax.py +++ b/Lib/test/test_syntax.py @@ -45,7 +45,7 @@ SyntaxError: cannot assign to True >>> (True := 1) Traceback (most recent call last): -SyntaxError: cannot use named assignment with True +SyntaxError: cannot use assignment expressions with True >>> obj.__debug__ = 1 Traceback (most recent call last): diff --git a/Python/ast.c b/Python/ast.c index e4e9b837d34..d5113f8e413 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1955,7 +1955,7 @@ ast_for_namedexpr(struct compiling *c, const node *n) if (target->kind != Name_kind) { const char *expr_name = get_expr_name(target); if (expr_name != NULL) { - ast_error(c, n, "cannot use named assignment with %s", expr_name); + ast_error(c, n, "cannot use assignment expressions with %s", expr_name); } return NULL; } From 22424c02e51fab3b62cbe255d0b87d1b55b9a6c3 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 1 Jan 2020 01:11:16 -0500 Subject: [PATCH 037/380] Document CodeType.replace (GH-17776) --- Doc/library/types.rst | 8 +++++++- Objects/clinic/codeobject.c.h | 4 ++-- Objects/codeobject.c | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 9393f9e6db9..3529c2b0edb 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -132,7 +132,7 @@ Standard names are defined for the following types: .. versionadded:: 3.6 -.. data:: CodeType +.. class:: CodeType(**kwargs) .. index:: builtin: compile @@ -143,6 +143,12 @@ Standard names are defined for the following types: Note that the audited arguments may not match the names or positions required by the initializer. + .. method:: CodeType.replace(**kwargs) + + Return a copy of the code object with new values for the specified fields. + + .. versionadded:: 3.8 + .. data:: CellType The type for cell objects: such objects are used as containers for diff --git a/Objects/clinic/codeobject.c.h b/Objects/clinic/codeobject.c.h index 6596de051ca..1dd82278cf3 100644 --- a/Objects/clinic/codeobject.c.h +++ b/Objects/clinic/codeobject.c.h @@ -11,7 +11,7 @@ PyDoc_STRVAR(code_replace__doc__, " co_lnotab=None)\n" "--\n" "\n" -"Return a new code object with new specified fields."); +"Return a copy of the code object with new values for the specified fields."); #define CODE_REPLACE_METHODDEF \ {"replace", (PyCFunction)(void(*)(void))code_replace, METH_FASTCALL|METH_KEYWORDS, code_replace__doc__}, @@ -253,4 +253,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=fade581d6313a0c2 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=27fe34e82106b220 input=a9049054013a1b77]*/ diff --git a/Objects/codeobject.c b/Objects/codeobject.c index f0b62ec9414..522e1a9f2a4 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -610,7 +610,7 @@ code.replace co_name: unicode(c_default="self->co_name") = None co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None -Return a new code object with new specified fields. +Return a copy of the code object with new values for the specified fields. [clinic start generated code]*/ static PyObject * @@ -622,7 +622,7 @@ code_replace_impl(PyCodeObject *self, int co_argcount, 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=77189e46579ec426]*/ +/*[clinic end generated code: output=25c8e303913bcace input=d9051bc8f24e6b28]*/ { #define CHECK_INT_ARG(ARG) \ if (ARG < 0) { \ From 46abfc1416ff8e450999611ef8f231ff871ab133 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Wed, 1 Jan 2020 19:32:11 +0000 Subject: [PATCH 038/380] bpo-39142: Avoid converting namedtuple instances to ConvertingTuple. (GH-17773) This uses the heuristic of assuming a named tuple is a subclass of tuple with a _fields attribute. This change means that contents of a named tuple wouldn't be converted - if a user wants to have ConvertingTuple functionality from a namedtuple, they will have to implement it themselves. --- Lib/logging/config.py | 2 +- Lib/test/test_logging.py | 31 +++++++++++++++++++ .../2019-12-31-19-27-23.bpo-39142.oqU5iD.rst | 5 +++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst diff --git a/Lib/logging/config.py b/Lib/logging/config.py index 4a3b8966ede..fd3aded7608 100644 --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -448,7 +448,7 @@ class BaseConfigurator(object): value = ConvertingList(value) value.configurator = self elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): + isinstance(value, tuple) and not hasattr(value, '_fields'): value = ConvertingTuple(value) value.configurator = self elif isinstance(value, str): # str for py3k diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 4feed03fec2..c38fdae0338 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3379,6 +3379,37 @@ class ConfigDictTest(BaseTest): self.assertRaises(ValueError, bc.convert, 'cfg://!') self.assertRaises(KeyError, bc.convert, 'cfg://adict[2]') + def test_namedtuple(self): + # see bpo-39142 + from collections import namedtuple + + class MyHandler(logging.StreamHandler): + def __init__(self, resource, *args, **kwargs): + super().__init__(*args, **kwargs) + self.resource: namedtuple = resource + + def emit(self, record): + record.msg += f' {self.resource.type}' + return super().emit(record) + + Resource = namedtuple('Resource', ['type', 'labels']) + resource = Resource(type='my_type', labels=['a']) + + config = { + 'version': 1, + 'handlers': { + 'myhandler': { + '()': MyHandler, + 'resource': resource + } + }, + 'root': {'level': 'INFO', 'handlers': ['myhandler']}, + } + with support.captured_stderr() as stderr: + self.apply_config(config) + logging.info('some log') + self.assertEqual(stderr.getvalue(), 'some log my_type\n') + class ManagerTest(BaseTest): def test_manager_loggerclass(self): logged = [] diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst new file mode 100644 index 00000000000..508d1338d7c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst @@ -0,0 +1,5 @@ +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. From 5b9077134cd0535f21905d5f5195847526cac99c Mon Sep 17 00:00:00 2001 From: Jendrik Seipp Date: Wed, 1 Jan 2020 23:21:43 +0100 Subject: [PATCH 039/380] bpo-13601: always use line-buffering for sys.stderr (GH-17646) --- Doc/library/sys.rst | 12 +++++++++--- Lib/test/test_cmd_line.py | 16 ++++++++++++++++ Misc/ACKS | 1 + .../2019-12-17-22-32-11.bpo-13601.vNP4LC.rst | 6 ++++++ Python/pylifecycle.c | 2 +- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index a824fb95e8e..0aae263ff5f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1446,9 +1446,15 @@ always available. for the Windows console, this only applies when :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also set. - * When interactive, ``stdout`` and ``stderr`` streams are line-buffered. - Otherwise, they are block-buffered like regular text files. You can - override this value with the :option:`-u` command-line option. + * When interactive, the ``stdout`` stream is line-buffered. Otherwise, + it is block-buffered like regular text files. The ``stderr`` stream + is line-buffered in both cases. You can make both streams unbuffered + by passing the :option:`-u` command-line option or setting the + :envvar:`PYTHONUNBUFFERED` environment variable. + + .. versionchanged:: 3.9 + Non-interactive ``stderr`` is now line-buffered instead of fully + buffered. .. note:: diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 47810020dd3..ee96473322d 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -6,6 +6,7 @@ import os import subprocess import sys import tempfile +import textwrap import unittest from test import support from test.support.script_helper import ( @@ -219,6 +220,21 @@ class CmdLineTest(unittest.TestCase): ) check_output(text) + def test_non_interactive_output_buffering(self): + code = textwrap.dedent(""" + import sys + out = sys.stdout + print(out.isatty(), out.write_through, out.line_buffering) + err = sys.stderr + print(err.isatty(), err.write_through, err.line_buffering) + """) + args = [sys.executable, '-c', code] + proc = subprocess.run(args, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, check=True) + self.assertEqual(proc.stdout, + 'False False False\n' + 'False False True\n') + def test_unbuffered_output(self): # Test expected operation of the '-u' switch for stream in ('stdout', 'stderr'): diff --git a/Misc/ACKS b/Misc/ACKS index 5ecbac13e0b..d3e683d4a08 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1510,6 +1510,7 @@ Steven Scott Nick Seidenman Michael Seifert Žiga Seilnacht +Jendrik Seipp Michael Selik Yury Selivanov Fred Sells diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst new file mode 100644 index 00000000000..f2c9495a59a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst @@ -0,0 +1,6 @@ +By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is +redirected to a file. You can still make ``sys.stderr`` unbuffered by +passing the :option:`-u` command-line option or setting the +:envvar:`PYTHONUNBUFFERED` environment variable. + +(Contributed by Jendrik Seipp in bpo-13601.) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 4f05dfc3490..94bbbdb560e 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1817,7 +1817,7 @@ create_stdio(const PyConfig *config, PyObject* io, write_through = Py_True; else write_through = Py_False; - if (isatty && buffered_stdio) + if (buffered_stdio && (isatty || fd == fileno(stderr))) line_buffering = Py_True; else line_buffering = Py_False; From 149175c6dfc8455023e4335575f3fe3d606729f9 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Wed, 1 Jan 2020 19:26:33 -0300 Subject: [PATCH 040/380] bpo-39183: Fix formatting in library/ensurepip (GH-17787) Remove extra space to fix formatting and avoid from splitting text in to strings. https://bugs.python.org/issue39183 --- Doc/library/ensurepip.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index a2bb045e57e..a5221250c40 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -74,7 +74,7 @@ options: script will *not* be installed. * ``--default-pip``: if a "default pip" installation is requested, the - ``pip`` script will be installed in addition to the two regular scripts. + ``pip`` script will be installed in addition to the two regular scripts. Providing both of the script selection options will trigger an exception. From 04ec7a1f7a5b92187a73cd02670958444c6f2220 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 2 Jan 2020 11:38:44 +0000 Subject: [PATCH 041/380] bpo-39114: Fix tracing of except handlers with name binding (GH-17769) When producing the bytecode of exception handlers with name binding (like `except Exception as e`) we need to produce a try-finally block to make sure that the name is deleted after the handler is executed to prevent cycles in the stack frame objects. The bytecode associated with this try-finally block does not have source lines associated and it was causing problems when the tracing functionality was running over it. --- Lib/test/test_sys_settrace.py | 45 +++++++++++++++++++ .../2019-12-31-18-25-45.bpo-39114.WG9alt.rst | 2 + Python/ceval.c | 4 +- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 0af015aa56b..a0d1122fad8 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -481,6 +481,51 @@ class TraceTestCase(unittest.TestCase): [(0, 'call'), (1, 'line')]) + def test_18_except_with_name(self): + def func(): + try: + try: + raise Exception + except Exception as e: + raise + x = "Something" + y = "Something" + except Exception: + pass + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (4, 'line'), + (5, 'line'), + (8, 'line'), + (9, 'line'), + (9, 'return')]) + + def test_19_except_with_finally(self): + def func(): + try: + try: + raise Exception + finally: + y = "Something" + except Exception: + b = 23 + + self.run_and_compare(func, + [(0, 'call'), + (1, 'line'), + (2, 'line'), + (3, 'line'), + (3, 'exception'), + (5, 'line'), + (6, 'line'), + (7, 'line'), + (7, 'return')]) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst new file mode 100644 index 00000000000..d742af9d326 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst @@ -0,0 +1,2 @@ +Fix incorrent line execution reporting in trace functions when tracing +exception handlers with name binding. Patch by Pablo Galindo. diff --git a/Python/ceval.c b/Python/ceval.c index 96ed329b0d9..bd9454b2812 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3610,7 +3610,9 @@ exception_unwind: PUSH(val); PUSH(exc); JUMPTO(handler); - if (_Py_TracingPossible(ceval)) { + if (_Py_TracingPossible(ceval) && + ((f->f_lasti < instr_lb || f->f_lasti >= instr_ub) || + !(f->f_lasti == instr_lb || f->f_lasti < instr_prev))) { /* Make sure that we trace line after exception */ instr_prev = INT_MAX; } From 78018bb1621e5ecb61cba6e664d14ff789d2874c Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Fri, 3 Jan 2020 04:32:55 +1100 Subject: [PATCH 042/380] Remove outdated mention of hg.exe from Tools/msi/README.txt (GH-17792) --- Tools/msi/README.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/msi/README.txt b/Tools/msi/README.txt index f5656b971b3..82635f3d2c2 100644 --- a/Tools/msi/README.txt +++ b/Tools/msi/README.txt @@ -11,7 +11,7 @@ Tools/msi/buildrelease.bat script and environment variables: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -106,7 +106,7 @@ Tools/msi/buildrelease.bat script: set PYTHON= set SPHINXBUILD= - set PATH=; + set PATH=; ;%PATH% buildrelease.bat [-x86] [-x64] [-D] [-B] @@ -131,7 +131,7 @@ installer. Official releases of Python must be signed. Ensure %PYTHON% and %SPHINXBUILD% are set when passing this option. You may also set %HTMLHELP% to the Html Help Compiler (hhc.exe), or put HHC -on your PATH or in externals/. You will also need Mercurial (hg.exe) on +on your PATH or in externals/. You will also need Git (git.exe) on your PATH. If WiX is not found on your system, it will be automatically downloaded From 7b35bef9787cd80ed1e12124f759b4be03c849db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Thu, 2 Jan 2020 21:20:04 +0300 Subject: [PATCH 043/380] bpo-38870: Throw ValueError on invalid yield from usage (GH-17798) --- Lib/ast.py | 8 ++++---- Lib/test/test_unparse.py | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 62f6e075a09..ece8b139e46 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -735,10 +735,10 @@ class _Unparser(NodeVisitor): def visit_YieldFrom(self, node): with self.delimit("(", ")"): - self.write("yield from") - if node.value: - self.write(" ") - self.traverse(node.value) + self.write("yield from ") + if not node.value: + raise ValueError("Node can't be used without a value attribute.") + self.traverse(node.value) def visit_Raise(self, node): self.fill("raise") diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 49767dbac16..e8b0d4b06f9 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -278,6 +278,8 @@ class UnparseTestCase(ASTTestCase): def test_invalid_set(self): self.check_invalid(ast.Set(elts=[])) + def test_invalid_yield_from(self): + self.check_invalid(ast.YieldFrom(value=None)) class DirectoryTestCase(ASTTestCase): """Test roundtrip behaviour on all files in Lib and Lib/test.""" From 946b29ea0b3b386ed05e87e60b8617c9dc19cd53 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 2 Jan 2020 18:56:34 -0800 Subject: [PATCH 044/380] Bring Python into the next decade. (GH-17801) --- Doc/copyright.rst | 2 +- Doc/license.rst | 2 +- LICENSE | 2 +- Mac/IDLE/IDLE.app/Contents/Info.plist | 2 +- Mac/PythonLauncher/Info.plist.in | 2 +- Mac/Resources/app/Info.plist.in | 2 +- Python/getcopyright.c | 2 +- README.rst | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/copyright.rst b/Doc/copyright.rst index 393a1f03751..1b90d9f172c 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright © 2001-2019 Python Software Foundation. All rights reserved. +Copyright © 2001-2020 Python Software Foundation. All rights reserved. Copyright © 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst index 810d2e63fd4..472a5cf3d88 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -87,7 +87,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2019 Python Software Foundation; All Rights + copyright, i.e., "Copyright © 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. diff --git a/LICENSE b/LICENSE index 9dc010d8034..66a3ac80d72 100644 --- a/LICENSE +++ b/LICENSE @@ -73,7 +73,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. diff --git a/Mac/IDLE/IDLE.app/Contents/Info.plist b/Mac/IDLE/IDLE.app/Contents/Info.plist index 04a0a08c836..dcc48abdd2a 100644 --- a/Mac/IDLE/IDLE.app/Contents/Info.plist +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %version%, © 2001-2019 Python Software Foundation + %version%, © 2001-2020 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier diff --git a/Mac/PythonLauncher/Info.plist.in b/Mac/PythonLauncher/Info.plist.in index 9fb4e0affd9..21a051535fb 100644 --- a/Mac/PythonLauncher/Info.plist.in +++ b/Mac/PythonLauncher/Info.plist.in @@ -40,7 +40,7 @@ CFBundleExecutable Python Launcher CFBundleGetInfoString - %VERSION%, © 2001-2019 Python Software Foundation + %VERSION%, © 2001-2020 Python Software Foundation CFBundleIconFile PythonLauncher.icns CFBundleIdentifier diff --git a/Mac/Resources/app/Info.plist.in b/Mac/Resources/app/Info.plist.in index b7581984dd6..66b5e764c54 100644 --- a/Mac/Resources/app/Info.plist.in +++ b/Mac/Resources/app/Info.plist.in @@ -37,7 +37,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - %version%, (c) 2001-2019 Python Software Foundation. + %version%, (c) 2001-2020 Python Software Foundation. CFBundleName Python CFBundlePackageType diff --git a/Python/getcopyright.c b/Python/getcopyright.c index 27a1731f46d..299ccc08c44 100644 --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static const char cprt[] = "\ -Copyright (c) 2001-2019 Python Software Foundation.\n\ +Copyright (c) 2001-2020 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ diff --git a/README.rst b/README.rst index ae56ff02527..e8fd598a61e 100644 --- a/README.rst +++ b/README.rst @@ -22,7 +22,7 @@ This is Python version 3.9.0 alpha 2 :target: https://python.zulipchat.com -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. See the end of this file for further copyright and license information. @@ -250,7 +250,7 @@ See :pep:`596` for Python 3.9 release details. Copyright and License Information --------------------------------- -Copyright (c) 2001-2019 Python Software Foundation. All rights reserved. +Copyright (c) 2001-2020 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. All rights reserved. From 32f1443aa98db769d87db497b45bd0dcb732445b Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Thu, 2 Jan 2020 22:28:37 -0500 Subject: [PATCH 045/380] Update copyright year in macOS installer license copy (GH-17806) --- Mac/BuildScript/resources/License.rtf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf index 7566cf3b446..25d53386da0 100644 --- a/Mac/BuildScript/resources/License.rtf +++ b/Mac/BuildScript/resources/License.rtf @@ -1,5 +1,5 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf600 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fmodern\fcharset0 CourierNewPS-BoldMT; +{\rtf1\ansi\ansicpg1252\cocoartf2511 +\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;;} @@ -55,7 +55,7 @@ Thanks to the many outside volunteers who have worked under Guido's direction to \f1\b0 \ 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation.\ \ -2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ +2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright \'a9 2001-2020 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee.\ \ 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python.\ \ From 4fcf5c12a37a8d3d8d6303c44c223dbc8d568cfd Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 2 Jan 2020 22:21:18 -0700 Subject: [PATCH 046/380] bpo-39158: ast.literal_eval() doesn't support empty sets (GH-17742) --- Doc/library/ast.rst | 3 +++ Lib/ast.py | 3 +++ Lib/test/test_ast.py | 1 + .../next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst | 1 + 4 files changed, 8 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 190d9286eff..c380a81bee6 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -194,6 +194,9 @@ and classes for traversing abstract syntax trees: .. versionchanged:: 3.2 Now allows bytes and set literals. + .. versionchanged:: 3.9 + Now supports creating empty sets with ``'set()'``. + .. function:: get_docstring(node, clean=True) diff --git a/Lib/ast.py b/Lib/ast.py index ece8b139e46..495c0d618f1 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -83,6 +83,9 @@ def literal_eval(node_or_string): return list(map(_convert, node.elts)) elif isinstance(node, Set): return set(map(_convert, node.elts)) + elif (isinstance(node, Call) and isinstance(node.func, Name) and + node.func.id == 'set' and node.args == node.keywords == []): + return set() elif isinstance(node, Dict): return dict(zip(map(_convert, node.keys), map(_convert, node.values))) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 51a7c1af1ff..55b91cfa23b 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -891,6 +891,7 @@ Module( self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None)) self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3}) self.assertEqual(ast.literal_eval('b"hi"'), b"hi") + self.assertEqual(ast.literal_eval('set()'), set()) self.assertRaises(ValueError, ast.literal_eval, 'foo()') self.assertEqual(ast.literal_eval('6'), 6) self.assertEqual(ast.literal_eval('+6'), 6) diff --git a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst new file mode 100644 index 00000000000..c41799bebae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst @@ -0,0 +1 @@ +ast.literal_eval() now supports empty sets. From b789202cbedd93898c29b08a44ca085bf0723d81 Mon Sep 17 00:00:00 2001 From: Emmanuel Nosa E Date: Fri, 3 Jan 2020 13:10:16 +0100 Subject: [PATCH 047/380] Add link to zlib v1.1.3 vulnerability (GH-17156) --- Doc/library/zlib.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 339acfd0e57..ec60ea24db6 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -9,9 +9,9 @@ For applications that require data compression, the functions in this module allow compression and decompression, using the zlib library. The zlib library -has its own home page at http://www.zlib.net. There are known +has its own home page at https://www.zlib.net. There are known incompatibilities between the Python module and versions of the zlib library -earlier than 1.1.3; 1.1.3 has a security vulnerability, so we recommend using +earlier than 1.1.3; 1.1.3 has a `security vulnerability `_, so we recommend using 1.1.4 or later. zlib's functions have many options and often need to be used in a particular @@ -337,4 +337,3 @@ the following constants: http://www.zlib.net/manual.html The zlib manual explains the semantics and usage of the library's many functions. - From e02ab59fdffa0bb841182c30ef1355c89578d945 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Fri, 3 Jan 2020 05:16:12 -0700 Subject: [PATCH 048/380] bpo-38532: Add missing decrefs in PyCFuncPtr_FromDll() (GH-16857) --- Modules/_ctypes/_ctypes.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index d38d892be62..93af497bda2 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3554,10 +3554,12 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds) if (PySys_Audit("ctypes.dlsym", ((uintptr_t)name & ~0xFFFF) ? "Os" : "On", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #else if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) { + Py_DECREF(ftuple); return NULL; } #endif From 3a5de511596f17575de082dcb8d43d63b2bd2da9 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sat, 4 Jan 2020 11:10:14 +0200 Subject: [PATCH 049/380] Fix #39191: Don't spawn a task before failing (#17796) --- Lib/asyncio/base_events.py | 10 +++++++--- .../Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index adcdec171b0..e53ca738034 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -573,14 +573,17 @@ class BaseEventLoop(events.AbstractEventLoop): except Exception as ex: self.call_soon_threadsafe(future.set_exception, ex) - def run_forever(self): - """Run until stop() is called.""" - self._check_closed() + def _check_runnung(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: raise RuntimeError( 'Cannot run the event loop while another loop is running') + + def run_forever(self): + """Run until stop() is called.""" + self._check_closed() + self._check_runnung() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -612,6 +615,7 @@ class BaseEventLoop(events.AbstractEventLoop): Return the Future's result, or raise its exception. """ self._check_closed() + self._check_runnung() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst new file mode 100644 index 00000000000..138c93c2e48 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst @@ -0,0 +1,3 @@ +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. From 7dc72b8d4f2c9d1eed20f314fd6425eab66cbc89 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Sat, 4 Jan 2020 23:56:31 +1100 Subject: [PATCH 050/380] bpo-28367: Add additional baud rates for termios (GH-13142) Co-authored-by: Andrey Smirnov . Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- .../2019-05-06-22-38-47.bpo-28367.2AKen5.rst | 13 ++++++++ Modules/termios.c | 33 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst new file mode 100644 index 00000000000..115f458bfbf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst @@ -0,0 +1,13 @@ +Termios magic constants for the following baud rates: + - B500000 + - B576000 + - B921600 + - B1000000 + - B1152000 + - B1500000 + - B2000000 + - B2500000 + - B3000000 + - B3500000 + - B4000000 +Patch by Andrey Smirnov \ No newline at end of file diff --git a/Modules/termios.c b/Modules/termios.c index b3b8c72bf6b..0fd93c06c72 100644 --- a/Modules/termios.c +++ b/Modules/termios.c @@ -613,6 +613,39 @@ static struct constant { #ifdef B460800 {"B460800", B460800}, #endif +#ifdef B500000 + {"B500000", B500000}, +#endif +#ifdef B576000 + { "B576000", B576000}, +#endif +#ifdef B921600 + { "B921600", B921600}, +#endif +#ifdef B1000000 + { "B1000000", B1000000}, +#endif +#ifdef B1152000 + { "B1152000", B1152000}, +#endif +#ifdef B1500000 + { "B1500000", B1500000}, +#endif +#ifdef B2000000 + { "B2000000", B2000000}, +#endif +#ifdef B2500000 + { "B2500000", B2500000}, +#endif +#ifdef B3000000 + { "B3000000", B3000000}, +#endif +#ifdef B3500000 + { "B3500000", B3500000}, +#endif +#ifdef B4000000 + { "B4000000", B4000000}, +#endif #ifdef CBAUD {"CBAUD", CBAUD}, #endif From ec007cb43faf5f33d06efbc28152c7fdcb2edb9c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 4 Jan 2020 20:57:21 -0500 Subject: [PATCH 051/380] Fix SystemError when nested function has annotation on positional-only argument (GH-17826) --- Lib/test/test_positional_only_arg.py | 7 +++++++ .../2020-01-04-17-25-34.bpo-39215.xiqiIz.rst | 2 ++ Python/symtable.c | 2 ++ 3 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 59b0b8fb556..63dee7ca434 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -15,6 +15,10 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b +def global_inner_has_pos_only(): + def f(x: int, /): ... + return f + class PositionalOnlyTestCase(unittest.TestCase): @@ -412,6 +416,9 @@ class PositionalOnlyTestCase(unittest.TestCase): self.assertEqual(C().method(), sentinel) + def test_annotations(self): + assert global_inner_has_pos_only().__annotations__ == {'x': int} + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst new file mode 100644 index 00000000000..9a3178f9c62 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst @@ -0,0 +1,2 @@ +Fix ``SystemError`` when nested function has annotation on positional-only +argument - by Anthony Sottile. diff --git a/Python/symtable.c b/Python/symtable.c index b8713588b9a..30482d99b3c 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1717,6 +1717,8 @@ static int symtable_visit_annotations(struct symtable *st, stmt_ty s, arguments_ty a, expr_ty returns) { + if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs)) + return 0; if (a->args && !symtable_visit_argannotations(st, a->args)) return 0; if (a->vararg && a->vararg->annotation) From 6a265f0d0c0a4b3b8fecf4275d49187a384167f4 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 5 Jan 2020 14:14:31 +0200 Subject: [PATCH 052/380] bpo-39057: Fix urllib.request.proxy_bypass_environment(). (GH-17619) Ignore leading dots and no longer ignore a trailing newline. --- Lib/test/test_urllib.py | 22 +++++++++++++++++ Lib/urllib/parse.py | 4 ++-- Lib/urllib/request.py | 24 ++++++++++--------- .../2019-12-15-21-47-54.bpo-39057.FOxn-w.rst | 2 ++ 4 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 95c4ecc4dcf..2e82fc7b7b8 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -270,14 +270,36 @@ class ProxyTests(unittest.TestCase): self.assertTrue(bypass('localhost')) self.assertTrue(bypass('LocalHost')) # MixedCase self.assertTrue(bypass('LOCALHOST')) # UPPERCASE + self.assertTrue(bypass('.localhost')) self.assertTrue(bypass('newdomain.com:1234')) + self.assertTrue(bypass('.newdomain.com:1234')) self.assertTrue(bypass('foo.d.o.t')) # issue 29142 + self.assertTrue(bypass('d.o.t')) self.assertTrue(bypass('anotherdomain.com:8888')) + self.assertTrue(bypass('.anotherdomain.com:8888')) self.assertTrue(bypass('www.newdomain.com:1234')) self.assertFalse(bypass('prelocalhost')) self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + def test_proxy_bypass_environment_always_match(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', '*') + self.assertTrue(bypass('newdomain.com')) + self.assertTrue(bypass('newdomain.com:1234')) + self.env.set('NO_PROXY', '*, anotherdomain.com') + self.assertTrue(bypass('anotherdomain.com')) + self.assertFalse(bypass('newdomain.com')) + self.assertFalse(bypass('newdomain.com:1234')) + + def test_proxy_bypass_environment_newline(self): + bypass = urllib.request.proxy_bypass_environment + self.env.set('NO_PROXY', + 'localhost, anotherdomain.com, newdomain.com:1234') + self.assertFalse(bypass('localhost\n')) + self.assertFalse(bypass('anotherdomain.com:8888\n')) + self.assertFalse(bypass('newdomain.com:1234\n')) + class ProxyTests_withOrderedEnv(unittest.TestCase): diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 31fd7e16ee7..34d5f95dd79 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -1056,9 +1056,9 @@ def _splitport(host): """splitport('host:port') --> 'host', 'port'.""" global _portprog if _portprog is None: - _portprog = re.compile('(.*):([0-9]*)$', re.DOTALL) + _portprog = re.compile('(.*):([0-9]*)', re.DOTALL) - match = _portprog.match(host) + match = _portprog.fullmatch(host) if match: host, port = match.groups() if port: diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 39553d809a3..a6d350a97a4 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2492,24 +2492,26 @@ def proxy_bypass_environment(host, proxies=None): try: no_proxy = proxies['no'] except KeyError: - return 0 + return False # '*' is special case for always bypass if no_proxy == '*': - return 1 + return True + host = host.lower() # strip port off host hostonly, port = _splitport(host) # check if the host ends with any of the DNS suffixes - no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')] - for name in no_proxy_list: + for name in no_proxy.split(','): + name = name.strip() if name: name = name.lstrip('.') # ignore leading dots - name = re.escape(name) - pattern = r'(.+\.)?%s$' % name - if (re.match(pattern, hostonly, re.I) - or re.match(pattern, host, re.I)): - return 1 + name = name.lower() + if hostonly == name or host == name: + return True + name = '.' + name + if hostonly.endswith(name) or host.endswith(name): + return True # otherwise, don't bypass - return 0 + return False # This code tests an OSX specific data structure but is testable on all @@ -2635,7 +2637,7 @@ elif os.name == 'nt': for p in proxyServer.split(';'): protocol, address = p.split('=', 1) # See if address has a type:// prefix - if not re.match('^([^/:]+)://', address): + if not re.match('(?:[^/:]+)://', address): address = '%s://%s' % (protocol, address) proxies[protocol] = address else: diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst new file mode 100644 index 00000000000..24a17444b97 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst @@ -0,0 +1,2 @@ +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. From 41ec17e45d54473d32f543396293256f1581e44d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 5 Jan 2020 14:15:27 +0200 Subject: [PATCH 053/380] bpo-39056: Fix handling invalid warning category in the -W option. (GH-17618) No longer import the re module if it is not needed. --- Lib/test/test_warnings/__init__.py | 23 ++++++++++++++ Lib/warnings.py | 30 ++++++++----------- .../2019-12-15-21-05-16.bpo-39056.nEfUM9.rst | 2 ++ 3 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 3a6d64eaad1..c6fb097ae6d 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -43,6 +43,10 @@ def warnings_state(module): module.filters = original_filters +class TestWarning(Warning): + pass + + class BaseTest: """Basic bookkeeping required for testing.""" @@ -566,9 +570,28 @@ class WCmdLineTests(BaseTest): self.module._setoption, 'bogus::Warning') self.assertRaises(self.module._OptionError, self.module._setoption, 'ignore:2::4:-5') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::123abc') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::===') + with self.assertRaisesRegex(self.module._OptionError, 'Wärning'): + self.module._setoption('ignore::Wärning') self.module._setoption('error::Warning::0') self.assertRaises(UserWarning, self.module.warn, 'convert to error') + def test_import_from_module(self): + with original_warnings.catch_warnings(module=self.module): + self.module._setoption('ignore::Warning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::TestWarning') + with self.assertRaises(self.module._OptionError): + self.module._setoption('ignore::test.test_warnings.bogus') + self.module._setoption('error::test.test_warnings.TestWarning') + with self.assertRaises(TestWarning): + self.module.warn('test warning', TestWarning) + class CWCmdLineTests(WCmdLineTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py index 00f740ca3a9..691ccddfa45 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -211,7 +211,6 @@ def _processoptions(args): # Helper for _processoptions() def _setoption(arg): - import re parts = arg.split(':') if len(parts) > 5: raise _OptionError("too many fields (max 5): %r" % (arg,)) @@ -220,11 +219,13 @@ def _setoption(arg): action, message, category, module, lineno = [s.strip() for s in parts] action = _getaction(action) - message = re.escape(message) category = _getcategory(category) - module = re.escape(module) + if message or module: + import re + if message: + message = re.escape(message) if module: - module = module + '$' + module = re.escape(module) + r'\Z' if lineno: try: lineno = int(lineno) @@ -248,26 +249,21 @@ def _getaction(action): # Helper for _setoption() def _getcategory(category): - import re if not category: return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + if '.' not in category: + import builtins as m + klass = category else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] + module, _, klass = category.rpartition('.') try: m = __import__(module, None, None, [klass]) except ImportError: raise _OptionError("invalid module name: %r" % (module,)) from None - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) from None + try: + cat = getattr(m, klass) + except AttributeError: + raise _OptionError("unknown warning category: %r" % (category,)) from None if not issubclass(cat, Warning): raise _OptionError("invalid warning category: %r" % (category,)) return cat diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst new file mode 100644 index 00000000000..d5d2b98e9b0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst @@ -0,0 +1,2 @@ +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. From b19c0d77e6f25ea831ab608c71f15d0d9266c8c4 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 5 Jan 2020 14:15:50 +0200 Subject: [PATCH 054/380] bpo-39055: Reject a trailing \n in base64.b64decode() with validate=True. (GH-17616) --- Lib/base64.py | 2 +- Lib/test/test_base64.py | 1 + .../next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst diff --git a/Lib/base64.py b/Lib/base64.py index 2be9c395a96..2e70223dfe7 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -82,7 +82,7 @@ def b64decode(s, altchars=None, validate=False): altchars = _bytes_from_decode_data(altchars) assert len(altchars) == 2, repr(altchars) s = s.translate(bytes.maketrans(altchars, b'+/')) - if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): + if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s): raise binascii.Error('Non-base64 digit found') return binascii.a2b_base64(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 2a4cc2acad2..7dba6635d4e 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -250,6 +250,7 @@ class BaseXYTestCase(unittest.TestCase): (b'3d}==', b'\xdd'), (b'@@', b''), (b'!', b''), + (b"YWJj\n", b"abc"), (b'YWJj\nYWI=', b'abcab')) funcs = ( base64.b64decode, diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst new file mode 100644 index 00000000000..83b1431e92f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst @@ -0,0 +1,2 @@ +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``. From 5ea7bb25e3b192d6c49a49c9e3b316f8559602aa Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 5 Jan 2020 11:23:58 -0500 Subject: [PATCH 055/380] bpo-39152: add missing ttk.Scale.configure return value (GH-17815) tkinter.ttk.Scale().configure([name]) now returns a configuration tuple for name or a list thereof for all options. Based on patch Giovanni Lombardo. --- Lib/tkinter/test/widget_tests.py | 13 ++++--------- Lib/tkinter/ttk.py | 5 +++-- .../2020-01-03-18-02-50.bpo-39152.JgPjCC.rst | 2 ++ 3 files changed, 9 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst diff --git a/Lib/tkinter/test/widget_tests.py b/Lib/tkinter/test/widget_tests.py index 75a068fbbf2..b42ff52178f 100644 --- a/Lib/tkinter/test/widget_tests.py +++ b/Lib/tkinter/test/widget_tests.py @@ -3,7 +3,6 @@ import unittest import sys import tkinter -from tkinter.ttk import Scale from tkinter.test.support import (AbstractTkTest, tcl_version, requires_tcl, get_tk_patchlevel, pixels_conv, tcl_obj_eq) import test.support @@ -63,11 +62,9 @@ class AbstractWidgetTest(AbstractTkTest): eq = tcl_obj_eq self.assertEqual2(widget[name], expected, eq=eq) self.assertEqual2(widget.cget(name), expected, eq=eq) - # XXX - if not isinstance(widget, Scale): - t = widget.configure(name) - self.assertEqual(len(t), 5) - self.assertEqual2(t[4], expected, eq=eq) + t = widget.configure(name) + self.assertEqual(len(t), 5) + self.assertEqual2(t[4], expected, eq=eq) def checkInvalidParam(self, widget, name, value, errmsg=None, *, keep_orig=True): @@ -209,9 +206,7 @@ class AbstractWidgetTest(AbstractTkTest): def test_keys(self): widget = self.create() keys = widget.keys() - # XXX - if not isinstance(widget, Scale): - self.assertEqual(sorted(keys), sorted(widget.configure())) + self.assertEqual(sorted(keys), sorted(widget.configure())) for k in keys: widget[k] # Test if OPTIONS contains all keys diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py index 573544dd84a..c7c71cd5a55 100644 --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -1084,11 +1084,12 @@ class Scale(Widget, tkinter.Scale): Setting a value for any of the "from", "from_" or "to" options generates a <> event.""" - if cnf: + retval = Widget.configure(self, cnf, **kw) + if not isinstance(cnf, (type(None), str)): kw.update(cnf) - Widget.configure(self, **kw) if any(['from' in kw, 'from_' in kw, 'to' in kw]): self.event_generate('<>') + return retval def get(self, x=None, y=None): diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst new file mode 100644 index 00000000000..abb3df0da0f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst @@ -0,0 +1,2 @@ +Fix ttk.Scale.configure([name]) to return configuration tuple for name +or all options. Giovanni Lombardo contributed part of the patch. From b121a4a45ff4bab8812a9b26ceffe5ad642f5d5a Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 5 Jan 2020 12:03:56 -0500 Subject: [PATCH 056/380] Fix constant folding optimization for positional only arguments (GH-17837) --- Lib/test/test_positional_only_arg.py | 12 ++++++++++++ .../2020-01-05-06-55-52.bpo-39216.74jLh9.rst | 2 ++ Python/ast_opt.c | 1 + 3 files changed, 15 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 63dee7ca434..2ef40e3a5a1 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -1,5 +1,6 @@ """Unit tests for the positional only argument syntax specified in PEP 570.""" +import dis import pickle import unittest @@ -419,6 +420,17 @@ class PositionalOnlyTestCase(unittest.TestCase): def test_annotations(self): assert global_inner_has_pos_only().__annotations__ == {'x': int} + 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), UNARY_NOT + # with constant folding we should expect a COMPARE_OP(is not) + codes = [(i.opname, i.argval) for i in dis.get_instructions(g)] + self.assertNotIn(('UNARY_NOT', None), codes) + self.assertIn(('COMPARE_OP', 'is not'), codes) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst new file mode 100644 index 00000000000..971b0655297 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst @@ -0,0 +1,2 @@ +Fix constant folding optimization for positional only arguments - by Anthony +Sottile. diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 96c766fc095..f2a2c259149 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -617,6 +617,7 @@ astfold_comprehension(comprehension_ty node_, PyArena *ctx_, int optimize_) static int astfold_arguments(arguments_ty node_, PyArena *ctx_, int optimize_) { + CALL_SEQ(astfold_arg, arg_ty, node_->posonlyargs); CALL_SEQ(astfold_arg, arg_ty, node_->args); CALL_OPT(astfold_arg, arg_ty, node_->vararg); CALL_SEQ(astfold_arg, arg_ty, node_->kwonlyargs); From 4b66fa6ce9c37e70b55af220d0e07368319de803 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 5 Jan 2020 17:30:53 +0000 Subject: [PATCH 057/380] bpo-39200: Correct the error message for range() empty constructor (GH-17813) Co-authored-by: Serhiy Storchaka --- Lib/test/test_range.py | 13 ++++ .../2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst | 2 + Objects/rangeobject.c | 71 +++++++++++-------- 3 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index 73cbcc4717d..30fa129b50e 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -91,6 +91,19 @@ class RangeTest(unittest.TestCase): r = range(-sys.maxsize, sys.maxsize, 2) self.assertEqual(len(r), sys.maxsize) + def test_range_constructor_error_messages(self): + with self.assertRaisesRegex( + TypeError, + "range expected at least 1 argument, got 0" + ): + range() + + with self.assertRaisesRegex( + TypeError, + "range expected at most 3 arguments, got 6" + ): + range(1, 2, 3, 4, 5, 6) + def test_large_operands(self): x = range(10**20, 10**20+10, 3) self.assertEqual(len(x), 4) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst new file mode 100644 index 00000000000..e5cb396643f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst @@ -0,0 +1,2 @@ +Correct the error message when trying to construct :class:`range` objects +with no arguments. Patch by Pablo Galindo. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 239ace6f423..9311f8b1f17 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -77,37 +77,52 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (!_PyArg_NoKeywords("range", kw)) return NULL; - if (PyTuple_Size(args) <= 1) { - if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) - return NULL; - stop = PyNumber_Index(stop); - if (!stop) - return NULL; - Py_INCREF(_PyLong_Zero); - start = _PyLong_Zero; - Py_INCREF(_PyLong_One); - step = _PyLong_One; - } - else { - if (!PyArg_UnpackTuple(args, "range", 2, 3, - &start, &stop, &step)) - return NULL; + Py_ssize_t num_args = PyTuple_GET_SIZE(args); + switch (num_args) { + case 3: + step = PyTuple_GET_ITEM(args, 2); + /* fallthrough */ + case 2: + start = PyTuple_GET_ITEM(args, 0); + start = PyNumber_Index(start); + if (!start) { + return NULL; + } - /* Convert borrowed refs to owned refs */ - start = PyNumber_Index(start); - if (!start) + stop = PyTuple_GET_ITEM(args, 1); + stop = PyNumber_Index(stop); + if (!stop) { + Py_DECREF(start); + return NULL; + } + + step = validate_step(step); + if (!step) { + Py_DECREF(start); + Py_DECREF(stop); + return NULL; + } + break; + case 1: + stop = PyTuple_GET_ITEM(args, 0); + stop = PyNumber_Index(stop); + if (!stop) { + return NULL; + } + Py_INCREF(_PyLong_Zero); + start = _PyLong_Zero; + Py_INCREF(_PyLong_One); + step = _PyLong_One; + break; + case 0: + PyErr_SetString(PyExc_TypeError, + "range expected at least 1 argument, got 0"); return NULL; - stop = PyNumber_Index(stop); - if (!stop) { - Py_DECREF(start); + default: + PyErr_Format(PyExc_TypeError, + "range expected at most 3 arguments, got %zd", + num_args); return NULL; - } - step = validate_step(step); /* Caution, this can clear exceptions */ - if (!step) { - Py_DECREF(start); - Py_DECREF(stop); - return NULL; - } } obj = make_range_object(type, start, stop, step); From 422ed16fb846eec0b5b2a4eb3a978c9862615665 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 5 Jan 2020 18:52:39 +0000 Subject: [PATCH 058/380] Organise and clean test_positional_only_arg and add more tests (GH-17842) --- Lib/test/test_positional_only_arg.py | 37 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index 2ef40e3a5a1..bf332e55259 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -16,11 +16,6 @@ def global_pos_only_and_normal(a, /, b): def global_pos_only_defaults(a=1, /, b=2): return a, b -def global_inner_has_pos_only(): - def f(x: int, /): ... - return f - - class PositionalOnlyTestCase(unittest.TestCase): def assertRaisesSyntaxError(self, codestr, regex="invalid syntax"): @@ -266,12 +261,6 @@ class PositionalOnlyTestCase(unittest.TestCase): with self.assertRaisesRegex(TypeError, expected): Example().f(1, b=2) - def test_mangling(self): - class X: - def f(self, *, __a=42): - return __a - self.assertEqual(X().f(), 42) - def test_module_function(self): with self.assertRaisesRegex(TypeError, r"f\(\) missing 2 required positional arguments: 'a' and 'b'"): global_pos_only_f() @@ -307,6 +296,29 @@ class PositionalOnlyTestCase(unittest.TestCase): with self.assertRaisesRegex(TypeError, r"g\(\) takes 2 positional arguments but 3 were given"): f(1,2)(3,4,5) + def test_annotations_in_closures(self): + + def inner_has_pos_only(): + def f(x: int, /): ... + return f + + 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} + + def multiple_levels(): + def inner_has_pos_only(): + def f(x: int, /): ... + return f + return inner_has_pos_only() + + assert multiple_levels().__annotations__ == {'x': int} + def test_same_keyword_as_positional_with_kwargs(self): def f(something,/,**kwargs): return (something, kwargs) @@ -417,9 +429,6 @@ class PositionalOnlyTestCase(unittest.TestCase): self.assertEqual(C().method(), sentinel) - def test_annotations(self): - assert global_inner_has_pos_only().__annotations__ == {'x': int} - def test_annotations_constant_fold(self): def g(): def f(x: not (int is int), /): ... From e6ae90dede07e8599cc6906417ca4aa99d8aa6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oleg=20H=C3=B6fling?= Date: Sun, 5 Jan 2020 23:08:14 +0100 Subject: [PATCH 059/380] Replace links in howto/pyporting.rst with sphinx references (GH-17781) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Oleg Höfling --- Doc/howto/pyporting.rst | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst index f7d12a1565c..1543823c104 100644 --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -125,7 +125,7 @@ Once you have your code well-tested you are ready to begin porting your code to Python 3! But to fully understand how your code is going to change and what you want to look out for while you code, you will want to learn what changes Python 3 makes in terms of Python 2. Typically the two best ways of doing that -is reading the `"What's New"`_ doc for each release of Python 3 and the +is reading the :ref:`"What's New" ` doc for each release of Python 3 and the `Porting to Python 3`_ book (which is free online). There is also a handy `cheat sheet`_ from the Python-Future project. @@ -308,10 +308,10 @@ If for some reason that doesn't work then you should make the version check be against Python 2 and not Python 3. To help explain this, let's look at an example. -Let's pretend that you need access to a feature of importlib_ that +Let's pretend that you need access to a feature of :mod:`importlib` that is available in Python's standard library since Python 3.3 and available for Python 2 through importlib2_ on PyPI. You might be tempted to write code to -access e.g. the ``importlib.abc`` module by doing the following:: +access e.g. the :mod:`importlib.abc` module by doing the following:: import sys @@ -432,12 +432,10 @@ can also explicitly state whether your APIs use textual or binary data, helping to make sure everything functions as expected in both versions of Python. -.. _2to3: https://docs.python.org/3/library/2to3.html .. _caniusepython3: https://pypi.org/project/caniusepython3 .. _cheat sheet: http://python-future.org/compatible_idioms.html .. _coverage.py: https://pypi.org/project/coverage .. _Futurize: http://python-future.org/automatic_conversion.html -.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib .. _importlib2: https://pypi.org/project/importlib2 .. _Modernize: https://python-modernize.readthedocs.io/ .. _mypy: http://mypy-lang.org/ @@ -453,6 +451,4 @@ to make sure everything functions as expected in both versions of Python. .. _tox: https://pypi.org/project/tox .. _trove classifier: https://pypi.org/classifiers -.. _"What's New": https://docs.python.org/3/whatsnew/index.html - .. _Why Python 3 exists: https://snarky.ca/why-python-3-exists From abc0c4fa9970931849b3da598c5980a5b170661e Mon Sep 17 00:00:00 2001 From: HongWeipeng <961365124@qq.com> Date: Sun, 5 Jan 2020 16:20:29 -0600 Subject: [PATCH 060/380] Fix the parameter list of object. _rpow_ (#GH-16477) --- 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 c242041c73d..1442fbeb33d 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -2331,7 +2331,7 @@ left undefined. object.__rfloordiv__(self, other) object.__rmod__(self, other) object.__rdivmod__(self, other) - object.__rpow__(self, other) + object.__rpow__(self, other[, modulo]) object.__rlshift__(self, other) object.__rrshift__(self, other) object.__rand__(self, other) From 94d9cfc4ed9dd3c4a3a359bc194b4dc3f6ba63eb Mon Sep 17 00:00:00 2001 From: Khalid Mammadov Date: Sun, 5 Jan 2020 22:39:38 +0000 Subject: [PATCH 061/380] bpo-39130: Dict reversed was added in v3.8 so should say in the doc as well (GH-17694) To be consistent with document layout, it should say when the feature was added. Although it's mentioned few other places in the doc but it's not explicitly say that at that place. https://bugs.python.org/issue39130 --- Doc/library/stdtypes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index c4588f89c06..3e25faaa427 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -4351,6 +4351,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: Return a reverse iterator over the keys of the dictionary. This is a shortcut for ``reversed(d.keys())``. + .. versionadded:: 3.8 + .. method:: setdefault(key[, default]) If *key* is in the dictionary, return its value. If not, insert *key* From d6c08db8538d046d783db44fe4e70a60af0fb02e Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Mon, 6 Jan 2020 01:51:48 +0200 Subject: [PATCH 062/380] Minor formatting improvements and fixes to idle.rst (GH-17165) --- Doc/library/idle.rst | 15 ++++++++------- Lib/idlelib/help.html | 15 ++++++++------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 273b5830e42..f15f46b788b 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -370,7 +370,8 @@ Paste Editor windows also have breakpoint functions. Lines with a breakpoint set are specially marked. Breakpoints only have an effect when running under the -debugger. Breakpoints for a file are saved in the user's .idlerc directory. +debugger. Breakpoints for a file are saved in the user's ``.idlerc`` +directory. Set Breakpoint Set a breakpoint on the current line. @@ -685,14 +686,14 @@ crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing the error box or Restart Shell on the Shell menu may fix a temporary problem. When IDLE first starts, it attempts to read user configuration files in -~/.idlerc/ (~ is one's home directory). If there is a problem, an error +``~/.idlerc/`` (~ is one's home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files. If IDLE quits with no message, and it was not started from a console, try -starting from a console (``python -m idlelib)`` and see if a message appears. +starting from a console (``python -m idlelib``) and see if a message appears. Running user code ^^^^^^^^^^^^^^^^^ @@ -863,13 +864,13 @@ Or click the TOC (Table of Contents) button and select a section header in the opened box. Help menu entry "Python Docs" opens the extensive sources of help, -including tutorials, available at docs.python.org/x.y, where 'x.y' +including tutorials, available at ``docs.python.org/x.y``, where 'x.y' is the currently running Python version. If your system has an off-line copy of the docs (this may be an installation option), that will be opened instead. Selected URLs can be added or removed from the help menu at any time using the -General tab of the Configure IDLE dialog . +General tab of the Configure IDLE dialog. .. _preferences: @@ -878,9 +879,9 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user's +Non-default user settings are saved in a ``.idlerc`` directory in the user's home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc. +by editing or deleting one or more of the files in ``.idlerc``. On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 09dc4c57bcd..0b2bdd2e174 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -382,7 +382,8 @@ Context menus have the standard clipboard functions also on the Edit menu.

Editor windows also have breakpoint functions. Lines with a breakpoint set are specially marked. Breakpoints only have an effect when running under the -debugger. Breakpoints for a file are saved in the user’s .idlerc directory.

+debugger. Breakpoints for a file are saved in the user’s .idlerc +directory.

Set Breakpoint

Set a breakpoint on the current line.

@@ -638,13 +639,13 @@ Manager to detect and stop one. Sometimes a restart initiated by a program crash or Keyboard Interrupt (control-C) may fail to connect. Dismissing the error box or Restart Shell on the Shell menu may fix a temporary problem.

When IDLE first starts, it attempts to read user configuration files in -~/.idlerc/ (~ is one’s home directory). If there is a problem, an error +~/.idlerc/ (~ is one’s home directory). If there is a problem, an error message should be displayed. Leaving aside random disk glitches, this can be prevented by never editing the files by hand, using the configuration dialog, under Options, instead Options. Once it happens, the solution may be to delete one or more of the configuration files.

If IDLE quits with no message, and it was not started from a console, try -starting from a console (python -m idlelib) and see if a message appears.

+starting from a console (python -m idlelib) and see if a message appears.

Running user code

@@ -791,20 +792,20 @@ the scrollbar, or up and down arrow keys held down. Or click the TOC (Table of Contents) button and select a section header in the opened box.

Help menu entry “Python Docs” opens the extensive sources of help, -including tutorials, available at docs.python.org/x.y, where ‘x.y’ +including tutorials, available at docs.python.org/x.y, where ‘x.y’ is the currently running Python version. If your system has an off-line copy of the docs (this may be an installation option), that will be opened instead.

Selected URLs can be added or removed from the help menu at any time using the -General tab of the Configure IDLE dialog .

+General tab of the Configure IDLE dialog.

Setting preferences

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. -Non-default user settings are saved in a .idlerc directory in the user’s +Non-default user settings are saved in a .idlerc directory in the user’s home directory. Problems caused by bad user configuration files are solved -by editing or deleting one or more of the files in .idlerc.

+by editing or deleting one or more of the files in .idlerc.

On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add other characters of personal interest. Use the sample to select From ee94bdb0598f9bc47d6a49e58fffc97aa617be96 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 5 Jan 2020 22:32:19 -0500 Subject: [PATCH 063/380] bpo-38907: In http.server script, restore binding to IPv4 on Windows. (GH-17851) --- Lib/http/server.py | 14 +++++++++++++- .../2020-01-06-02-14-38.bpo-38907.F1RkCR.rst | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 47a4fcf9a65..b9a2717681f 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1282,4 +1282,16 @@ if __name__ == '__main__': else: handler_class = partial(SimpleHTTPRequestHandler, directory=args.directory) - test(HandlerClass=handler_class, port=args.port, bind=args.bind) + + # ensure dual-stack is not disabled; ref #38907 + class DualStackServer(ThreadingHTTPServer): + def server_bind(self): + self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + return super().server_bind() + + test( + HandlerClass=handler_class, + ServerClass=DualStackServer, + port=args.port, + bind=args.bind, + ) diff --git a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst new file mode 100644 index 00000000000..a6e79f78095 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst @@ -0,0 +1 @@ +In http.server script, restore binding to IPv4 on Windows. \ No newline at end of file From 5136e721d7d9eae62ffad17328566b2315e42c00 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Mon, 6 Jan 2020 19:46:04 +0900 Subject: [PATCH 064/380] argument-clinic: Simplify multi-line string handling (GH-17852) --- Tools/clinic/clinic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 403d8a47656..b503932e262 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1182,14 +1182,14 @@ class CLanguage(Language): lines = [self.group_to_variable_name(g) + " = 1;" for g in group_ids] lines = "\n".join(lines) - s = """ + s = """\ case {count}: if (!PyArg_ParseTuple(args, "{format_units}:{name}", {parse_arguments})) {{ goto exit; }} {group_booleans} break; -"""[1:] +""" s = linear_format(s, group_booleans=lines) s = s.format_map(d) add(s) From 7cdc31a14c824000cbe8b487900c9826a33f6940 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Mon, 6 Jan 2020 07:59:36 -0500 Subject: [PATCH 065/380] bpo-38907: Suppress any exception when attempting to set V6ONLY. (GH-17864) Fixes error attempting to bind to IPv4 address. --- Lib/http/server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/http/server.py b/Lib/http/server.py index b9a2717681f..c6e5ed6ea0e 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -103,6 +103,7 @@ import socketserver import sys import time import urllib.parse +import contextlib from functools import partial from http import HTTPStatus @@ -1286,7 +1287,10 @@ if __name__ == '__main__': # ensure dual-stack is not disabled; ref #38907 class DualStackServer(ThreadingHTTPServer): def server_bind(self): - self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + # suppress exception when protocol is IPv4 + with contextlib.suppress(Exception): + self.socket.setsockopt( + socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) return super().server_bind() test( From 075ebad369d94342624792a41d3055c907bfa436 Mon Sep 17 00:00:00 2001 From: Chandan Singh Date: Mon, 6 Jan 2020 15:18:16 +0000 Subject: [PATCH 066/380] Fix link to bpo issue in Changelog (GH-17692) --- 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 60d0ea5a99b..50478c08e90 100644 --- a/Misc/NEWS.d/3.9.0a2.rst +++ b/Misc/NEWS.d/3.9.0a2.rst @@ -453,7 +453,7 @@ determined index was bogus. Patch by Claudiu Popa .. -.. bpo: 38668 +.. bpo: 38688 .. date: 2019-11-22-10-45-03 .. nonce: iKx23z .. section: Library From 5ec91f78d59d9c39b984f284e00cd04b96ddb5db Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 6 Jan 2020 15:59:09 +0000 Subject: [PATCH 067/380] bpo-39209: Manage correctly multi-line tokens in interactive mode (GH-17860) --- Lib/test/test_repl.py | 36 +++++++++++++++++++ .../2020-01-06-10-29-16.bpo-39209.QHAONe.rst | 2 ++ Parser/tokenizer.c | 2 ++ 3 files changed, 40 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 9efd459a6f0..71f192f90d9 100644 --- a/Lib/test/test_repl.py +++ b/Lib/test/test_repl.py @@ -58,5 +58,41 @@ class TestInteractiveInterpreter(unittest.TestCase): # Exit code 120: Py_FinalizeEx() failed to flush stdout and stderr. self.assertIn(p.returncode, (1, 120)) + @cpython_only + def test_multiline_string_parsing(self): + # bpo-39209: Multiline string tokens need to be handled in the tokenizer + # in two places: the interactive path and the non-interactive path. + user_input = '''\ + x = """ + + + + + 0KiB + 0 + 1.3 + 0 + + + 16738211KiB + 237.15 + 1.3 + 0 + + never + none + + + """ + ''' + user_input = dedent(user_input) + user_input = user_input.encode() + p = spawn_repl() + with SuppressCrashReport(): + p.stdin.write(user_input) + output = kill_python(p) + self.assertEqual(p.returncode, 0) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst new file mode 100644 index 00000000000..c05b3f8dfa4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst @@ -0,0 +1,2 @@ +Correctly handle multi-line tokens in interactive mode. Patch by Pablo +Galindo. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f84093dae5b..f73c32684c7 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -886,6 +886,7 @@ tok_nextc(struct tok_state *tok) size_t start = tok->start - tok->buf; size_t oldlen = tok->cur - tok->buf; 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); tok->lineno++; @@ -898,6 +899,7 @@ tok_nextc(struct tok_state *tok) } tok->buf = buf; tok->cur = tok->buf + oldlen; + tok->multi_line_start = tok->buf + cur_multi_line_start; tok->line_start = tok->cur; strcpy(tok->buf + oldlen, newtok); PyMem_FREE(newtok); From 7b79dc9200a19ecbac667111dffd58e314be02a8 Mon Sep 17 00:00:00 2001 From: Anthony Wee Date: Mon, 6 Jan 2020 08:57:34 -0800 Subject: [PATCH 068/380] bpo-29778: Fix incorrect NULL check in _PyPathConfig_InitDLLPath() (GH-17818) --- Python/pathconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 363b7686bc4..6abc648769f 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -150,7 +150,7 @@ _PyWideStringList_Join(const PyWideStringList *list, wchar_t sep) static PyStatus _PyPathConfig_InitDLLPath(void) { - if (_Py_dll_path == NULL) { + if (_Py_dll_path != NULL) { /* Already set: nothing to do */ return _PyStatus_OK(); } From 2e9012a3e1e316c54e27f51ba5849ba06eab7da2 Mon Sep 17 00:00:00 2001 From: YoSTEALTH <35307184+YoSTEALTH@users.noreply.github.com> Date: Mon, 6 Jan 2020 13:53:36 -0600 Subject: [PATCH 069/380] bpo-39234: Doc: `enum.auto()` incrementation value not specified. (GH-17872) * `enum.auto()` initial value is now specified as being `1`. --- Doc/library/enum.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 1d6912aaf19..cfe3c207e1e 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. + Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From b1ce22d086660d2505010694c8813cc67adf8f9e Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 6 Jan 2020 13:23:10 -0800 Subject: [PATCH 070/380] bpo-39041: Fix coverage upload command for GitHub Actions (GH-17873) https://bugs.python.org/issue39041 Automerge-Triggered-By: @zooba --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index cb05e8e2f71..e8b47b390e5 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -64,7 +64,7 @@ jobs: || true - name: 'Publish code coverage results' run: | - ./.venv/bin/python -m coverage xml + source ./.venv/bin/activate bash <(curl -s https://codecov.io/bash) env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 24bcefcb74231476b055bb6f0726642abeb10f04 Mon Sep 17 00:00:00 2001 From: YoSTEALTH <35307184+YoSTEALTH@users.noreply.github.com> Date: Mon, 6 Jan 2020 16:04:43 -0600 Subject: [PATCH 071/380] bpo-39234: `enum.auto()` default initial value as 1 (GH-17878) Updated as Eric mentioned "By default, the initial value starts at 1" https://bugs.python.org/issue39234 Automerge-Triggered-By: @ericvsmith --- Doc/library/enum.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index cfe3c207e1e..eaf29cfde23 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -55,7 +55,7 @@ helper, :class:`auto`. .. class:: auto - Instances are replaced with an appropriate value for Enum members. Initial value starts at 1. + Instances are replaced with an appropriate value for Enum members. By default, the initial value starts at 1. .. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto`` From f4800b8ed3dbe15a0078869a836d968ab3362b8c Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 7 Jan 2020 15:52:44 +0900 Subject: [PATCH 072/380] Doc: Change Python 2 status to EOL. (GH-17885) --- Doc/tools/templates/indexsidebar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html index c51dcc7582e..4730a5fe5db 100644 --- a/Doc/tools/templates/indexsidebar.html +++ b/Doc/tools/templates/indexsidebar.html @@ -7,7 +7,7 @@

  • {% trans %}Python 3.7 (stable){% endtrans %}
  • {% trans %}Python 3.6 (security-fixes){% endtrans %}
  • {% trans %}Python 3.5 (security-fixes){% endtrans %}
  • -
  • {% trans %}Python 2.7 (stable){% endtrans %}
  • +
  • {% trans %}Python 2.7 (EOL){% endtrans %}
  • {% trans %}All versions{% endtrans %}
  • From ca94677a6216e2d41b04574986ce49d31a0b329c Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 7 Jan 2020 16:58:40 +0900 Subject: [PATCH 073/380] bpo-38623: Doc: Add section for site module CLI. (GH-17858) --- Doc/library/site.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/site.rst b/Doc/library/site.rst index e1ca160c107..b424e1ba348 100644 --- a/Doc/library/site.rst +++ b/Doc/library/site.rst @@ -236,6 +236,13 @@ Module contents .. versionadded:: 3.2 +.. _site-commandline: + +Command Line Interface +---------------------- + +.. program:: site + The :mod:`site` module also provides a way to get the user directories from the command line: @@ -244,8 +251,6 @@ command line: $ python3 -m site --user-site /home/user/.local/lib/python3.3/site-packages -.. program:: site - If it is called without arguments, it will print the contents of :data:`sys.path` on the standard output, followed by the value of :data:`USER_BASE` and whether the directory exists, then the same thing for From 10ac0cded26d91c3468e5e5a87cecad7fc0bcebd Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Tue, 7 Jan 2020 15:23:01 +0200 Subject: [PATCH 074/380] bpo-39191: Fix RuntimeWarning in asyncio test (GH-17863) https://bugs.python.org/issue39191 --- Lib/asyncio/base_events.py | 6 +++--- Lib/test/test_asyncio/test_events.py | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index e53ca738034..d78724b0153 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -573,7 +573,7 @@ class BaseEventLoop(events.AbstractEventLoop): except Exception as ex: self.call_soon_threadsafe(future.set_exception, ex) - def _check_runnung(self): + def _check_running(self): if self.is_running(): raise RuntimeError('This event loop is already running') if events._get_running_loop() is not None: @@ -583,7 +583,7 @@ class BaseEventLoop(events.AbstractEventLoop): def run_forever(self): """Run until stop() is called.""" self._check_closed() - self._check_runnung() + self._check_running() self._set_coroutine_origin_tracking(self._debug) self._thread_id = threading.get_ident() @@ -615,7 +615,7 @@ class BaseEventLoop(events.AbstractEventLoop): Return the Future's result, or raise its exception. """ self._check_closed() - self._check_runnung() + self._check_running() new_task = not futures.isfuture(future) future = tasks.ensure_future(future, loop=self) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 4cbd1ed4712..4bdf82ef175 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -259,8 +259,12 @@ class EventLoopTestsMixin: self.assertTrue(self.loop.is_running()) self.loop.run_until_complete(coro1()) - self.assertRaises( - RuntimeError, self.loop.run_until_complete, coro2()) + with self.assertWarnsRegex( + RuntimeWarning, + r"coroutine \S+ was never awaited" + ): + self.assertRaises( + RuntimeError, self.loop.run_until_complete, coro2()) # Note: because of the default Windows timing granularity of # 15.6 msec, we use fairly long sleep times here (~100 msec). From 5b23f7618d434f3000bde482233c8642a6eb2c67 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 7 Jan 2020 15:00:02 +0100 Subject: [PATCH 075/380] bpo-39239: epoll.unregister() no longer ignores EBADF (GH-17882) The select.epoll.unregister() method no longer ignores the EBADF error. --- Doc/library/select.rst | 3 +++ Doc/whatsnew/3.9.rst | 4 ++++ Lib/test/test_epoll.py | 5 ++++- .../next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst | 2 ++ Modules/selectmodule.c | 5 ----- 5 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst diff --git a/Doc/library/select.rst b/Doc/library/select.rst index 8f5a2cea925..bb2809580d0 100644 --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -355,6 +355,9 @@ Edge and Level Trigger Polling (epoll) Objects Remove a registered file descriptor from the epoll object. + .. versionchanged:: 3.9 + The method no longer ignores the :data:`~errno.EBADF` error. + .. method:: epoll.poll(timeout=None, maxevents=-1) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ff0fc24f317..46774c28c6a 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -382,6 +382,10 @@ Changes in the Python API * The :mod:`venv` activation scripts no longer special-case when ``__VENV_PROMPT__`` is set to ``""``. +* The :meth:`select.epoll.unregister` method no longer ignores the + :data:`~errno.EBADF` error. + (Contributed by Victor Stinner in :issue:`39239`.) + CPython bytecode changes ------------------------ diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py index 8ac0f31d805..10f148fe5cd 100644 --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -225,7 +225,10 @@ class TestEPoll(unittest.TestCase): self.assertFalse(then - now > 0.01) server.close() - ep.unregister(fd) + + with self.assertRaises(OSError) as cm: + ep.unregister(fd) + self.assertEqual(cm.exception.errno, errno.EBADF) def test_close(self): open_file = open(__file__, "rb") diff --git a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst new file mode 100644 index 00000000000..2a1c9290869 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst @@ -0,0 +1,2 @@ +The :meth:`select.epoll.unregister` method no longer ignores the +:data:`~errno.EBADF` error. diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 79cc1b26555..7c6d7e4a15e 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -1447,11 +1447,6 @@ pyepoll_internal_ctl(int epfd, int op, int fd, unsigned int events) * though this argument is ignored. */ Py_BEGIN_ALLOW_THREADS result = epoll_ctl(epfd, op, fd, &ev); - if (errno == EBADF) { - /* fd already closed */ - result = 0; - errno = 0; - } Py_END_ALLOW_THREADS break; default: From 950c6795aa0ffa85e103a13e7a04e08cb34c66ad Mon Sep 17 00:00:00 2001 From: Derek Brown Date: Tue, 7 Jan 2020 08:40:23 -0800 Subject: [PATCH 076/380] bpo-39198: Ensure logging global lock is released on exception in isEnabledFor (GH-17689) --- Lib/logging/__init__.py | 15 +++++++++------ .../2020-01-02-20-21-03.bpo-39198.nzwGyG.rst | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 62a87a71b1a..59d5fa5b64d 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1687,12 +1687,15 @@ class Logger(Filterer): return self._cache[level] except KeyError: _acquireLock() - if self.manager.disable >= level: - is_enabled = self._cache[level] = False - else: - is_enabled = self._cache[level] = level >= self.getEffectiveLevel() - _releaseLock() - + try: + if self.manager.disable >= level: + is_enabled = self._cache[level] = False + else: + is_enabled = self._cache[level] = ( + level >= self.getEffectiveLevel() + ) + finally: + _releaseLock() return is_enabled def getChild(self, suffix): diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst new file mode 100644 index 00000000000..ec4e81e2bbe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst @@ -0,0 +1 @@ +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file From 13a7ee8d62dafe7d2291708312fa2a86e171c7fa Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 8 Jan 2020 02:28:10 +0900 Subject: [PATCH 077/380] bpo-38615: Add timeout parameter for IMAP4 and IMAP4_SSL constructor (GH-17203) imaplib.IMAP4 and imaplib.IMAP4_SSL now have an optional *timeout* parameter for their constructors. Also, the imaplib.IMAP4.open() method now has an optional *timeout* parameter with this change. The overridden methods of imaplib.IMAP4_SSL and imaplib.IMAP4_stream were applied to this change. --- Doc/library/imaplib.rst | 37 ++++++++++++----- Doc/whatsnew/3.9.rst | 10 +++++ Lib/imaplib.py | 40 ++++++++++++------- Lib/test/test_imaplib.py | 23 +++++++++++ .../2019-11-17-17-32-35.bpo-38615.OVyaNX.rst | 5 +++ 5 files changed, 90 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst diff --git a/Doc/library/imaplib.rst b/Doc/library/imaplib.rst index df63d820cfe..5b8ca7ce68f 100644 --- a/Doc/library/imaplib.rst +++ b/Doc/library/imaplib.rst @@ -30,12 +30,14 @@ Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the base class: -.. class:: IMAP4(host='', port=IMAP4_PORT) +.. class:: IMAP4(host='', port=IMAP4_PORT, timeout=None) This class implements the actual IMAP4 protocol. The connection is created and protocol version (IMAP4 or IMAP4rev1) is determined when the instance is initialized. If *host* is not specified, ``''`` (the local host) is used. If - *port* is omitted, the standard IMAP4 port (143) is used. + *port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout* + parameter specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout is used. The :class:`IMAP4` class supports the :keyword:`with` statement. When used like this, the IMAP4 ``LOGOUT`` command is issued automatically when the @@ -50,6 +52,9 @@ base class: .. versionchanged:: 3.5 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + Three exceptions are defined as attributes of the :class:`IMAP4` class: @@ -78,7 +83,7 @@ There's also a subclass for secure connections: .. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, \ - certfile=None, ssl_context=None) + certfile=None, ssl_context=None, timeout=None) This is a subclass derived from :class:`IMAP4` that connects over an SSL encrypted socket (to use this class you need a socket module that was compiled @@ -95,8 +100,12 @@ There's also a subclass for secure connections: mutually exclusive with *ssl_context*, a :class:`ValueError` is raised if *keyfile*/*certfile* is provided along with *ssl_context*. + The optional *timeout* parameter specifies a timeout in seconds for the + connection attempt. If timeout is not given or is None, the global default + socket timeout is used. + .. versionchanged:: 3.3 - *ssl_context* parameter added. + *ssl_context* parameter was added. .. versionchanged:: 3.4 The class now supports hostname check with @@ -110,6 +119,8 @@ There's also a subclass for secure connections: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. The second subclass allows for connections created by a child process: @@ -353,16 +364,22 @@ An :class:`IMAP4` instance has the following methods: Send ``NOOP`` to server. -.. method:: IMAP4.open(host, port) +.. method:: IMAP4.open(host, port, timeout=None) - Opens socket to *port* at *host*. This method is implicitly called by - the :class:`IMAP4` constructor. The connection objects established by this - method will be used in the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, - :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override - this method. + Opens socket to *port* at *host*. The optional *timeout* parameter + specifies a timeout in seconds for the connection attempt. + If timeout is not given or is None, the global default socket timeout + is used. Also note that if the *timeout* parameter is set to be zero, + it will raise a :class:`ValueError` to reject creating a non-blocking socket. + This method is implicitly called by the :class:`IMAP4` constructor. + The connection objects established by this method will be used in + the :meth:`IMAP4.read`, :meth:`IMAP4.readline`, :meth:`IMAP4.send`, + and :meth:`IMAP4.shutdown` methods. You may override this method. .. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open + .. versionchanged:: 3.9 + The *timeout* parameter was added. .. method:: IMAP4.partial(message_num, message_part, start, length) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 46774c28c6a..ea6d8f515a9 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -167,6 +167,16 @@ When the garbage collector makes a collection in which some objects resurrect been executed), do not block the collection of all objects that are still unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) +imaplib +------- + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have +an optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. +(Contributed by Dong-hee Na in :issue:`38615`.) + os -- diff --git a/Lib/imaplib.py b/Lib/imaplib.py index a4f499383ef..abfdd737779 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -135,10 +135,13 @@ class IMAP4: r"""IMAP4 client class. - Instantiate with: IMAP4([host[, port]]) + Instantiate with: IMAP4([host[, port[, timeout=None]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 port). + timeout - socket timeout (default: None) + If timeout is not given or is None, + the global default socket timeout is used All IMAP4rev1 commands are supported by methods of the same name (in lower-case). @@ -181,7 +184,7 @@ class IMAP4: class abort(error): pass # Service errors - close and retry class readonly(abort): pass # Mailbox status changed to READ-ONLY - def __init__(self, host='', port=IMAP4_PORT): + def __init__(self, host='', port=IMAP4_PORT, timeout=None): self.debug = Debug self.state = 'LOGOUT' self.literal = None # A literal argument to a command @@ -195,7 +198,7 @@ class IMAP4: # Open socket to server. - self.open(host, port) + self.open(host, port, timeout) try: self._connect() @@ -284,15 +287,20 @@ class IMAP4: # Overridable methods - def _create_socket(self): + def _create_socket(self, timeout): # Default value of IMAP4.host is '', but socket.getaddrinfo() # (which is used by socket.create_connection()) expects None # as a default value for host. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') host = None if not self.host else self.host sys.audit("imaplib.open", self, self.host, self.port) - return socket.create_connection((host, self.port)) + address = (host, self.port) + if timeout is not None: + return socket.create_connection(address, timeout) + return socket.create_connection(address) - def open(self, host = '', port = IMAP4_PORT): + def open(self, host='', port=IMAP4_PORT, timeout=None): """Setup connection to remote server on "host:port" (default: localhost:standard IMAP4 port). This connection will be used by the routines: @@ -300,7 +308,7 @@ class IMAP4: """ self.host = host self.port = port - self.sock = self._create_socket() + self.sock = self._create_socket(timeout) self.file = self.sock.makefile('rb') @@ -1261,7 +1269,7 @@ if HAVE_SSL: """IMAP4 client class over SSL connection - Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]]) + Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout=None]]]]]]) host - host's name (default: localhost); port - port number (default: standard IMAP4 SSL port); @@ -1271,13 +1279,15 @@ if HAVE_SSL: and private key (default: None) Note: if ssl_context is provided, then parameters keyfile or certfile should not be set otherwise ValueError is raised. + timeout - socket timeout (default: None) If timeout is not given or is None, + the global default socket timeout is used for more documentation see the docstring of the parent class IMAP4. """ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, - certfile=None, ssl_context=None): + certfile=None, ssl_context=None, timeout=None): if ssl_context is not None and keyfile is not None: raise ValueError("ssl_context and keyfile arguments are mutually " "exclusive") @@ -1294,20 +1304,20 @@ if HAVE_SSL: ssl_context = ssl._create_stdlib_context(certfile=certfile, keyfile=keyfile) self.ssl_context = ssl_context - IMAP4.__init__(self, host, port) + IMAP4.__init__(self, host, port, timeout) - def _create_socket(self): - sock = IMAP4._create_socket(self) + def _create_socket(self, timeout): + sock = IMAP4._create_socket(self, timeout) return self.ssl_context.wrap_socket(sock, server_hostname=self.host) - def open(self, host='', port=IMAP4_SSL_PORT): + def open(self, host='', port=IMAP4_SSL_PORT, timeout=None): """Setup connection to remote server on "host:port". (default: localhost:standard IMAP4 SSL port). This connection will be used by the routines: read, readline, send, shutdown. """ - IMAP4.open(self, host, port) + IMAP4.open(self, host, port, timeout) __all__.append("IMAP4_SSL") @@ -1329,7 +1339,7 @@ class IMAP4_stream(IMAP4): IMAP4.__init__(self) - def open(self, host = None, port = None): + def open(self, host=None, port=None, timeout=None): """Setup a stream connection. This connection will be used by the routines: read, readline, send, shutdown. diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 795276e0a7a..91aa77126a2 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -440,6 +440,29 @@ class NewIMAPTestsMixin(): with self.imap_class(*server.server_address): pass + def test_imaplib_timeout_test(self): + _, server = self._setup(SimpleIMAPHandler) + addr = server.server_address[1] + client = self.imap_class("localhost", addr, timeout=None) + self.assertEqual(client.sock.timeout, None) + client.shutdown() + client = self.imap_class("localhost", addr, timeout=support.LOOPBACK_TIMEOUT) + self.assertEqual(client.sock.timeout, support.LOOPBACK_TIMEOUT) + client.shutdown() + with self.assertRaises(ValueError): + client = self.imap_class("localhost", addr, timeout=0) + + def test_imaplib_timeout_functionality_test(self): + class TimeoutHandler(SimpleIMAPHandler): + def handle(self): + time.sleep(1) + SimpleIMAPHandler.handle(self) + + _, server = self._setup(TimeoutHandler) + addr = server.server_address[1] + with self.assertRaises(socket.timeout): + client = self.imap_class("localhost", addr, timeout=0.001) + def test_with_statement(self): _, server = self._setup(SimpleIMAPHandler, connect=False) with self.imap_class(*server.server_address) as imap: diff --git a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst new file mode 100644 index 00000000000..04f51da0db7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst @@ -0,0 +1,5 @@ +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an +optional *timeout* parameter for their constructors. +Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by Dong-hee Na. From b821173b5458d137c8d5edb6e9b4997aac800a38 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 8 Jan 2020 02:30:55 +0900 Subject: [PATCH 078/380] bpo-38871: Fix lib2to3 for filter-based statements that contain lambda (GH-17780) Correctly parenthesize filter-based statements that contain lambda expressions in lib2to3. --- Lib/lib2to3/fixes/fix_filter.py | 10 +++++++--- Lib/lib2to3/tests/test_fixers.py | 5 +++++ .../Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst diff --git a/Lib/lib2to3/fixes/fix_filter.py b/Lib/lib2to3/fixes/fix_filter.py index a7a5a154f6f..38e9078f11a 100644 --- a/Lib/lib2to3/fixes/fix_filter.py +++ b/Lib/lib2to3/fixes/fix_filter.py @@ -17,7 +17,7 @@ Python 2.6 figure it out. from .. import fixer_base from ..pytree import Node from ..pygram import python_symbols as syms -from ..fixer_util import Name, ArgList, ListComp, in_special_context +from ..fixer_util import Name, ArgList, ListComp, in_special_context, parenthesize class FixFilter(fixer_base.ConditionalFix): @@ -65,10 +65,14 @@ class FixFilter(fixer_base.ConditionalFix): trailers.append(t.clone()) if "filter_lambda" in results: + xp = results.get("xp").clone() + if xp.type == syms.test: + xp.prefix = "" + xp = parenthesize(xp) + new = ListComp(results.get("fp").clone(), results.get("fp").clone(), - results.get("it").clone(), - results.get("xp").clone()) + results.get("it").clone(), xp) new = Node(syms.power, [new] + trailers, prefix="") elif "none" in results: diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py index 3da5dd845c9..a2852419818 100644 --- a/Lib/lib2to3/tests/test_fixers.py +++ b/Lib/lib2to3/tests/test_fixers.py @@ -2954,6 +2954,11 @@ class Test_filter(FixerTestCase): a = """x = [x for x in range(10) if x%2 == 0]""" self.check(b, a) + # bpo-38871 + b = """filter(lambda x: True if x > 2 else False, [1, 2, 3])""" + a = """[x for x in [1, 2, 3] if (True if x > 2 else False)]""" + self.check(b, a) + def test_filter_trailers(self): b = """x = filter(None, 'abc')[0]""" a = """x = [_f for _f in 'abc' if _f][0]""" diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst new file mode 100644 index 00000000000..fe970fd9e3f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst @@ -0,0 +1,2 @@ +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. From 998c54948a29cf5bd8bfa49f973f1ce5855004a0 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Wed, 8 Jan 2020 12:52:44 +0000 Subject: [PATCH 079/380] bpo-39237, datetime: Remove redundant call to round from delta_new (GH-17877) --- Modules/_datetimemodule.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index c1b24073436..0b98cca67d4 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2489,7 +2489,6 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw) int x_is_odd; PyObject *temp; - whole_us = round(leftover_us); if (fabs(whole_us - leftover_us) == 0.5) { /* We're exactly halfway between two integers. In order * to do round-half-to-even, we must determine whether x From 9a669d58e8cb586fba38c84d5b631cd8a95d0c0c Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 8 Jan 2020 13:00:14 +0000 Subject: [PATCH 080/380] bpo-39233: Update positional-only section in the glossary (GH-17874) https://bugs.python.org/issue39233 --- Doc/glossary.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 9ce0357f1cb..6189cb04504 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -824,9 +824,11 @@ Glossary .. _positional-only_parameter: * :dfn:`positional-only`: specifies an argument that can be supplied only - by position. Python has no syntax for defining positional-only - parameters. However, some built-in functions have positional-only - parameters (e.g. :func:`abs`). + by position. Positional-only parameters can be defined by including a + ``/`` character in the parameter list of the function definition after + them, for example *posonly1* and *posonly2* in the following:: + + def func(posonly1, posonly2, /, positional_or_keyword): ... .. _keyword-only_parameter: From 2e6a8efa837410327b593dc83c57492253b1201e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 9 Jan 2020 00:29:34 +0900 Subject: [PATCH 081/380] bpo-39242: Updated the Gmane domain into news.gmane.io (GH-17903) --- Doc/library/nntplib.rst | 8 ++++---- Lib/nntplib.py | 2 +- Lib/test/test_nntplib.py | 4 ++-- .../next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst | 3 +++ 4 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 46f1c078355..e8480b54807 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -20,7 +20,7 @@ as well as the older :rfc:`977` and :rfc:`2980`. Here are two small examples of how it can be used. To list some statistics about a newsgroup and print the subjects of the last 10 articles:: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 @@ -44,7 +44,7 @@ about a newsgroup and print the subjects of the last 10 articles:: To post an article from a binary file (this assumes that the article has valid headers, and that you have right to post on the particular newsgroup):: - >>> s = nntplib.NNTP('news.gmane.org') + >>> s = nntplib.NNTP('news.gmane.io') >>> f = open('article.txt', 'rb') >>> s.post(f) '240 Article posted successfully.' @@ -73,7 +73,7 @@ The module itself defines the following classes: connection when done, e.g.: >>> from nntplib import NNTP - >>> with NNTP('news.gmane.org') as n: + >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... # doctest: +SKIP ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') @@ -225,7 +225,7 @@ tuples or objects that the method normally returns will be empty. of values. On legacy servers which don't understand the ``CAPABILITIES`` command, an empty dictionary is returned instead. - >>> s = NNTP('news.gmane.org') + >>> s = NNTP('news.gmane.io') >>> 'POST' in s.getcapabilities() True diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 1b7e83af01a..9036f361b5f 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1107,7 +1107,7 @@ if __name__ == '__main__': nntplib built-in demo - display the latest articles in a newsgroup""") parser.add_argument('-g', '--group', default='gmane.comp.python.general', help='group to fetch messages from (default: %(default)s)') - parser.add_argument('-s', '--server', default='news.gmane.org', + parser.add_argument('-s', '--server', default='news.gmane.io', help='NNTP server hostname (default: %(default)s)') parser.add_argument('-p', '--port', default=-1, type=int, help='NNTP port number (default: %s / %s)' % (NNTP_PORT, NNTP_SSL_PORT)) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index daa4a7945c1..88c54f4e6f3 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -639,7 +639,7 @@ class NNTPv1Handler: "\tSat, 19 Jun 2010 18:04:08 -0400" "\t<4FD05F05-F98B-44DC-8111-C6009C925F0C@gmail.com>" "\t\t7103\t16" - "\tXref: news.gmane.org gmane.comp.python.authors:57" + "\tXref: news.gmane.io gmane.comp.python.authors:57" "\n" "58\tLooking for a few good bloggers" "\tDoug Hellmann " @@ -1125,7 +1125,7 @@ class NNTPv1v2TestsMixin: "references": "", ":bytes": "7103", ":lines": "16", - "xref": "news.gmane.org gmane.comp.python.authors:57" + "xref": "news.gmane.io gmane.comp.python.authors:57" }) art_num, over = overviews[1] self.assertEqual(over["xref"], None) diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst new file mode 100644 index 00000000000..a87dddf81dc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst @@ -0,0 +1,3 @@ +Updated the Gmane domain from news.gmane.org to news.gmane.io +which is used for examples of :class:`~nntplib.NNTP` news reader server and +nntplib tests. From 5907e61a8d4da6d0f11bf1062d6d17484560a15e Mon Sep 17 00:00:00 2001 From: An Long Date: Thu, 9 Jan 2020 02:28:14 +0800 Subject: [PATCH 082/380] bpo-35292: Avoid calling mimetypes.init when http.server is imported (GH-17822) --- Doc/library/http.server.rst | 9 +++++--- Lib/http/server.py | 23 ++++++++----------- .../2020-01-08-14-39-19.bpo-35292.ihRT1z.rst | 1 + 3 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 5173decb2b2..478a5b31475 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -335,11 +335,14 @@ provides three different variants: .. attribute:: extensions_map - A dictionary mapping suffixes into MIME types. The default is - signified by an empty string, and is considered to be - ``application/octet-stream``. The mapping is used case-insensitively, + A dictionary mapping suffixes into MIME types, contains custom overrides + for the default system mappings. The mapping is used case-insensitively, and so should contain only lower-cased keys. + .. versionchanged:: 3.9 + This dictionary is no longer filled with the default system mappings, + but only contains overrides. + .. attribute:: directory If not specified, the directory to serve is the current working directory. diff --git a/Lib/http/server.py b/Lib/http/server.py index c6e5ed6ea0e..2d74b95586c 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -639,6 +639,12 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): """ server_version = "SimpleHTTP/" + __version__ + extensions_map = _encodings_map_default = { + '.gz': 'application/gzip', + '.Z': 'application/octet-stream', + '.bz2': 'application/x-bzip2', + '.xz': 'application/x-xz', + } def __init__(self, *args, directory=None, **kwargs): if directory is None: @@ -866,25 +872,16 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): slow) to look inside the data to make a better guess. """ - base, ext = posixpath.splitext(path) if ext in self.extensions_map: return self.extensions_map[ext] ext = ext.lower() if ext in self.extensions_map: return self.extensions_map[ext] - else: - return self.extensions_map[''] - - if not mimetypes.inited: - mimetypes.init() # try to read system mime.types - extensions_map = mimetypes.types_map.copy() - extensions_map.update({ - '': 'application/octet-stream', # Default - '.py': 'text/plain', - '.c': 'text/plain', - '.h': 'text/plain', - }) + guess, _ = mimetypes.guess_type(path) + if guess: + return guess + return 'application/octet-stream' # Utilities for CGIHTTPRequestHandler diff --git a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst new file mode 100644 index 00000000000..ae52f970d0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst @@ -0,0 +1 @@ +Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid unnecessary costs when :mod:`http.server` module is imported. \ No newline at end of file From f3a0a6bbccfcd9d18afe5575617aefaee9fa37a5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 8 Jan 2020 21:03:45 +0100 Subject: [PATCH 083/380] Py_DECREF: only pass filename if Py_REF_DEBUG is defined (GH-17870) Filename and line numbers are not needed when Py_REF_DEBUG are not defined. The static inline _Py_DECREF() function was introduced by commit 2aaf0c12041bcaadd7f2cc5a54450eefd7a6ff12. --- Include/object.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Include/object.h b/Include/object.h index a9d434b5108..7a5f57357b7 100644 --- a/Include/object.h +++ b/Include/object.h @@ -461,11 +461,12 @@ static inline void _Py_INCREF(PyObject *op) #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) -static inline void _Py_DECREF(const char *filename, int lineno, - PyObject *op) +static inline void _Py_DECREF( +#ifdef Py_REF_DEBUG + const char *filename, int lineno, +#endif + PyObject *op) { - (void)filename; /* may be unused, shut up -Wunused-parameter */ - (void)lineno; /* may be unused, shut up -Wunused-parameter */ _Py_DEC_REFTOTAL; if (--op->ob_refcnt != 0) { #ifdef Py_REF_DEBUG @@ -479,7 +480,11 @@ static inline void _Py_DECREF(const char *filename, int lineno, } } -#define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +# define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) +#else +# define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) +#endif /* Safely decref `op` and set `op` to NULL, especially useful in tp_clear From 2c7ed417a4c758f1c3f97fcbca70a49f79e58c07 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 9 Jan 2020 02:46:55 +0000 Subject: [PATCH 084/380] closes bpo-39261: Remove dead assignment from pyinit_config. (GH-17907) --- Python/pylifecycle.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 94bbbdb560e..1d9dff4ce80 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -749,7 +749,6 @@ pyinit_config(_PyRuntimeState *runtime, if (_PyStatus_EXCEPTION(status)) { return status; } - config = &tstate->interp->config; *tstate_p = tstate; status = pycore_interp_init(tstate); From 5cae042f686cc174e00093944dc118914c874b7c Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 9 Jan 2020 02:48:52 +0000 Subject: [PATCH 085/380] closes bpo-39262: Use specific out-of-memory message in _sharedexception_bind. (GH-17908) --- Modules/_xxsubinterpretersmodule.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index 4a6ffdd3266..fa20bc5dcec 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -221,8 +221,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->name == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception type name"; + } else { + failure = "unable to encode and copy exception type name"; } - failure = "unable to encode and copy exception type name"; goto finally; } @@ -237,8 +238,9 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) if (err->msg == NULL) { if (PyErr_ExceptionMatches(PyExc_MemoryError)) { failure = "out of memory copying exception message"; + } else { + failure = "unable to encode and copy exception message"; } - failure = "unable to encode and copy exception message"; goto finally; } } From 1a183faccbe5c32c367dbced721a25c1444dc5c1 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 9 Jan 2020 06:27:52 +0000 Subject: [PATCH 086/380] bpo-39271: Remove dead assignment from pattern_subx (GH-17915) --- Modules/_sre.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_sre.c b/Modules/_sre.c index f4f9d01dfcc..6518e98f04e 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1002,7 +1002,6 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, int literal; view.buf = NULL; ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view); - b = charsize; if (ptr) { if (charsize == 1) literal = memchr(ptr, '\\', n) == NULL; From a1c1be24cb3ae25b5b53e9dc94d6327009626283 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 9 Jan 2020 09:12:12 +0000 Subject: [PATCH 087/380] bpo-39272: Remove dead assignment from _ssl__SSLContext_load_verify_locations_impl (GH-17916) --- Modules/_ssl.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 43b236c2121..a0d34b34baa 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -4223,7 +4223,6 @@ _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self, r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf); PySSL_END_ALLOW_THREADS if (r != 1) { - ok = 0; if (errno != 0) { ERR_clear_error(); PyErr_SetFromErrno(PyExc_OSError); From f3e5e9566989635225d1b91088888074fc260817 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 9 Jan 2020 09:14:11 +0000 Subject: [PATCH 088/380] bpo-39270: Remove dead assignment from config_init_module_search_paths (GH-17914) --- Python/pathconfig.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Python/pathconfig.c b/Python/pathconfig.c index 6abc648769f..e37b5612366 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -240,9 +240,8 @@ config_init_module_search_paths(PyConfig *config, _PyPathConfig *pathconfig) const wchar_t *sys_path = pathconfig->module_search_path; const wchar_t delim = DELIM; - const wchar_t *p = sys_path; while (1) { - p = wcschr(sys_path, delim); + const wchar_t *p = wcschr(sys_path, delim); if (p == NULL) { p = sys_path + wcslen(sys_path); /* End of string */ } From 6c5d661342d12f6836580b0e75e3569c764527ae Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 9 Jan 2020 13:05:18 +0100 Subject: [PATCH 089/380] bpo-39161: Document multi-phase init modules under Py_NewInterpreter() (GH-17896) \+ this also adds a stronger warning against sharing objects between (sub-)interpreters. https://bugs.python.org/issue39161 --- Doc/c-api/init.rst | 52 +++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 38879373829..8913dbfe249 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1230,15 +1230,31 @@ function. You can create and destroy them using the following functions: single: Py_FinalizeEx() single: Py_Initialize() - Extension modules are shared between (sub-)interpreters as follows: the first - time a particular extension is imported, it is initialized normally, and a - (shallow) copy of its module's dictionary is squirreled away. When the same - extension is imported by another (sub-)interpreter, a new module is initialized - and filled with the contents of this copy; the extension's ``init`` function is - not called. Note that this is different from what happens when an extension is - imported after the interpreter has been completely re-initialized by calling - :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that case, the extension's - ``initmodule`` function *is* called again. + Extension modules are shared between (sub-)interpreters as follows: + + * For modules using multi-phase initialization, + e.g. :c:func:`PyModule_FromDefAndSpec`, a separate module object is + created and initialized for each interpreter. + Only C-level static and global variables are shared between these + module objects. + + * For modules using single-phase initialization, + e.g. :c:func:`PyModule_Create`, the first time a particular extension + is imported, it is initialized normally, and a (shallow) copy of its + module's dictionary is squirreled away. + When the same extension is imported by another (sub-)interpreter, a new + module is initialized and filled with the contents of this copy; the + extension's ``init`` function is not called. + Objects in the module's dictionary thus end up shared across + (sub-)interpreters, which might cause unwanted behavior (see + `Bugs and caveats`_ below). + + Note that this is different from what happens when an extension is + imported after the interpreter has been completely re-initialized by + calling :c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that + case, the extension's ``initmodule`` function *is* called again. + As with multi-phase initialization, this means that only C-level static + and global variables are shared between these modules. .. index:: single: close() (in module os) @@ -1264,14 +1280,16 @@ process, the insulation between them isn't perfect --- for example, using low-level file operations like :func:`os.close` they can (accidentally or maliciously) affect each other's open files. Because of the way extensions are shared between (sub-)interpreters, some extensions may not -work properly; this is especially likely when the extension makes use of -(static) global variables, or when the extension manipulates its module's -dictionary after its initialization. It is possible to insert objects created -in one sub-interpreter into a namespace of another sub-interpreter; this should -be done with great care to avoid sharing user-defined functions, methods, -instances or classes between sub-interpreters, since import operations executed -by such objects may affect the wrong (sub-)interpreter's dictionary of loaded -modules. +work properly; this is especially likely when using single-phase initialization +or (static) global variables. +It is possible to insert objects created in one sub-interpreter into +a namespace of another (sub-)interpreter; this should be avoided if possible. + +Special care should be taken to avoid sharing user-defined functions, +methods, instances or classes between sub-interpreters, since import +operations executed by such objects may affect the wrong (sub-)interpreter's +dictionary of loaded modules. It is equally important to avoid sharing +objects from which the above are reachable. Also note that combining this functionality with :c:func:`PyGILState_\*` APIs is delicate, because these APIs assume a bijection between Python thread states From eef1b027ab70704bcaa60a089e4ae1592c504b86 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Thu, 9 Jan 2020 19:11:46 +0530 Subject: [PATCH 090/380] Add test cases for dataclasses. (#17909) * Add test cases for dataclasses. * Add test for repr output of field. * Add test for ValueError to be raised when both default and default_factory are passed. --- Lib/test/test_dataclasses.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 8f9fb2ce8c1..e8fe455fc19 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -45,6 +45,25 @@ class TestCase(unittest.TestCase): o = C(42) self.assertEqual(o.x, 42) + def test_field_default_default_factory_error(self): + msg = "cannot specify both default and default_factory" + with self.assertRaisesRegex(ValueError, msg): + @dataclass + class C: + x: int = field(default=1, default_factory=int) + + def test_field_repr(self): + int_field = field(default=1, init=True, repr=False) + int_field.name = "id" + repr_output = repr(int_field) + expected_output = "Field(name='id',type=None," \ + f"default=1,default_factory={MISSING!r}," \ + "init=True,repr=False,hash=None," \ + "compare=True,metadata=mappingproxy({})," \ + "_field_type=None)" + + self.assertEqual(repr_output, expected_output) + def test_named_init_params(self): @dataclass class C: From ed367815eeb9329c48a86a8a7fa3186e27a10f2c Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 9 Jan 2020 09:00:29 -0800 Subject: [PATCH 091/380] bpo-25172: Reduce scope of crypt import tests (GH-17881) --- Lib/test/test_crypt.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py index d29e005fdad..5dc83b4ecbf 100644 --- a/Lib/test/test_crypt.py +++ b/Lib/test/test_crypt.py @@ -6,20 +6,21 @@ try: import crypt IMPORT_ERROR = None except ImportError as ex: + if sys.platform != 'win32': + raise unittest.SkipTest(str(ex)) crypt = None IMPORT_ERROR = str(ex) -@unittest.skipIf(crypt, 'This should only run on windows') +@unittest.skipUnless(sys.platform == 'win32', 'This should only run on windows') +@unittest.skipIf(crypt, 'import succeeded') class TestWhyCryptDidNotImport(unittest.TestCase): - def test_failure_only_for_windows(self): - self.assertEqual(sys.platform, 'win32') def test_import_failure_message(self): self.assertIn('not supported', IMPORT_ERROR) -@unittest.skipUnless(crypt, 'Not supported on Windows') +@unittest.skipUnless(crypt, 'crypt module is required') class CryptTestCase(unittest.TestCase): def test_crypt(self): From 2f65aa465865930f8364645b1466d2751c4086d3 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Thu, 9 Jan 2020 18:07:32 +0100 Subject: [PATCH 092/380] Fix typo in test's docstring (GH-17856) * Fix typo in test's docstring. contination -> continuation. --- Lib/test/test_eof.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py index a091ceaa25b..9ef8eb11874 100644 --- a/Lib/test/test_eof.py +++ b/Lib/test/test_eof.py @@ -27,7 +27,7 @@ class EOFTestCase(unittest.TestCase): raise support.TestFailed def test_line_continuation_EOF(self): - """A contination at the end of input must be an error; bpo2180.""" + """A continuation at the end of input must be an error; bpo2180.""" expect = 'unexpected EOF while parsing (, line 1)' with self.assertRaises(SyntaxError) as excinfo: exec('x = 5\\') From a796d8ef9dd1af65f7e4d7a857b56f35b7cb6e78 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 9 Jan 2020 11:18:47 -0800 Subject: [PATCH 093/380] bpo-39235: Fix end location for genexp in call args (GH-17925) The fix changes copy_location() to require an extra node from which to extract the end location, and fixing all 5 call sites. https://bugs.python.org/issue39235 --- .../2020-01-09-10-01-18.bpo-39235.RYwjoc.rst | 2 ++ Python/ast.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst new file mode 100644 index 00000000000..5fb0d45356b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst @@ -0,0 +1,2 @@ +Fix AST end location for lone generator expression in function call, e.g. +f(i for i in a). diff --git a/Python/ast.c b/Python/ast.c index d5113f8e413..9c48d71d154 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1028,13 +1028,13 @@ forbidden_name(struct compiling *c, identifier name, const node *n, } static expr_ty -copy_location(expr_ty e, const node *n) +copy_location(expr_ty e, const node *n, const node *end) { if (e) { e->lineno = LINENO(n); e->col_offset = n->n_col_offset; - e->end_lineno = n->n_end_lineno; - e->end_col_offset = n->n_end_col_offset; + e->end_lineno = end->n_end_lineno; + e->end_col_offset = end->n_end_col_offset; } return e; } @@ -2464,10 +2464,10 @@ ast_for_atom(struct compiling *c, const node *n) } if (TYPE(CHILD(ch, 1)) == comp_for) { - return copy_location(ast_for_genexp(c, ch), n); + return copy_location(ast_for_genexp(c, ch), n, n); } else { - return copy_location(ast_for_testlist(c, ch), n); + return copy_location(ast_for_testlist(c, ch), n, n); } case LSQB: /* list (or list comprehension) */ ch = CHILD(n, 1); @@ -2486,7 +2486,7 @@ ast_for_atom(struct compiling *c, const node *n) n->n_end_lineno, n->n_end_col_offset, c->c_arena); } else { - return copy_location(ast_for_listcomp(c, ch), n); + return copy_location(ast_for_listcomp(c, ch), n, n); } case LBRACE: { /* dictorsetmaker: ( ((test ':' test | '**' test) @@ -2527,7 +2527,7 @@ ast_for_atom(struct compiling *c, const node *n) /* It's a dictionary display. */ res = ast_for_dictdisplay(c, ch); } - return copy_location(res, n); + return copy_location(res, n, n); } } default: @@ -3146,7 +3146,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, } else if (TYPE(CHILD(ch, 1)) == comp_for) { /* the lone generator expression */ - e = copy_location(ast_for_genexp(c, ch), maybegenbeg); + e = copy_location(ast_for_genexp(c, ch), maybegenbeg, closepar); if (!e) return NULL; asdl_seq_SET(args, nargs++, e); From 850a8856e120f8cba15e557a0e791f93b43d6989 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 10 Jan 2020 10:12:55 +0200 Subject: [PATCH 094/380] bpo-39235: Check end_lineno and end_col_offset of AST nodes. (GH-17926) --- Lib/test/test_ast.py | 206 ++++++++++++++++++++++--------------------- 1 file changed, 104 insertions(+), 102 deletions(-) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 55b91cfa23b..aa0d214b8a6 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -17,6 +17,8 @@ def to_tuple(t): result = [t.__class__.__name__] if hasattr(t, 'lineno') and hasattr(t, 'col_offset'): result.append((t.lineno, t.col_offset)) + if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'): + result[-1] += (t.end_lineno, t.end_col_offset) if t._fields is None: return tuple(result) for f in t._fields: @@ -1846,111 +1848,111 @@ def main(): #### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42, None)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1, None), ('Constant', (1, 16), None, None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()', None))], [], None, None)], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []), -('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1, None))], [], None, None)], []), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []), -('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string', None)], []), None)], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []), -('Module', [('Global', (1, 0), ['v'])], []), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []), -('Module', [('Pass', (1, 0))], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function', None)), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1, None))], [('Expr', (3, 7), ('Constant', (3, 7), 2, None))], None)], [], None, None)], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []), -('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []), -('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), -('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []), +('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []), +('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None)], []), +('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []), +('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []), +('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []), +('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []), +('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []), +('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []), +('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []), +('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []), +('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []), +('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []), +('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []), +('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []), +('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []), +('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []), +('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []), +('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []), +('Module', [('Global', (1, 0, 1, 8), ['v'])], []), +('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []), +('Module', [('Pass', (1, 0, 1, 4))], []), +('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []), +('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []), +('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []), +('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None)], []), +('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []), +('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []), +('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None)], []), +('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), +('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []), +('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), +('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None)], []), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]), +('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]), ] eval_results = [ -('Expression', ('Constant', (1, 0), None, None)), -('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), -('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), -('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))), -('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])), -('Expression', ('Dict', (1, 0), [], [])), -('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])), -('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])), -('Expression', ('ListComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])), -('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('GeneratorExp', (1, 1), ('Name', (1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 8), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Load',)), [], 0)])], [])), -('Expression', ('Constant', (1, 0), 10, None)), -('Expression', ('Constant', (1, 0), 'string', None)), -('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), -('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), -('Expression', ('Name', (1, 0), 'v', ('Load',))), -('Expression', ('List', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('List', (1, 0), [], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))), -('Expression', ('Tuple', (1, 0), [], ('Load',))), -('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1, None), ('Constant', (1, 14), 2, None), None), ('Load',))], [])), +('Expression', ('Constant', (1, 0, 1, 4), None, None)), +('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])), +('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))), +('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))), +('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))), +('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])), +('Expression', ('Dict', (1, 0, 1, 2), [], [])), +('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])), +('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])), +('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])), +('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])), +('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])), +('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])), +('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])), +('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])), +('Expression', ('Constant', (1, 0, 1, 2), 10, None)), +('Expression', ('Constant', (1, 0, 1, 8), 'string', None)), +('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))), +('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))), +('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))), +('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('List', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))), +('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))), +('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])), ] main() From 4c53e63cc966f98e141a09bc435b9f9c713b152d Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 10 Jan 2020 09:24:22 +0000 Subject: [PATCH 095/380] bpo-39166: Fix trace of last iteration of async for loops (#17800) --- Lib/test/test_sys_settrace.py | 76 +++++++++++++++++++ .../2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst | 2 + Python/ceval.c | 14 ++-- 3 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index a0d1122fad8..bead57c44b4 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -526,6 +526,82 @@ class TraceTestCase(unittest.TestCase): (7, 'line'), (7, 'return')]) + def test_20_async_for_loop(self): + class AsyncIteratorWrapper: + def __init__(self, obj): + self._it = iter(obj) + + def __aiter__(self): + return self + + async def __anext__(self): + try: + return next(self._it) + except StopIteration: + raise StopAsyncIteration + + async def doit_async(): + async for letter in AsyncIteratorWrapper("abc"): + x = letter + y = 42 + + def run(tracer): + x = doit_async() + try: + sys.settrace(tracer) + x.send(None) + finally: + sys.settrace(None) + + tracer = self.make_tracer() + events = [ + (0, 'call'), + (1, 'line'), + (-12, 'call'), + (-11, 'line'), + (-11, 'return'), + (-9, 'call'), + (-8, 'line'), + (-8, 'return'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'return'), + (1, 'exception'), + (2, 'line'), + (1, 'line'), + (-6, 'call'), + (-5, 'line'), + (-4, 'line'), + (-4, 'exception'), + (-3, 'line'), + (-2, 'line'), + (-2, 'exception'), + (-2, 'return'), + (1, 'exception'), + (3, 'line'), + (3, 'return')] + try: + run(tracer.trace) + except Exception: + pass + self.compare_events(doit_async.__code__.co_firstlineno, + tracer.events, events) + class SkipLineEventsTraceTestCase(TraceTestCase): """Repeat the trace tests, but with per-line events skipped""" diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst new file mode 100644 index 00000000000..4737e9c4d2e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst @@ -0,0 +1,2 @@ +Fix incorrect line execution reporting in trace functions when tracing the +last iteration of asynchronous for loops. Patch by Pablo Galindo. diff --git a/Python/ceval.c b/Python/ceval.c index bd9454b2812..3bbd0ca9667 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3610,11 +3610,15 @@ exception_unwind: PUSH(val); PUSH(exc); JUMPTO(handler); - if (_Py_TracingPossible(ceval) && - ((f->f_lasti < instr_lb || f->f_lasti >= instr_ub) || - !(f->f_lasti == instr_lb || f->f_lasti < instr_prev))) { - /* Make sure that we trace line after exception */ - instr_prev = INT_MAX; + if (_Py_TracingPossible(ceval)) { + 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; + } } /* Resume normal execution */ goto main_loop; From c39b52f1527868c7ada9385669c38edf98858921 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 10 Jan 2020 23:34:05 +0900 Subject: [PATCH 096/380] bpo-39259: poplib now rejects timeout = 0 (GH-17912) poplib.POP3 and poplib.POP3_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. --- Doc/library/poplib.rst | 8 +++++++- Doc/whatsnew/3.9.rst | 7 +++++++ Lib/poplib.py | 2 ++ Lib/test/test_poplib.py | 12 +++++++----- .../Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst | 3 +++ 5 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst diff --git a/Doc/library/poplib.rst b/Doc/library/poplib.rst index 28b42fa60c1..2f349b35b7e 100644 --- a/Doc/library/poplib.rst +++ b/Doc/library/poplib.rst @@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes: ``poplib.putline`` with arguments ``self`` and ``line``, where ``line`` is the bytes about to be sent to the remote host. + .. versionchanged:: 3.9 + 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:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None) @@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + One exception is defined as an attribute of the :mod:`poplib` module: @@ -268,4 +275,3 @@ retrieves and prints all messages:: At the end of the module, there is a test section that contains a more extensive example of usage. - diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ea6d8f515a9..3320b7cff42 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -187,6 +187,13 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +poplib +------ + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + threading --------- diff --git a/Lib/poplib.py b/Lib/poplib.py index 0b6750d2303..0f8587317c2 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -107,6 +107,8 @@ class POP3: self.welcome = self._getresp() def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') return socket.create_connection((self.host, self.port), timeout) def _putline(self, line): diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 911cba1f1dc..7f06d1950e1 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -481,7 +481,7 @@ class TestTimeouts(TestCase): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(60) # Safety net. Look issue 11812 self.port = test_support.bind_port(self.sock) - self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock)) + self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock)) self.thread.daemon = True self.thread.start() self.evt.wait() @@ -505,12 +505,12 @@ class TestTimeouts(TestCase): def testTimeoutDefault(self): self.assertIsNone(socket.getdefaulttimeout()) - socket.setdefaulttimeout(30) + socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT) try: pop = poplib.POP3(HOST, self.port) finally: socket.setdefaulttimeout(None) - self.assertEqual(pop.sock.gettimeout(), 30) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() def testTimeoutNone(self): @@ -524,9 +524,11 @@ class TestTimeouts(TestCase): pop.close() def testTimeoutValue(self): - pop = poplib.POP3(HOST, self.port, timeout=30) - self.assertEqual(pop.sock.gettimeout(), 30) + pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT) + self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT) pop.close() + with self.assertRaises(ValueError): + poplib.POP3(HOST, self.port, timeout=0) def test_main(): diff --git a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst new file mode 100644 index 00000000000..c7ef8be7e3a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst @@ -0,0 +1,3 @@ +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From abdc634f337ce4943cd7d13587936837aac2ecc9 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sat, 11 Jan 2020 01:31:43 +0900 Subject: [PATCH 097/380] bpo-39200: Correct the error message for min/max builtin function (GH-17814) Correct the error message when calling the min() or max() with no arguments. --- Lib/test/test_builtin.py | 14 ++++++++++++-- .../2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst | 2 ++ Python/bltinmodule.c | 9 +++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 6a88454289d..5c553a92b97 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -949,7 +949,12 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(max(1, 2.0, 3), 3) self.assertEqual(max(1.0, 2, 3), 3) - self.assertRaises(TypeError, max) + with self.assertRaisesRegex( + TypeError, + 'max expected at least 1 argument, got 0' + ): + max() + self.assertRaises(TypeError, max, 42) self.assertRaises(ValueError, max, ()) class BadSeq: @@ -1003,7 +1008,12 @@ class BuiltinTest(unittest.TestCase): self.assertEqual(min(1, 2.0, 3), 1) self.assertEqual(min(1.0, 2, 3), 1.0) - self.assertRaises(TypeError, min) + with self.assertRaisesRegex( + TypeError, + 'min expected at least 1 argument, got 0' + ): + min() + self.assertRaises(TypeError, min, 42) self.assertRaises(ValueError, min, ()) class BadSeq: diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst new file mode 100644 index 00000000000..71e40720992 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst @@ -0,0 +1,2 @@ +Correct the error message when calling the :func:`min` or :func:`max` with +no arguments. Patch by Dong-hee Na. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 34267685be2..4f833c1f462 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1589,10 +1589,15 @@ min_max(PyObject *args, PyObject *kwds, int op) const int positional = PyTuple_Size(args) > 1; int ret; - if (positional) + if (positional) { v = args; - else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) + } + else if (!PyArg_UnpackTuple(args, name, 1, 1, &v)) { + if (PyExceptionClass_Check(PyExc_TypeError)) { + PyErr_Format(PyExc_TypeError, "%s expected at least 1 argument, got 0", name); + } return NULL; + } emptytuple = PyTuple_New(0); if (emptytuple == NULL) From ce54519aa09772f4173b8c17410ed77e403f3ebf Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 10 Jan 2020 19:37:48 +0000 Subject: [PATCH 098/380] bpo-39292: Add missing syslog facility codes. (GH-17945) --- Lib/logging/handlers.py | 49 +++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index ea14541e1e5..047798f6dc1 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -742,6 +742,10 @@ class SysLogHandler(logging.Handler): LOG_CRON = 9 # clock daemon LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_FTP = 11 # FTP daemon + LOG_NTP = 12 # NTP subsystem + LOG_SECURITY = 13 # Log audit + LOG_CONSOLE = 14 # Log alert + LOG_SOLCRON = 15 # Scheduling daemon (Solaris) # other codes through 15 reserved for system use LOG_LOCAL0 = 16 # reserved for local use @@ -769,27 +773,30 @@ class SysLogHandler(logging.Handler): } facility_names = { - "auth": LOG_AUTH, - "authpriv": LOG_AUTHPRIV, - "cron": LOG_CRON, - "daemon": LOG_DAEMON, - "ftp": LOG_FTP, - "kern": LOG_KERN, - "lpr": LOG_LPR, - "mail": LOG_MAIL, - "news": LOG_NEWS, - "security": LOG_AUTH, # DEPRECATED - "syslog": LOG_SYSLOG, - "user": LOG_USER, - "uucp": LOG_UUCP, - "local0": LOG_LOCAL0, - "local1": LOG_LOCAL1, - "local2": LOG_LOCAL2, - "local3": LOG_LOCAL3, - "local4": LOG_LOCAL4, - "local5": LOG_LOCAL5, - "local6": LOG_LOCAL6, - "local7": LOG_LOCAL7, + "auth": LOG_AUTH, + "authpriv": LOG_AUTHPRIV, + "console": LOG_CONSOLE, + "cron": LOG_CRON, + "daemon": LOG_DAEMON, + "ftp": LOG_FTP, + "kern": LOG_KERN, + "lpr": LOG_LPR, + "mail": LOG_MAIL, + "news": LOG_NEWS, + "ntp": LOG_NTP, + "security": LOG_SECURITY, + "solaris-cron": LOG_SOLCRON, + "syslog": LOG_SYSLOG, + "user": LOG_USER, + "uucp": LOG_UUCP, + "local0": LOG_LOCAL0, + "local1": LOG_LOCAL1, + "local2": LOG_LOCAL2, + "local3": LOG_LOCAL3, + "local4": LOG_LOCAL4, + "local5": LOG_LOCAL5, + "local6": LOG_LOCAL6, + "local7": LOG_LOCAL7, } #The map below appears to be trivially lowercasing the key. However, From 43682f1e39a3c61f0e8a638b887bcdcbfef766c5 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Sat, 11 Jan 2020 10:46:30 +0530 Subject: [PATCH 099/380] Fix host in address of socket.create_server example. (GH-17706) Host as None in address raises TypeError since it should be string, bytes or bytearray. --- Lib/socket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/socket.py b/Lib/socket.py index 374f1124bf7..cafa573a30c 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -878,7 +878,7 @@ def create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, connections. When false it will explicitly disable this option on platforms that enable it by default (e.g. Linux). - >>> with create_server((None, 8000)) as server: + >>> with create_server(('', 8000)) as server: ... while True: ... conn, addr = server.accept() ... # handle new connection From 5d978a2e73e9ad934bcd260ae0a0db5cd0ca27d0 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 12 Jan 2020 00:07:36 +0900 Subject: [PATCH 100/380] bpo-39259: nntplib.NNTP/NNTP_SSL refactoring (GH-17939) --- Lib/nntplib.py | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 9036f361b5f..0ab51853b52 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1042,13 +1042,11 @@ class NNTP(_NNTPBase): """ self.host = host self.port = port - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) + self.sock = self._create_socket(timeout) file = None try: file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode, timeout) + super().__init__(file, host, readermode, timeout) if user or usenetrc: self.login(user, password, usenetrc) except: @@ -1057,15 +1055,19 @@ class NNTP(_NNTPBase): self.sock.close() raise + def _create_socket(self, timeout): + sys.audit("nntplib.connect", self, self.host, self.port) + return socket.create_connection((self.host, self.port), timeout) + def _close(self): try: - _NNTPBase._close(self) + super()._close() finally: self.sock.close() if _have_ssl: - class NNTP_SSL(_NNTPBase): + class NNTP_SSL(NNTP): def __init__(self, host, port=NNTP_SSL_PORT, user=None, password=None, ssl_context=None, @@ -1074,27 +1076,19 @@ if _have_ssl: """This works identically to NNTP.__init__, except for the change in default port and the `ssl_context` argument for SSL connections. """ - sys.audit("nntplib.connect", self, host, port) - self.sock = socket.create_connection((host, port), timeout) - file = None - try: - self.sock = _encrypt_on(self.sock, ssl_context, host) - file = self.sock.makefile("rwb") - _NNTPBase.__init__(self, file, host, - readermode=readermode, timeout=timeout) - if user or usenetrc: - self.login(user, password, usenetrc) - except: - if file: - file.close() - self.sock.close() - raise + self.ssl_context = ssl_context + super().__init__(host, port, user, password, readermode, + usenetrc, timeout) - def _close(self): + def _create_socket(self, timeout): + sock = super()._create_socket(timeout) try: - _NNTPBase._close(self) - finally: - self.sock.close() + sock = _encrypt_on(sock, self.ssl_context, self.host) + except: + sock.close() + raise + else: + return sock __all__.append("NNTP_SSL") From 136735c1a2efb320e4cbb64b40f1191228745b39 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 11 Jan 2020 10:37:28 -0500 Subject: [PATCH 101/380] bpo-39297: Update for importlib_metadata 1.4. (GH-17947) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bpo-39297: Update for importlib_metadata 1.4. Includes performance updates. * 📜🤖 Added by blurb_it. * Update blurb Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/importlib/metadata.py | 108 ++++++++++++------ .../2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst | 1 + 2 files changed, 73 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index 53f9fb59346..ae8ecf9b850 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -10,6 +10,7 @@ import zipfile import operator import functools import itertools +import posixpath import collections from configparser import ConfigParser @@ -371,10 +372,6 @@ class DistributionFinder(MetaPathFinder): """ return vars(self).get('path', sys.path) - @property - def pattern(self): - return '.*' if self.name is None else re.escape(self.name) - @abc.abstractmethod def find_distributions(self, context=Context()): """ @@ -386,6 +383,73 @@ class DistributionFinder(MetaPathFinder): """ +class FastPath: + """ + Micro-optimized class for searching a path for + children. + """ + + def __init__(self, root): + self.root = root + + def joinpath(self, child): + return pathlib.Path(self.root, child) + + def children(self): + with suppress(Exception): + return os.listdir(self.root or '') + with suppress(Exception): + return self.zip_children() + return [] + + def zip_children(self): + zip_path = zipfile.Path(self.root) + names = zip_path.root.namelist() + self.joinpath = zip_path.joinpath + + return ( + posixpath.split(child)[0] + for child in names + ) + + def is_egg(self, search): + root_n_low = os.path.split(self.root)[1].lower() + + return ( + root_n_low == search.normalized + '.egg' + or root_n_low.startswith(search.prefix) + and root_n_low.endswith('.egg')) + + def search(self, name): + for child in self.children(): + n_low = child.lower() + if (n_low in name.exact_matches + or n_low.startswith(name.prefix) + and n_low.endswith(name.suffixes) + # legacy case: + or self.is_egg(name) and n_low == 'egg-info'): + yield self.joinpath(child) + + +class Prepared: + """ + A prepared search for metadata on a possibly-named package. + """ + normalized = '' + prefix = '' + suffixes = '.dist-info', '.egg-info' + exact_matches = [''][:0] + + def __init__(self, name): + self.name = name + if name is None: + return + self.normalized = name.lower().replace('-', '_') + self.prefix = self.normalized + '-' + self.exact_matches = [ + self.normalized + suffix for suffix in self.suffixes] + + class MetadataPathFinder(DistributionFinder): @classmethod def find_distributions(cls, context=DistributionFinder.Context()): @@ -397,45 +461,17 @@ class MetadataPathFinder(DistributionFinder): (or all names if ``None`` indicated) along the paths in the list of directories ``context.path``. """ - found = cls._search_paths(context.pattern, context.path) + found = cls._search_paths(context.name, context.path) return map(PathDistribution, found) @classmethod - def _search_paths(cls, pattern, paths): + def _search_paths(cls, name, paths): """Find metadata directories in paths heuristically.""" return itertools.chain.from_iterable( - cls._search_path(path, pattern) - for path in map(cls._switch_path, paths) + path.search(Prepared(name)) + for path in map(FastPath, paths) ) - @staticmethod - def _switch_path(path): - PYPY_OPEN_BUG = False - if not PYPY_OPEN_BUG or os.path.isfile(path): # pragma: no branch - with suppress(Exception): - return zipfile.Path(path) - return pathlib.Path(path) - - @classmethod - def _matches_info(cls, normalized, item): - template = r'{pattern}(-.*)?\.(dist|egg)-info' - manifest = template.format(pattern=normalized) - return re.match(manifest, item.name, flags=re.IGNORECASE) - - @classmethod - def _matches_legacy(cls, normalized, item): - template = r'{pattern}-.*\.egg[\\/]EGG-INFO' - manifest = template.format(pattern=normalized) - return re.search(manifest, str(item), flags=re.IGNORECASE) - - @classmethod - def _search_path(cls, root, pattern): - if not root.is_dir(): - return () - normalized = pattern.replace('-', '_') - return (item for item in root.iterdir() - if cls._matches_info(normalized, item) - or cls._matches_legacy(normalized, item)) class PathDistribution(Distribution): diff --git a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst new file mode 100644 index 00000000000..618f6f9f2b7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst @@ -0,0 +1 @@ +Improved performance of importlib.metadata distribution discovery and resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). From 1b335ae281631a12201fdec29b3c55d97166fc06 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 12 Jan 2020 02:39:15 +0900 Subject: [PATCH 102/380] bpo-39259: nntplib.NNTP/NNTP_SSL now reject timeout = 0 (GH-17936) nntplib.NNTP and nntplib.NNTP_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. --- Doc/library/nntplib.rst | 8 ++++++++ Doc/whatsnew/3.9.rst | 7 +++++++ Lib/nntplib.py | 2 ++ Lib/test/test_nntplib.py | 4 ++++ .../next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst | 3 +++ 5 files changed, 24 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index e8480b54807..76973651526 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -93,6 +93,10 @@ The module itself defines the following classes: .. versionchanged:: 3.3 Support for the :keyword:`with` statement was added. + .. versionchanged:: 3.9 + 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:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout]) Return a new :class:`NNTP_SSL` object, representing an encrypted @@ -122,6 +126,10 @@ The module itself defines the following classes: :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see :data:`ssl.HAS_SNI`). + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket. + .. exception:: NNTPError Derived from the standard exception :exc:`Exception`, this is the base diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 3320b7cff42..8cfb5725bb5 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -177,6 +177,13 @@ with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. (Contributed by Dong-hee Na in :issue:`38615`.) +nntplib +------- + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + os -- diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 0ab51853b52..8951203f325 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -1056,6 +1056,8 @@ class NNTP(_NNTPBase): raise def _create_socket(self, timeout): + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') sys.audit("nntplib.connect", self, self.host, self.port) return socket.create_connection((self.host, self.port), timeout) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 88c54f4e6f3..fdd76f9e9b3 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -258,6 +258,10 @@ class NetworkedNNTPTestsMixin: # value setattr(cls, name, wrap_meth(meth)) + def test_timeout(self): + with self.assertRaises(ValueError): + self.NNTP_CLASS(self.NNTP_HOST, timeout=0, usenetrc=False) + def test_with_statement(self): def is_connected(): if not hasattr(server, 'file'): diff --git a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst new file mode 100644 index 00000000000..a454572c80d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst @@ -0,0 +1,3 @@ +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From 100fafcf20e8fc67cd8ef512074f9c0a253cb427 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 12 Jan 2020 02:15:42 +0100 Subject: [PATCH 103/380] bpo-39288: Add math.nextafter(x, y) (GH-17937) Return the next floating-point value after x towards y. --- Doc/library/math.rst | 8 +++ Doc/whatsnew/3.9.rst | 7 +++ Lib/test/test_math.py | 54 +++++++++++++++++++ .../2020-01-10-16-52-09.bpo-39288.IB-aQX.rst | 2 + Modules/clinic/mathmodule.c.h | 50 ++++++++++++++++- Modules/mathmodule.c | 20 +++++++ 6 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 43eaba935a1..135adf8f636 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -213,6 +213,14 @@ Number-theoretic and representation functions of *x* and are floats. +.. function:: nextafter(x, y) + + Return the next floating-point value after *x* towards *y*. + + If *x* is equal to *y*, return *y*. + + .. versionadded:: 3.9 + .. function:: perm(n, k=None) Return the number of ways to choose *k* items from *n* items diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 8cfb5725bb5..a686d640ae9 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -177,6 +177,13 @@ with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. (Contributed by Dong-hee Na in :issue:`38615`.) +math +---- + +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. +(Contributed by Victor Stinner in :issue:`39288`.) + nntplib ------- diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 5c35c8cff12..b64fd41a548 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -2033,6 +2033,60 @@ class IsCloseTests(unittest.TestCase): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign. + + Function useful to check to signed zero. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + + @requires_IEEE_754 + def test_nextafter(self): + # around 2^52 and 2^63 + self.assertEqual(math.nextafter(4503599627370496.0, -INF), + 4503599627370495.5) + self.assertEqual(math.nextafter(4503599627370496.0, INF), + 4503599627370497.0) + self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), + 9223372036854774784.0) + self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), + -9223372036854774784.0) + + # around 1.0 + self.assertEqual(math.nextafter(1.0, -INF), + float.fromhex('0x1.fffffffffffffp-1')) + self.assertEqual(math.nextafter(1.0, INF), + float.fromhex('0x1.0000000000001p+0')) + + # x == y: y is returned + self.assertEqual(math.nextafter(2.0, 2.0), 2.0) + self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) + self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) + + # around 0.0 + smallest_subnormal = sys.float_info.min * sys.float_info.epsilon + self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) + self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) + self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) + + # around infinity + largest_normal = sys.float_info.max + self.assertEqual(math.nextafter(INF, 0.0), largest_normal) + self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) + self.assertEqual(math.nextafter(largest_normal, INF), INF) + self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) + + # NaN + self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) + self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) + self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) + def test_main(): from doctest import DocFileSuite diff --git a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst new file mode 100644 index 00000000000..0e0ec99c344 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst @@ -0,0 +1,2 @@ +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. diff --git a/Modules/clinic/mathmodule.c.h b/Modules/clinic/mathmodule.c.h index 95d68ee55ae..f34633cb0c0 100644 --- a/Modules/clinic/mathmodule.c.h +++ b/Modules/clinic/mathmodule.c.h @@ -808,4 +808,52 @@ math_comb(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=9a2b3dc91eb9aadd input=a9049054013a1b77]*/ + +PyDoc_STRVAR(math_nextafter__doc__, +"nextafter($module, x, y, /)\n" +"--\n" +"\n" +"Return the next floating-point value after x towards y."); + +#define MATH_NEXTAFTER_METHODDEF \ + {"nextafter", (PyCFunction)(void(*)(void))math_nextafter, METH_FASTCALL, math_nextafter__doc__}, + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y); + +static PyObject * +math_nextafter(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +{ + PyObject *return_value = NULL; + double x; + double y; + + if (!_PyArg_CheckPositional("nextafter", nargs, 2, 2)) { + goto exit; + } + if (PyFloat_CheckExact(args[0])) { + x = PyFloat_AS_DOUBLE(args[0]); + } + else + { + x = PyFloat_AsDouble(args[0]); + if (x == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + if (PyFloat_CheckExact(args[1])) { + y = PyFloat_AS_DOUBLE(args[1]); + } + else + { + y = PyFloat_AsDouble(args[1]); + if (y == -1.0 && PyErr_Occurred()) { + goto exit; + } + } + return_value = math_nextafter_impl(module, x, y); + +exit: + return return_value; +} +/*[clinic end generated code: output=e4ed1a800e4b2eae input=a9049054013a1b77]*/ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index e60e19bc490..632a421e3bb 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3295,6 +3295,25 @@ error: } +/*[clinic input] +math.nextafter + + x: double + y: double + / + +Return the next floating-point value after x towards y. +[clinic start generated code]*/ + +static PyObject * +math_nextafter_impl(PyObject *module, double x, double y) +/*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ +{ + double f = nextafter(x, y); + return PyFloat_FromDouble(f); +} + + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3346,6 +3365,7 @@ static PyMethodDef math_methods[] = { MATH_PROD_METHODDEF MATH_PERM_METHODDEF MATH_COMB_METHODDEF + MATH_NEXTAFTER_METHODDEF {NULL, NULL} /* sentinel */ }; From c12440c371025bea9c3bfb94945f006c486c2c01 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Sun, 12 Jan 2020 08:54:00 +0000 Subject: [PATCH 104/380] bpo-16575: Disabled checks for union types being passed by value. (GH-17960) Although the underlying libffi issue remains open, adding these checks have caused problems in third-party projects which are in widespread use. See the issue for examples. The corresponding tests have also been skipped. --- Lib/ctypes/test/test_structures.py | 3 ++- Modules/_ctypes/_ctypes.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 283ccbf7237..245cd94c5cd 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -576,6 +576,7 @@ class StructureTestCase(unittest.TestCase): self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab, 0x3210, 0x7654, 0xba98, 0xfedc]) + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_union_by_value(self): # See bpo-16575 @@ -656,7 +657,7 @@ class StructureTestCase(unittest.TestCase): self.assertEqual(test5.nested.an_int, 0) self.assertEqual(test5.another_int, 0) - #@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390') + @unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576') def test_bitfield_by_value(self): # See bpo-16576 diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 93af497bda2..cb6e03f2ca1 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2401,6 +2401,23 @@ converters_from_argtypes(PyObject *ob) for (i = 0; i < nArgs; ++i) { PyObject *cnv; PyObject *tp = PyTuple_GET_ITEM(ob, i); +/* + * The following checks, relating to bpo-16575 and bpo-16576, have been + * disabled. The reason is that, although there is a definite problem with + * how libffi handles unions (https://github.com/libffi/libffi/issues/33), + * there are numerous libraries which pass structures containing unions + * by values - especially on Windows but examples also exist on Linux + * (https://bugs.python.org/msg359834). + * + * It may not be possible to get proper support for unions and bitfields + * until support is forthcoming in libffi, but for now, adding the checks + * has caused problems in otherwise-working software, which suggests it + * is better to disable the checks. + * + * Although specific examples reported relate specifically to unions and + * not bitfields, the bitfields check is also being disabled as a + * precaution. + StgDictObject *stgdict = PyType_stgdict(tp); if (stgdict != NULL) { @@ -2428,6 +2445,7 @@ converters_from_argtypes(PyObject *ob) return NULL; } } + */ if (_PyObject_LookupAttrId(tp, &PyId_from_param, &cnv) <= 0) { Py_DECREF(converters); From d7c7adde003ddca5cbe4fc47cf09464ab95a066e Mon Sep 17 00:00:00 2001 From: Zac Hatfield-Dodds Date: Sun, 12 Jan 2020 19:04:14 +1000 Subject: [PATCH 105/380] bpo-12159: Document sys.maxsize limit in len() function reference (GH-17934) --- Doc/library/functions.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index dc3391ffe88..cc48597ef91 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -892,6 +892,11 @@ are always available. They are listed here in alphabetical order. sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set). + .. impl-detail:: + + ``len`` raises :exc:`OverflowError` on lengths larger than + :data:`sys.maxsize`, such as :class:`range(2 ** 100) `. + .. _func-list: .. class:: list([iterable]) From 0ca7cc7fc0518c24dc9b78c38418e6064e64f148 Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Sun, 12 Jan 2020 06:02:50 -0500 Subject: [PATCH 106/380] bpo-38356: Fix ThreadedChildWatcher thread leak in test_asyncio (GH-16552) Motivation for this PR (comment from @vstinner in bpo issue): ``` Warning seen o AMD64 Ubuntu Shared 3.x buildbot: https://buildbot.python.org/all/#/builders/141/builds/2593 test_devnull_output (test.test_a=syncio.test_subprocess.SubprocessThreadedWatcherTests) ... Warning -- threading_cleanup() failed to cleanup 1 threads (count: 1, dangling: 2) ``` The following implementation details for the new method are TBD: 1) Public vs private 2) Inclusion in `close()` 3) Name 4) Coroutine vs subroutine method 5) *timeout* parameter If it's a private method, 3, 4, and 5 are significantly less important. I started with the most minimal implementation that fixes the dangling threads without modifying the regression tests, which I think is particularly important. I typically try to avoid directly modifying existing tests as much as possible unless it's necessary to do so. However, I am open to changing any part of this. https://bugs.python.org/issue38356 --- Lib/asyncio/unix_events.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 28fb4918645..19d713545e4 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1344,7 +1344,14 @@ class ThreadedChildWatcher(AbstractChildWatcher): return True def close(self): - pass + self._join_threads() + + def _join_threads(self): + """Internal: Join all non-daemon threads""" + threads = [thread for thread in list(self._threads.values()) + if thread.is_alive() and not thread.daemon] + for thread in threads: + thread.join() def __enter__(self): return self From 54cfbb2feee1f7328c3d6799ec3734b00824b555 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 12 Jan 2020 12:57:47 +0100 Subject: [PATCH 107/380] bpo-39288: Add examples to math.nextafter() documentation (GH-17962) --- Doc/library/math.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Doc/library/math.rst b/Doc/library/math.rst index 135adf8f636..c9f2a383312 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -219,6 +219,13 @@ Number-theoretic and representation functions If *x* is equal to *y*, return *y*. + Examples: + + * ``math.nextafter(x, math.inf)`` goes up: towards positive infinity. + * ``math.nextafter(x, -math.inf)`` goes down: towards minus infinity. + * ``math.nextafter(x, 0.0)`` goes towards zero. + * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + .. versionadded:: 3.9 .. function:: perm(n, k=None) From 9f3fc6c5b4993f2b362263b494f84793a21aa073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20Natan=20Gunnarsson?= <1493259+GudniNatan@users.noreply.github.com> Date: Sun, 12 Jan 2020 17:41:49 +0000 Subject: [PATCH 108/380] bpo-38293: Allow shallow and deep copying of property objects (GH-16438) Copying property objects results in a TypeError. Steps to reproduce: ``` >>> import copy >>> obj = property() >>> copy.copy(obj) ```` This affects both shallow and deep copying. My idea for a fix is to add property objects to the list of "atomic" objects in the copy module. These already include types like functions and type objects. I also added property objects to the unit tests test_copy_atomic and test_deepcopy_atomic. This is my first PR, and it's highly likely I've made some mistake, so please be kind :) https://bugs.python.org/issue38293 --- Lib/copy.py | 3 ++- Lib/test/test_copy.py | 4 ++-- .../next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst diff --git a/Lib/copy.py b/Lib/copy.py index f53cd8c5874..41873f2c046 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -107,7 +107,7 @@ _copy_dispatch = d = {} def _copy_immutable(x): return x for t in (type(None), int, float, bool, complex, str, tuple, - bytes, frozenset, type, range, slice, + bytes, frozenset, type, range, slice, property, types.BuiltinFunctionType, type(Ellipsis), type(NotImplemented), types.FunctionType, weakref.ref): d[t] = _copy_immutable @@ -195,6 +195,7 @@ d[type] = _deepcopy_atomic d[types.BuiltinFunctionType] = _deepcopy_atomic d[types.FunctionType] = _deepcopy_atomic d[weakref.ref] = _deepcopy_atomic +d[property] = _deepcopy_atomic def _deepcopy_list(x, memo, deepcopy=deepcopy): y = [] diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 45a692022f2..35f72fb216b 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -99,7 +99,7 @@ class TestCopy(unittest.TestCase): 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, b"world", bytes(range(256)), range(10), slice(1, 10, 2), - NewStyle, Classic, max, WithMetaclass] + NewStyle, Classic, max, WithMetaclass, property()] for x in tests: self.assertIs(copy.copy(x), x) @@ -357,7 +357,7 @@ class TestCopy(unittest.TestCase): pass tests = [None, 42, 2**100, 3.14, True, False, 1j, "hello", "hello\u1234", f.__code__, - NewStyle, Classic, max] + NewStyle, Classic, max, property()] for x in tests: self.assertIs(copy.deepcopy(x), x) diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst new file mode 100644 index 00000000000..0b19551970e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst @@ -0,0 +1 @@ +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects. \ No newline at end of file From 6680f4a9f5d15ab82b2ab6266c6f917cb78c919a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sun, 12 Jan 2020 23:38:53 +0300 Subject: [PATCH 109/380] bpo-3530: Add advice on when to correctly use fix_missing_locations in the AST docs (GH-17172) Co-authored-by: Pablo Galindo --- Doc/library/ast.rst | 10 +++++++++- .../2019-11-17-11-53-10.bpo-3530.8zFUMc.rst | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index c380a81bee6..2cee8738e58 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -316,7 +316,7 @@ and classes for traversing abstract syntax trees: class RewriteName(NodeTransformer): def visit_Name(self, node): - return copy_location(Subscript( + return Subscript( value=Name(id='data', ctx=Load()), slice=Index(value=Constant(value=node.id)), ctx=node.ctx @@ -330,6 +330,14 @@ and classes for traversing abstract syntax trees: statement nodes), the visitor may also return a list of nodes rather than just a single node. + If :class:`NodeTransformer` introduces new nodes (that weren't part of + original tree) without giving them location information (such as + :attr:`lineno`), :func:`fix_missing_locations` should be called with + the new sub-tree to recalculate the location information:: + + tree = ast.parse('foo', mode='eval') + new_tree = fix_missing_locations(RewriteName().visit(tree)) + Usually you use the transformer like this:: node = YourTransformer().visit(node) diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst new file mode 100644 index 00000000000..65f1a6d156a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst @@ -0,0 +1,2 @@ +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` example and add +advice on when to use the ``fix_missing_locations`` function. From 14dbe4b3f0a888a60e8cc20f3df5aa09c8bb82c3 Mon Sep 17 00:00:00 2001 From: Ram Rachum Date: Sun, 12 Jan 2020 22:53:00 +0200 Subject: [PATCH 110/380] Fix outdated comment in _strptime.py (GH-17929) Can I please get the tags for skipping bpo and skipping a news item? --- Lib/_strptime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_strptime.py b/Lib/_strptime.py index f4f3c0b80c1..5df37f5f4b8 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -182,7 +182,7 @@ class TimeRE(dict): self.locale_time = LocaleTime() base = super() base.__init__({ - # The " \d" part of the regex is to make %c from ANSI C work + # The " [1-9]" part of the regex is to make %c from ANSI C work 'd': r"(?P3[0-1]|[1-2]\d|0[1-9]|[1-9]| [1-9])", 'f': r"(?P[0-9]{1,6})", 'H': r"(?P2[0-3]|[0-1]\d|\d)", From 61b14151cc92021a10f94765eaa152ed04eb262a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Mon, 13 Jan 2020 01:13:31 +0300 Subject: [PATCH 111/380] bpo-39313: Add an option to RefactoringTool for using exec as a function (GH-17967) https://bugs.python.org/issue39313 Automerge-Triggered-By: @pablogsal --- Doc/library/2to3.rst | 2 +- Lib/lib2to3/main.py | 5 +++++ Lib/lib2to3/refactor.py | 12 ++++++++---- Lib/lib2to3/tests/test_refactor.py | 10 +++++++--- .../Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst | 2 ++ 5 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index c3ff3e607e7..eb4c9185f48 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -102,7 +102,7 @@ presence of the ``from __future__ import print_function`` compiler directive, it modifies its internal grammar to interpret :func:`print` as a function. This change can also be enabled manually with the :option:`!-p` flag. Use :option:`!-p` to run fixers on code that already has had its print statements -converted. +converted. Also :option:`!-e` can be used to make :func:`exec` a function. The :option:`!-o` or :option:`!--output-dir` option allows specification of an alternate directory for processed output files to be written to. The diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py index c51626babf8..f2849fd6be3 100644 --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -154,6 +154,8 @@ def main(fixer_pkg, args=None): help="List available transformations") parser.add_option("-p", "--print-function", action="store_true", help="Modify the grammar so that print() is a function") + parser.add_option("-e", "--exec-function", action="store_true", + help="Modify the grammar so that exec() is a function") parser.add_option("-v", "--verbose", action="store_true", help="More verbose logging") parser.add_option("--no-diffs", action="store_true", @@ -211,6 +213,9 @@ def main(fixer_pkg, args=None): if options.print_function: flags["print_function"] = True + if options.exec_function: + flags["exec_function"] = True + # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py index 55fd60fa27c..3a5aafffc6d 100644 --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -155,6 +155,7 @@ class FixerError(Exception): class RefactoringTool(object): _default_options = {"print_function" : False, + "exec_function": False, "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes @@ -173,10 +174,13 @@ class RefactoringTool(object): self.options = self._default_options.copy() if options is not None: self.options.update(options) - if self.options["print_function"]: - self.grammar = pygram.python_grammar_no_print_statement - else: - self.grammar = pygram.python_grammar + self.grammar = pygram.python_grammar.copy() + + if self.options['print_function']: + del self.grammar.keywords["print"] + elif self.options['exec_function']: + del self.grammar.keywords["exec"] + # When this is True, the refactor*() methods will call write_file() for # files processed even if they were not changed during refactoring. If # and only if the refactor method's write parameter was True. diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py index 9e3b8fbb90b..be705679f06 100644 --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -44,9 +44,13 @@ class TestRefactoringTool(unittest.TestCase): def test_print_function_option(self): rt = self.rt({"print_function" : True}) - self.assertIs(rt.grammar, pygram.python_grammar_no_print_statement) - self.assertIs(rt.driver.grammar, - pygram.python_grammar_no_print_statement) + self.assertNotIn("print", rt.grammar.keywords) + self.assertNotIn("print", rt.driver.grammar.keywords) + + def test_exec_function_option(self): + rt = self.rt({"exec_function" : True}) + self.assertNotIn("exec", rt.grammar.keywords) + self.assertNotIn("exec", rt.driver.grammar.keywords) def test_write_unchanged_files_option(self): rt = self.rt() diff --git a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst new file mode 100644 index 00000000000..784d73c7b3f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst @@ -0,0 +1,2 @@ +Add a new ``exec_function`` option (*--exec-function* in the CLI) to +``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan Taskaya. From b2b4a51f7463a0392456f7772f33223e57fa4ccc Mon Sep 17 00:00:00 2001 From: Philip McMahon Date: Sun, 12 Jan 2020 22:31:49 +0000 Subject: [PATCH 112/380] bpo-32021: Support brotli .br encoding in mimetypes (#12200) Add support for brotli encoding in the encoding_map. --- Lib/mimetypes.py | 1 + .../Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 9b42bf6dd2c..a09e618d8a5 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -401,6 +401,7 @@ def _default_mime_types(): '.Z': 'compress', '.bz2': 'bzip2', '.xz': 'xz', + '.br': 'br', } # Before adding new types, make sure they are either registered with IANA, diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst new file mode 100644 index 00000000000..a07f6d3e85a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst @@ -0,0 +1 @@ +Include brotli .br encoding in mimetypes encodings_map \ No newline at end of file From 7ba6f18de2582755ae31888ba6a4237d96dddc48 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Mon, 13 Jan 2020 03:35:47 -0700 Subject: [PATCH 113/380] bpo-39307: Fix memory leak on error path in parsetok (GH-17953) --- Parser/parsetok.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Parser/parsetok.c b/Parser/parsetok.c index a5d78974b87..2bb733d0dcd 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -246,6 +246,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, if ((ps = PyParser_New(g, start)) == NULL) { err_ret->error = E_NOMEM; + growable_comment_array_deallocate(&type_ignores); PyTokenizer_Free(tok); return NULL; } From 0b2ab21956fbab8eab6d064060d4544499730316 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 13 Jan 2020 12:44:35 +0100 Subject: [PATCH 114/380] bpo-39310: Add math.ulp(x) (GH-17965) Add math.ulp(): return the value of the least significant bit of a float. --- Doc/library/math.rst | 26 +++++++++ Doc/library/sys.rst | 22 +++++--- Doc/whatsnew/3.9.rst | 4 ++ Lib/test/test_math.py | 55 +++++++++---------- .../2020-01-12-13-34-42.bpo-39310.YMRdcj.rst | 1 + Modules/clinic/mathmodule.c.h | 41 +++++++++++++- Modules/mathmodule.c | 32 +++++++++++ 7 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst diff --git a/Doc/library/math.rst b/Doc/library/math.rst index c9f2a383312..c4c180037f8 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -226,6 +226,8 @@ Number-theoretic and representation functions * ``math.nextafter(x, 0.0)`` goes towards zero. * ``math.nextafter(x, math.copysign(math.inf, x))`` goes away from zero. + See also :func:`math.ulp`. + .. versionadded:: 3.9 .. function:: perm(n, k=None) @@ -284,6 +286,30 @@ Number-theoretic and representation functions :class:`~numbers.Integral` (usually an integer). Delegates to :meth:`x.__trunc__() `. +.. function:: ulp(x) + + Return the value of the least significant bit of the float *x*: + + * If *x* is a NaN (not a number), return *x*. + * If *x* is negative, return ``ulp(-x)``. + * If *x* is a positive infinity, return *x*. + * If *x* is equal to zero, return the smallest positive + *denormalized* representable float (smaller than the minimum positive + *normalized* float, :data:`sys.float_info.min `). + * If *x* is equal to the largest positive representable float, + return the value of the least significant bit of *x*, such that the first + float smaller than *x* is ``x - ulp(x)``. + * Otherwise (*x* is a positive finite number), return the value of the least + significant bit of *x*, such that the first float bigger than *x* + is ``x + ulp(x)``. + + ULP stands for "Unit in the Last Place". + + See also :func:`math.nextafter` and :data:`sys.float_info.epsilon + `. + + .. versionadded:: 3.9 + Note that :func:`frexp` and :func:`modf` have a different call/return pattern than their C equivalents: they take a single argument and return a pair of diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 0aae263ff5f..351a8e4c9ea 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -479,8 +479,10 @@ always available. +---------------------+----------------+--------------------------------------------------+ | attribute | float.h macro | explanation | +=====================+================+==================================================+ - | :const:`epsilon` | DBL_EPSILON | difference between 1 and the least value greater | - | | | than 1 that is representable as a float | + | :const:`epsilon` | DBL_EPSILON | difference between 1.0 and the least value | + | | | greater than 1.0 that is representable as a float| + | | | | + | | | See also :func:`math.ulp`. | +---------------------+----------------+--------------------------------------------------+ | :const:`dig` | DBL_DIG | maximum number of decimal digits that can be | | | | faithfully represented in a float; see below | @@ -488,20 +490,24 @@ always available. | :const:`mant_dig` | DBL_MANT_DIG | float precision: the number of base-``radix`` | | | | digits in the significand of a float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max` | DBL_MAX | maximum representable finite float | + | :const:`max` | DBL_MAX | maximum representable positive finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_exp` | DBL_MAX_EXP | maximum integer e such that ``radix**(e-1)`` is | + | :const:`max_exp` | DBL_MAX_EXP | maximum integer *e* such that ``radix**(e-1)`` is| | | | a representable finite float | +---------------------+----------------+--------------------------------------------------+ - | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer e such that ``10**e`` is in the | + | :const:`max_10_exp` | DBL_MAX_10_EXP | maximum integer *e* such that ``10**e`` is in the| | | | range of representable finite floats | +---------------------+----------------+--------------------------------------------------+ - | :const:`min` | DBL_MIN | minimum positive normalized float | + | :const:`min` | DBL_MIN | minimum representable positive *normalized* float| + | | | | + | | | Use :func:`math.ulp(0.0) ` to get the | + | | | smallest positive *denormalized* representable | + | | | float. | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_exp` | DBL_MIN_EXP | minimum integer e such that ``radix**(e-1)`` is | + | :const:`min_exp` | DBL_MIN_EXP | minimum integer *e* such that ``radix**(e-1)`` is| | | | a normalized float | +---------------------+----------------+--------------------------------------------------+ - | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer e such that ``10**e`` is a | + | :const:`min_10_exp` | DBL_MIN_10_EXP | minimum integer *e* such that ``10**e`` is a | | | | normalized float | +---------------------+----------------+--------------------------------------------------+ | :const:`radix` | FLT_RADIX | radix of exponent representation | diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a686d640ae9..340079c0e69 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -184,6 +184,10 @@ Add :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 +of a float. +(Contributed by Victor Stinner in :issue:`39310`.) + nntplib ------- diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index b64fd41a548..6d10227a0c1 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -53,30 +53,6 @@ def to_ulps(x): return n -def ulp(x): - """Return the value of the least significant bit of a - float x, such that the first float bigger than x is x+ulp(x). - Then, given an expected result x and a tolerance of n ulps, - the result y should be such that abs(y-x) <= n * ulp(x). - The results from this function will only make sense on platforms - where native doubles are represented in IEEE 754 binary64 format. - """ - x = abs(float(x)) - if math.isnan(x) or math.isinf(x): - return x - - # Find next float up from x. - n = struct.unpack(' double + + x: double + / + +Return the value of the least significant bit of the float x. +[clinic start generated code]*/ + +static double +math_ulp_impl(PyObject *module, double x) +/*[clinic end generated code: output=f5207867a9384dd4 input=31f9bfbbe373fcaa]*/ +{ + if (Py_IS_NAN(x)) { + return x; + } + x = fabs(x); + if (Py_IS_INFINITY(x)) { + return x; + } + double inf = m_inf(); + double x2 = nextafter(x, inf); + if (Py_IS_INFINITY(x2)) { + /* special case: x is the largest positive representable float */ + x2 = nextafter(x, -inf); + return x - x2; + } + return x2 - x; +} + + static PyMethodDef math_methods[] = { {"acos", math_acos, METH_O, math_acos_doc}, {"acosh", math_acosh, METH_O, math_acosh_doc}, @@ -3366,6 +3397,7 @@ static PyMethodDef math_methods[] = { MATH_PERM_METHODDEF MATH_COMB_METHODDEF MATH_NEXTAFTER_METHODDEF + MATH_ULP_METHODDEF {NULL, NULL} /* sentinel */ }; From d23f78267a9082b6a8fa63ef601fdf9669e57ede Mon Sep 17 00:00:00 2001 From: Emmanuel Arias Date: Mon, 13 Jan 2020 08:58:52 -0300 Subject: [PATCH 115/380] Remove unused functions in Parser/parsetok.c (GH-17365) --- Parser/parsetok.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 2bb733d0dcd..b0b1bd38a7b 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -207,24 +207,6 @@ PyParser_ParseFileFlagsEx(FILE *fp, const char *filename, return n; } -#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD -#if 0 -static const char with_msg[] = -"%s:%d: Warning: 'with' will become a reserved keyword in Python 2.6\n"; - -static const char as_msg[] = -"%s:%d: Warning: 'as' will become a reserved keyword in Python 2.6\n"; - -static void -warn(const char *msg, const char *filename, int lineno) -{ - if (filename == NULL) - filename = ""; - PySys_WriteStderr(msg, filename, lineno); -} -#endif -#endif - /* Parse input coming from the given tokenizer structure. Return error code. */ From 97f1267a5431db97bd6f88f996a35ea516581100 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 13 Jan 2020 12:25:05 +0000 Subject: [PATCH 116/380] Fix typos in gcmodule.c and restructure comments for clarity (GH-17983) --- Modules/gcmodule.c | 80 +++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 44 deletions(-) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index b11ae842e22..5fef114d73e 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -609,7 +609,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) // NEXT_MASK_UNREACHABLE flag, we set it unconditionally. // But this may pollute the unreachable list head's 'next' pointer // too. That's semantically senseless but expedient here - the - // damage is repaired when this fumction ends. + // damage is repaired when this function ends. last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); _PyGCHead_SET_PREV(gc, last); gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable); @@ -1039,7 +1039,7 @@ clear_freelists(void) (void)PyContext_ClearFreeList(); } -// Show stats for objects in each gennerations. +// Show stats for objects in each generations static void show_stats_each_generations(GCState *gcstate) { @@ -1058,17 +1058,17 @@ show_stats_each_generations(GCState *gcstate) buf, gc_list_size(&gcstate->permanent_generation.head)); } -/* Deduce wich objects among "base" are unreachable from outside the list +/* Deduce which objects among "base" are unreachable from outside the list and move them to 'unreachable'. The process consist in the following steps: 1. Copy all reference counts to a different field (gc_prev is used to hold this copy to save memory). 2. Traverse all objects in "base" and visit all referred objects using - "tp_traverse" and for every visited object, substract 1 to the reference + "tp_traverse" and for every visited object, subtract 1 to the reference count (the one that we copied in the previous step). After this step, all objects that can be reached directly from outside must have strictly positive reference count, while all unreachable objects must have a count of exactly 0. -3. Indentify all unreachable objects (the ones with 0 reference count) and move +3. Identify all unreachable objects (the ones with 0 reference count) and move them to the "unreachable" list. This step also needs to move back to "base" all objects that were initially marked as unreachable but are referred transitively by the reachable objects (the ones with strictly positive reference count). @@ -1098,10 +1098,38 @@ deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { /* Leave everything reachable from outside base in base, and move * everything else (in base) to unreachable. + * * NOTE: This used to move the reachable objects into a reachable * set instead. But most things usually turn out to be reachable, - * so it's more efficient to move the unreachable things. See note - ^ [REACHABLE OR UNREACHABLE?] at the file end. + * so it's more efficient to move the unreachable things. It "sounds slick" + * to move the unreachable objects, until you think about it - the reason it + * pays isn't actually obvious. + * + * Suppose we create objects A, B, C in that order. They appear in the young + * generation in the same order. If B points to A, and C to B, and C is + * reachable from outside, then the adjusted refcounts will be 0, 0, and 1 + * respectively. + * + * When move_unreachable finds A, A is moved to the unreachable list. The + * same for B when it's first encountered. Then C is traversed, B is moved + * _back_ to the reachable list. B is eventually traversed, and then A is + * moved back to the reachable list. + * + * So instead of not moving at all, the reachable objects B and A are moved + * twice each. Why is this a win? A straightforward algorithm to move the + * reachable objects instead would move A, B, and C once each. + * + * The key is that this dance leaves the objects in order C, B, A - it's + * reversed from the original order. On all _subsequent_ scans, none of + * them will move. Since most objects aren't in cycles, this can save an + * unbounded number of moves across an unbounded number of later collections. + * It can cost more only the first time the chain is scanned. + * + * Drawback: move_unreachable is also used to find out what's still trash + * after finalizers may resurrect objects. In _that_ case most unreachable + * objects will remain unreachable, so it would be more efficient to move + * the reachable objects instead. But this is a one-time cost, probably not + * worth complicating the code to speed just a little. */ gc_list_init(unreachable); move_unreachable(base, unreachable); // gc_prev is pointer again @@ -1197,7 +1225,7 @@ collect(PyThreadState *tstate, int generation, gc_list_merge(young, old); } else { - /* We only untrack dicts in full collections, to avoid quadratic + /* We only un-track dicts in full collections, to avoid quadratic dict build-up. See issue #14775. */ untrack_dicts(young); gcstate->long_lived_pending = 0; @@ -2269,39 +2297,3 @@ PyObject_GC_Del(void *op) } PyObject_FREE(g); } - -/* ------------------------------------------------------------------------ -Notes - -[REACHABLE OR UNREACHABLE?] - -It "sounds slick" to move the unreachable objects, until you think about -it - the reason it pays isn't actually obvious. - -Suppose we create objects A, B, C in that order. They appear in the young -generation in the same order. If B points to A, and C to B, and C is -reachable from outside, then the adjusted refcounts will be 0, 0, and 1 -respectively. - -When move_unreachable finds A, A is moved to the unreachable list. The -same for B when it's first encountered. Then C is traversed, B is moved -_back_ to the reachable list. B is eventually traversed, and then A is -moved back to the reachable list. - -So instead of not moving at all, the reachable objects B and A are moved -twice each. Why is this a win? A straightforward algorithm to move the -reachable objects instead would move A, B, and C once each. - -The key is that this dance leaves the objects in order C, B, A - it's -reversed from the original order. On all _subsequent_ scans, none of -them will move. Since most objects aren't in cycles, this can save an -unbounded number of moves across an unbounded number of later collections. -It can cost more only the first time the chain is scanned. - -Drawback: move_unreachable is also used to find out what's still trash -after finalizers may resurrect objects. In _that_ case most unreachable -objects will remain unreachable, so it would be more efficient to move -the reachable objects instead. But this is a one-time cost, probably not -worth complicating the code to speed just a little. ------------------------------------------------------------------------- */ - From e7c9f4aae1a8540fe8e9a8a5017b16f906f51068 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 13 Jan 2020 12:51:26 +0000 Subject: [PATCH 117/380] Cleanup exit code for interpreter. (GH-17756) --- Lib/test/test_code.py | 36 ------------------------------------ Python/ceval.c | 11 +++++------ 2 files changed, 5 insertions(+), 42 deletions(-) diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py index 656c46cfaa7..7bb824ea31d 100644 --- a/Lib/test/test_code.py +++ b/Lib/test/test_code.py @@ -434,42 +434,6 @@ if check_impl_detail(cpython=True) and ctypes is not None: tt.join() self.assertEqual(LAST_FREED, 500) - @cpython_only - def test_clean_stack_on_return(self): - - def f(x): - return x - - code = f.__code__ - ct = type(f.__code__) - - # Insert an extra LOAD_FAST, this duplicates the value of - # 'x' in the stack, leaking it if the frame is not properly - # cleaned up upon exit. - - bytecode = list(code.co_code) - bytecode.insert(-2, opcode.opmap['LOAD_FAST']) - bytecode.insert(-2, 0) - - c = ct(code.co_argcount, code.co_posonlyargcount, - code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize+1, - code.co_flags, bytes(bytecode), - code.co_consts, code.co_names, code.co_varnames, - code.co_filename, code.co_name, code.co_firstlineno, - code.co_lnotab, code.co_freevars, code.co_cellvars) - new_function = type(f)(c, f.__globals__, 'nf', f.__defaults__, f.__closure__) - - class Var: - pass - the_object = Var() - var = weakref.ref(the_object) - - new_function(the_object) - - # Check if the_object is leaked - del the_object - assert var() is None - def test_main(verbose=None): from test import test_code diff --git a/Python/ceval.c b/Python/ceval.c index 3bbd0ca9667..f780c212c5f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1913,7 +1913,8 @@ main_loop: case TARGET(RETURN_VALUE): { retval = POP(); assert(f->f_iblock == 0); - goto exit_returning; + assert(EMPTY()); + goto exiting; } case TARGET(GET_AITER): { @@ -2083,7 +2084,7 @@ main_loop: /* and repeat... */ assert(f->f_lasti >= (int)sizeof(_Py_CODEUNIT)); f->f_lasti -= sizeof(_Py_CODEUNIT); - goto exit_yielding; + goto exiting; } case TARGET(YIELD_VALUE): { @@ -2100,7 +2101,7 @@ main_loop: } f->f_stacktop = stack_pointer; - goto exit_yielding; + goto exiting; } case TARGET(POP_EXCEPT): { @@ -3632,15 +3633,13 @@ exception_unwind: assert(retval == NULL); assert(_PyErr_Occurred(tstate)); -exit_returning: - /* Pop remaining stack entries. */ while (!EMPTY()) { PyObject *o = POP(); Py_XDECREF(o); } -exit_yielding: +exiting: if (tstate->use_tracing) { if (tstate->c_tracefunc) { if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, From c1ee6e5e9b87c9812c6745c1dd6c1788a984f9f9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 13 Jan 2020 14:57:14 +0100 Subject: [PATCH 118/380] bpo-20443: Update What's New In Python 3.9 (GH-17986) The sys.argv[0] change has been reverted. --- 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 340079c0e69..b6ffa234536 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -83,7 +83,7 @@ Other Language Changes * 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, ``sys.argv[0]`` and ``sys.path[0]`` become an + the :mod:`__main__` module and ``sys.path[0]`` become an absolute path, rather than a relative path. These paths now remain valid after the current directory is changed by :func:`os.chdir`. As a side effect, a traceback also displays the absolute path for :mod:`__main__` module frames From d8efc1495194228c3a4cd472200275d6491d8e2d Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Mon, 13 Jan 2020 20:09:36 +0530 Subject: [PATCH 119/380] bpo-39299: Add more tests for mimetypes and its cli. (GH-17949) * Add tests for case insensitive check of types and extensions as fallback. * Add tests for data url with no comma. * Add tests for read_mime_types. * Add tests for the mimetypes cli and refactor __main__ code to private function. * Restore mimetypes.knownfiles value at the end of the test. --- Lib/mimetypes.py | 6 ++- Lib/test/test_mimetypes.py | 84 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index a09e618d8a5..e972ca2e291 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -564,7 +564,7 @@ def _default_mime_types(): _default_mime_types() -if __name__ == '__main__': +def _main(): import getopt USAGE = """\ @@ -608,3 +608,7 @@ More than one type argument may be given. guess, encoding = guess_type(gtype, strict) if not guess: print("I don't know anything about type", gtype) else: print('type:', guess, 'encoding:', encoding) + + +if __name__ == '__main__': + _main() diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index a5a06b189de..9cac6ce0225 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -8,10 +8,20 @@ import unittest from test import support from platform import win32_edition -# Tell it we don't know about external files: -mimetypes.knownfiles = [] -mimetypes.inited = False -mimetypes._default_mime_types() + +def setUpModule(): + global knownfiles + knownfiles = mimetypes.knownfiles + + # Tell it we don't know about external files: + mimetypes.knownfiles = [] + mimetypes.inited = False + mimetypes._default_mime_types() + + +def tearDownModule(): + # Restore knownfiles to its initial state + mimetypes.knownfiles = knownfiles class MimeTypesTestCase(unittest.TestCase): @@ -21,6 +31,7 @@ class MimeTypesTestCase(unittest.TestCase): def test_default_data(self): eq = self.assertEqual eq(self.db.guess_type("foo.html"), ("text/html", None)) + eq(self.db.guess_type("foo.HTML"), ("text/html", None)) eq(self.db.guess_type("foo.tgz"), ("application/x-tar", "gzip")) eq(self.db.guess_type("foo.tar.gz"), ("application/x-tar", "gzip")) eq(self.db.guess_type("foo.tar.Z"), ("application/x-tar", "compress")) @@ -30,6 +41,7 @@ class MimeTypesTestCase(unittest.TestCase): def test_data_urls(self): eq = self.assertEqual guess_type = self.db.guess_type + eq(guess_type("data:invalidDataWithoutComma"), (None, None)) eq(guess_type("data:,thisIsTextPlain"), ("text/plain", None)) eq(guess_type("data:;base64,thisIsTextPlain"), ("text/plain", None)) eq(guess_type("data:text/x-foo,thisIsTextXFoo"), ("text/x-foo", None)) @@ -42,6 +54,19 @@ class MimeTypesTestCase(unittest.TestCase): ("x-application/x-unittest", None)) eq(self.db.guess_extension("x-application/x-unittest"), ".pyunit") + def test_read_mime_types(self): + eq = self.assertEqual + + # Unreadable file returns None + self.assertIsNone(mimetypes.read_mime_types("non-existent")) + + with support.temp_dir() as directory: + data = "x-application/x-unittest pyunit\n" + file = pathlib.Path(directory, "sample.mimetype") + file.write_text(data) + mime_dict = mimetypes.read_mime_types(file) + eq(mime_dict[".pyunit"], "x-application/x-unittest") + def test_non_standard_types(self): eq = self.assertEqual # First try strict @@ -49,7 +74,10 @@ class MimeTypesTestCase(unittest.TestCase): eq(self.db.guess_extension('image/jpg', strict=True), None) # And then non-strict eq(self.db.guess_type('foo.xul', strict=False), ('text/xul', None)) + eq(self.db.guess_type('foo.XUL', strict=False), ('text/xul', None)) + eq(self.db.guess_type('foo.invalid', strict=False), (None, None)) eq(self.db.guess_extension('image/jpg', strict=False), '.jpg') + eq(self.db.guess_extension('image/JPG', strict=False), '.jpg') def test_filename_with_url_delimiters(self): # bpo-38449: URL delimiters cases should be handled also. @@ -200,5 +228,53 @@ class MiscTestCase(unittest.TestCase): support.check__all__(self, mimetypes) +class MimetypesCliTestCase(unittest.TestCase): + + def mimetypes_cmd(self, *args, **kwargs): + support.patch(self, sys, "argv", [sys.executable, *args]) + with support.captured_stdout() as output: + mimetypes._main() + return output.getvalue().strip() + + def test_help_option(self): + support.patch(self, sys, "argv", [sys.executable, "-h"]) + with support.captured_stdout() as output: + with self.assertRaises(SystemExit) as cm: + mimetypes._main() + + self.assertIn("Usage: mimetypes.py", output.getvalue()) + self.assertEqual(cm.exception.code, 0) + + def test_invalid_option(self): + support.patch(self, sys, "argv", [sys.executable, "--invalid"]) + with support.captured_stdout() as output: + with self.assertRaises(SystemExit) as cm: + mimetypes._main() + + self.assertIn("Usage: mimetypes.py", output.getvalue()) + self.assertEqual(cm.exception.code, 1) + + def test_guess_extension(self): + eq = self.assertEqual + + extension = self.mimetypes_cmd("-l", "-e", "image/jpg") + eq(extension, ".jpg") + + extension = self.mimetypes_cmd("-e", "image/jpg") + eq(extension, "I don't know anything about type image/jpg") + + extension = self.mimetypes_cmd("-e", "image/jpeg") + eq(extension, ".jpg") + + def test_guess_type(self): + eq = self.assertEqual + + type_info = self.mimetypes_cmd("-l", "foo.pic") + eq(type_info, "type: image/pict encoding: None") + + type_info = self.mimetypes_cmd("foo.pic") + eq(type_info, "I don't know anything about type foo.pic") + + if __name__ == "__main__": unittest.main() From 3430c55417f59078ac397c343894a3ee82a39624 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Mon, 13 Jan 2020 17:30:14 +0100 Subject: [PATCH 120/380] bpo-39164: Add private _PyErr_GetExcInfo() function (GH-17752) This adds a new function named _PyErr_GetExcInfo() that is a variation of the original PyErr_GetExcInfo() taking a PyThreadState as its first argument. That function allows to retrieve the exceptions information of any Python thread -- not only the current one. --- Include/cpython/pyerrors.h | 1 + .../C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst | 1 + Python/errors.c | 14 ++++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index e3098b3925b..f8480fb79e5 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -76,6 +76,7 @@ typedef PyOSErrorObject PyWindowsErrorObject; PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *); _PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate); +PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **); /* Context manipulation (PEP 3134) */ diff --git a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst new file mode 100644 index 00000000000..bb72ac70d5b --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst @@ -0,0 +1 @@ +Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception information of the specified Python thread state. diff --git a/Python/errors.c b/Python/errors.c index d65707e7f97..cdb44605056 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -433,21 +433,27 @@ PyErr_Clear(void) void -PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +_PyErr_GetExcInfo(PyThreadState *tstate, + PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { - PyThreadState *tstate = _PyThreadState_GET(); - _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate); *p_type = exc_info->exc_type; *p_value = exc_info->exc_value; *p_traceback = exc_info->exc_traceback; - Py_XINCREF(*p_type); Py_XINCREF(*p_value); Py_XINCREF(*p_traceback); } + +void +PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) +{ + PyThreadState *tstate = _PyThreadState_GET(); + return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); +} + void PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback) { From 2b1df4592e1691017414337514c6e378eb639498 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 13 Jan 2020 18:46:59 +0100 Subject: [PATCH 121/380] bpo-38644: Pass tstate to _Py_FinishPendingCalls() (GH-17990) _Py_FinishPendingCalls() now expects a tstate argument, instead of a runtime argument. --- Include/internal/pycore_ceval.h | 2 +- Python/ceval.c | 4 ++-- Python/pylifecycle.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 857fc0b2524..2a7c235cfc2 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -15,7 +15,7 @@ struct _frame; #include "pycore_pystate.h" /* PyInterpreterState.eval_frame */ -PyAPI_FUNC(void) _Py_FinishPendingCalls(struct pyruntimestate *runtime); +PyAPI_FUNC(void) _Py_FinishPendingCalls(PyThreadState *tstate); PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *); PyAPI_FUNC(void) _PyEval_FiniThreads( struct _ceval_runtime_state *ceval); diff --git a/Python/ceval.c b/Python/ceval.c index f780c212c5f..e8931c88820 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -585,11 +585,11 @@ error: } void -_Py_FinishPendingCalls(_PyRuntimeState *runtime) +_Py_FinishPendingCalls(PyThreadState *tstate) { assert(PyGILState_Check()); - PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime); + _PyRuntimeState *runtime = tstate->interp->runtime; struct _pending_calls *pending = &runtime->ceval.pending; PyThread_acquire_lock(pending->lock, WAIT_LOCK); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 1d9dff4ce80..d5d60d0a6d4 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1340,7 +1340,7 @@ Py_FinalizeEx(void) wait_for_thread_shutdown(tstate); // Make any remaining pending calls. - _Py_FinishPendingCalls(runtime); + _Py_FinishPendingCalls(tstate); /* The interpreter is still entirely intact at this point, and the * exit funcs may be relying on that. In particular, if some thread From 31d6de5aba009914efa8f0f3c3d7da35217578eb Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Mon, 13 Jan 2020 19:11:34 +0000 Subject: [PATCH 122/380] remove unused __version__ from mock.py (#17977) This isn't included in `__all__` and could be a source of confusion. --- Lib/unittest/mock.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index cd5a2aeb608..5622917dc37 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -23,8 +23,6 @@ __all__ = ( ) -__version__ = '1.0' - import asyncio import contextlib import io From a190e2ade1a704a6b5a94464a0a19b140c7dd031 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 14 Jan 2020 04:34:34 +0900 Subject: [PATCH 123/380] bpo-39259: ftplib.FTP/FTP_TLS now reject timeout = 0 (GH-17959) --- Doc/library/ftplib.rst | 7 +++++++ Doc/whatsnew/3.9.rst | 7 +++++++ Lib/ftplib.py | 11 ++++++----- Lib/test/test_ftplib.py | 4 ++++ .../Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst | 3 +++ 5 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 79a0286fb54..a4bb695a9ab 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -72,6 +72,9 @@ The module defines the following items: .. versionchanged:: 3.3 *source_address* parameter was added. + .. versionchanged:: 3.9 + 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:: FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None) @@ -105,6 +108,10 @@ The module defines the following items: :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + If the *timeout* parameter is set to be zero, it will raise a + :class:`ValueError` to prevent the creation of a non-blocking socket + Here's a sample session using the :class:`FTP_TLS` class:: >>> ftps = FTP_TLS('ftp.pureftpd.org') diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index b6ffa234536..859bf440f89 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -159,6 +159,13 @@ Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK` and :data:`~fcntl.F_OFD_SETLKW`. (Contributed by Dong-hee Na in :issue:`38602`.) +ftplib +------- + +:class:`~ftplib.FTP` and :class:`~ftplib.FTP_TLS` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + gc -- diff --git a/Lib/ftplib.py b/Lib/ftplib.py index c339eb25bc2..71b3c289551 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -146,6 +146,8 @@ class FTP: self.port = port if timeout != -999: self.timeout = timeout + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if source_address is not None: self.source_address = source_address sys.audit("ftplib.connect", self, self.host, self.port) @@ -725,12 +727,12 @@ else: keyfile=keyfile) self.context = context self._prot_p = False - FTP.__init__(self, host, user, passwd, acct, timeout, source_address) + super().__init__(host, user, passwd, acct, timeout, source_address) def login(self, user='', passwd='', acct='', secure=True): if secure and not isinstance(self.sock, ssl.SSLSocket): self.auth() - return FTP.login(self, user, passwd, acct) + return super().login(user, passwd, acct) def auth(self): '''Set up secure control connection by using TLS/SSL.''' @@ -740,8 +742,7 @@ else: resp = self.voidcmd('AUTH TLS') else: resp = self.voidcmd('AUTH SSL') - self.sock = self.context.wrap_socket(self.sock, - server_hostname=self.host) + self.sock = self.context.wrap_socket(self.sock, server_hostname=self.host) self.file = self.sock.makefile(mode='r', encoding=self.encoding) return resp @@ -778,7 +779,7 @@ else: # --- Overridden FTP methods def ntransfercmd(self, cmd, rest=None): - conn, size = FTP.ntransfercmd(self, cmd, rest) + conn, size = super().ntransfercmd(cmd, rest) if self._prot_p: conn = self.context.wrap_socket(conn, server_hostname=self.host) diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 62f673c0615..f40f3a4d9f7 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -1045,6 +1045,10 @@ class TestTimeouts(TestCase): self.evt.wait() ftp.close() + # bpo-39259 + with self.assertRaises(ValueError): + ftplib.FTP(HOST, timeout=0) + def testTimeoutConnect(self): ftp = ftplib.FTP() ftp.connect(HOST, timeout=30) diff --git a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst new file mode 100644 index 00000000000..bfcaff3c3d0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst @@ -0,0 +1,3 @@ +:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From 2de064e6305008d16571a21e5f0c178e62e81f27 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Tue, 14 Jan 2020 17:40:10 +1100 Subject: [PATCH 124/380] bpo-39160 Align the verbs, grammar and defaults for `./configure --help` (GH-17747) --- .../2019-12-30-03-54-24.bpo-39160.aBmj13.rst | 1 + configure | 126 ++++++++++-------- configure.ac | 101 ++++++++------ m4/ax_check_openssl.m4 | 2 +- 4 files changed, 135 insertions(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst diff --git a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst new file mode 100644 index 00000000000..9fb4088de0e --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst @@ -0,0 +1 @@ +Updated the documentation in `./configure --help` to show default values, reference documentation where required and add additional explanation where needed. \ No newline at end of file diff --git a/configure b/configure index a2c7ddf595d..c8253b1455f 100755 --- a/configure +++ b/configure @@ -1483,80 +1483,102 @@ Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-universalsdk[=SDKDIR] - Build fat binary against Mac OS X SDK + create a universal binary build. SDKDIR specifies + which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no) --enable-framework[=INSTALLDIR] - Build (MacOSX|Darwin) framework - --enable-shared disable/enable building shared python library - --enable-profiling enable C-level code profiling - --enable-optimizations Enable expensive, stable optimizations (PGO, etc). - Disabled by default. + create a Python.framework rather than a traditional + Unix install. optional INSTALLDIR specifies the + installation path. see Mac/README.rst (default is + no) + --enable-shared enable building a shared Python library (default is + no) + --enable-profiling enable C-level code profiling with gprof (default is + no) + --enable-optimizations enable expensive, stable optimizations (PGO, etc.) + (default is no) --enable-loadable-sqlite-extensions - support loadable extensions in _sqlite module - --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support - --enable-big-digits[=BITS] - use big digits for Python longs [[BITS=30]] + support loadable extensions in _sqlite module, see + Doc/library/sqlite3.rst (default is no) + --enable-ipv6 enable ipv6 (with ipv4) support, see + Doc/library/socket.rst (default is yes if supported) + --enable-big-digits[=15|30] + use big digits (30 or 15 bits) for Python longs + (default is system-dependent)] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH - select architectures for universal build ("32-bit", - "64-bit", "3-way", "intel", "intel-32", "intel-64", - or "all") + 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 --with-framework-name=FRAMEWORK - specify an alternate name of the framework built - with --enable-framework - --with-cxx-main= - compile main() and link python executable with C++ - compiler - --with-suffix=.exe set executable suffix - --with-pydebug build with Py_DEBUG defined + specify the name for the python framework on macOS + only valid when --enable-framework is set. see + Mac/README.rst (default is 'Python') + --with-cxx-main[=COMPILER] + compile main() and link Python executable with C++ + compiler specified in COMPILER (default is $CXX) + --with-suffix=SUFFIX set executable suffix to SUFFIX (default is '.exe') + --with-pydebug build with Py_DEBUG defined (default is no) --with-trace-refs enable tracing references for debugging purpose - --with-assertions build with C assertions enabled - --with-lto Enable Link Time Optimization in any build. Disabled - by default. + (default is no) + --with-assertions build with C assertions enabled (default is no) + --with-lto enable Link-Time-Optimization in any build (default + is no) --with-hash-algorithm=[fnv|siphash24] - select hash algorithm + select hash algorithm for use in Python/pyhash.c + (default is SipHash24) --with-address-sanitizer - enable AddressSanitizer (asan) - --with-memory-sanitizer enable MemorySanitizer (msan) + enable AddressSanitizer memory error detector, + 'asan' (default is no) + --with-memory-sanitizer enable MemorySanitizer allocation error detector, + 'msan' (default is no) --with-undefined-behavior-sanitizer - enable UndefinedBehaviorSanitizer (ubsan) - --with-libs='lib1 ...' link against additional libs + enable UndefinedBehaviorSanitizer undefined + behaviour detector, 'ubsan' (default is no) + --with-libs='lib1 ...' link against additional libs (default is no) --with-system-expat build pyexpat module using an installed expat - library - --with-system-ffi build _ctypes module using an installed ffi library + library, see Doc/library/pyexpat.rst (default is no) + --with-system-ffi build _ctypes module using an installed ffi library, + see Doc/library/ctypes.rst (default is + system-dependent) --with-system-libmpdec build _decimal module using an installed libmpdec - library + library, see Doc/library/decimal.rst (default is no) --with-tcltk-includes='-I...' override search for Tcl and Tk include files --with-tcltk-libs='-L...' override search for Tcl and Tk libs --with-dbmliborder=db1:db2:... - order to check db backends for dbm. Valid value is a - colon separated string with the backend names - `ndbm', `gdbm' and `bdb'. - --with(out)-doc-strings disable/enable documentation strings - --with(out)-pymalloc disable/enable specialized mallocs - --with(out)-c-locale-coercion - disable/enable C locale coercion to a UTF-8 based - locale - --with-valgrind Enable Valgrind support - --with(out)-dtrace disable/enable DTrace support - --with-libm=STRING math library - --with-libc=STRING C library - --with(out)-computed-gotos - Use computed gotos in evaluation loop (enabled by + override order to check db backends for dbm; a valid + value is a colon separated string with the backend + names `ndbm', `gdbm' and `bdb'. + --with-doc-strings enable documentation strings (default is yes) + --with-pymalloc enable specialized mallocs (default is yes) + --with-c-locale-coercion + enable C locale coercion to a UTF-8 based locale + (default is yes) + --with-valgrind enable Valgrind support (default is no) + --with-dtrace enable DTrace support (default is no) + --with-libm=STRING override libm math library to STRING (default is + system-dependent) + --with-libc=STRING override libc C library to STRING (default is + system-dependent) + --with-computed-gotos enable computed gotos in evaluation loop (enabled by default on supported compilers) - --with(out)-ensurepip=[=upgrade] - "install" or "upgrade" using bundled pip - --with-openssl=DIR root of the OpenSSL directory + --with-ensurepip[=install|upgrade|no] + "install" or "upgrade" using bundled pip (default is + upgrade) + --with-openssl=DIR override root of the OpenSSL directory to DIR --with-ssl-default-suites=[python|openssl|STRING] - Override default cipher suites string, python: use + override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a - custom string, PROTOCOL_SSLv2 ignores the setting + custom string, PROTOCOL_SSLv2 ignores the setting, + see Doc/library/ssl.rst Some influential environment variables: MACHDEP name for machine-dependent library files @@ -3248,7 +3270,7 @@ _ACEOF ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files diff --git a/configure.ac b/configure.ac index 57dca35723c..bcef99c4962 100644 --- a/configure.ac +++ b/configure.ac @@ -149,7 +149,10 @@ CONFIG_ARGS="$ac_configure_args" AC_MSG_CHECKING([for --enable-universalsdk]) AC_ARG_ENABLE(universalsdk, - AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], [Build fat binary against Mac OS X SDK]), + AS_HELP_STRING([--enable-universalsdk@<:@=SDKDIR@:>@], + [create a universal binary build. + SDKDIR specifies which macOS SDK should be used to perform the build, + see Mac/README.rst. (default is no)]), [ case $enableval in yes) @@ -212,7 +215,11 @@ fi AC_SUBST(LIPO_32BIT_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, - AS_HELP_STRING([--with-universal-archs=ARCH], [select architectures for universal build ("32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all")]), + 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") + see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" ], @@ -226,7 +233,9 @@ fi AC_ARG_WITH(framework-name, AS_HELP_STRING([--with-framework-name=FRAMEWORK], - [specify an alternate name of the framework built with --enable-framework]), + [specify the name for the python framework on macOS + only valid when --enable-framework is set. see Mac/README.rst + (default is 'Python')]), [ PYTHONFRAMEWORK=${withval} PYTHONFRAMEWORKDIR=${withval}.framework @@ -238,7 +247,10 @@ AC_ARG_WITH(framework-name, ]) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_ENABLE(framework, - AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], [Build (MacOSX|Darwin) framework]), + AS_HELP_STRING([--enable-framework@<:@=INSTALLDIR@:>@], + [create a Python.framework rather than a traditional Unix install. + optional INSTALLDIR specifies the installation path. see Mac/README.rst + (default is no)]), [ case $enableval in yes) @@ -357,7 +369,7 @@ AC_DEFINE_UNQUOTED(_PYTHONFRAMEWORK, "${PYTHONFRAMEWORK}", [framework name]) ##AC_ARG_WITH(dyld, ## AS_HELP_STRING([--with-dyld], -## [Use (OpenStep|Rhapsody) dynamic linker])) +## [use (OpenStep|Rhapsody) dynamic linker])) ## # Set name for machine-dependent library files AC_ARG_VAR([MACHDEP], [name for machine-dependent library files]) @@ -647,8 +659,8 @@ AC_SUBST(CXX) AC_SUBST(MAINCC) AC_MSG_CHECKING(for --with-cxx-main=) AC_ARG_WITH(cxx_main, - AS_HELP_STRING([--with-cxx-main=], - [compile main() and link python executable with C++ compiler]), + AS_HELP_STRING([--with-cxx-main@<:@=COMPILER@:>@], + [compile main() and link Python executable with C++ compiler specified in COMPILER (default is $CXX)]), [ case $withval in @@ -928,7 +940,7 @@ esac AC_EXEEXT AC_MSG_CHECKING(for --with-suffix) AC_ARG_WITH(suffix, - AS_HELP_STRING([--with-suffix=.exe], [set executable suffix]), + AS_HELP_STRING([--with-suffix=SUFFIX], [set executable suffix to SUFFIX (default is '.exe')]), [ case $withval in no) EXEEXT=;; @@ -1050,7 +1062,7 @@ AC_MSG_RESULT($GNULD) AC_MSG_CHECKING(for --enable-shared) AC_ARG_ENABLE(shared, - AS_HELP_STRING([--enable-shared], [disable/enable building shared python library])) + AS_HELP_STRING([--enable-shared], [enable building a shared Python library (default is no)])) if test -z "$enable_shared" then @@ -1065,7 +1077,7 @@ AC_MSG_RESULT($enable_shared) AC_MSG_CHECKING(for --enable-profiling) AC_ARG_ENABLE(profiling, - AS_HELP_STRING([--enable-profiling], [enable C-level code profiling])) + AS_HELP_STRING([--enable-profiling], [enable C-level code profiling with gprof (default is no)])) if test "x$enable_profiling" = xyes; then ac_save_cc="$CC" CC="$CC -pg" @@ -1216,7 +1228,7 @@ ABIFLAGS="" # Check for --with-pydebug AC_MSG_CHECKING(for --with-pydebug) AC_ARG_WITH(pydebug, - AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined]), + AS_HELP_STRING([--with-pydebug], [build with Py_DEBUG defined (default is no)]), [ if test "$withval" != no then @@ -1233,7 +1245,9 @@ fi], # --with-trace-refs AC_MSG_CHECKING(for --with-trace-refs) AC_ARG_WITH(trace-refs, - AS_HELP_STRING([--with-trace-refs],[enable tracing references for debugging purpose]),, + AS_HELP_STRING( + [--with-trace-refs], + [enable tracing references for debugging purpose (default is no)]),, with_trace_refs=no) AC_MSG_RESULT($with_trace_refs) @@ -1247,7 +1261,7 @@ fi assertions='false' AC_MSG_CHECKING(for --with-assertions) AC_ARG_WITH(assertions, - AS_HELP_STRING([--with-assertions],[build with C assertions enabled]), + AS_HELP_STRING([--with-assertions],[build with C assertions enabled (default is no)]), [ if test "$withval" != no then @@ -1268,7 +1282,9 @@ AC_SUBST(DEF_MAKE_ALL_RULE) AC_SUBST(DEF_MAKE_RULE) Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) -AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive, stable optimizations (PGO, etc). Disabled by default.]), +AC_ARG_ENABLE(optimizations, AS_HELP_STRING( + [--enable-optimizations], + [enable expensive, stable optimizations (PGO, etc.) (default is no)]), [ if test "$enableval" != no then @@ -1323,7 +1339,7 @@ fi # Enable LTO flags AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [Enable Link Time Optimization in any build. Disabled by default.]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [enable Link-Time-Optimization in any build (default is no)]), [ if test "$withval" != no then @@ -2907,7 +2923,7 @@ AC_MSG_CHECKING(for --with-hash-algorithm) dnl quadrigraphs "@<:@" and "@:>@" produce "[" and "]" in the output AC_ARG_WITH(hash_algorithm, AS_HELP_STRING([--with-hash-algorithm=@<:@fnv|siphash24@:>@], - [select hash algorithm]), + [select hash algorithm for use in Python/pyhash.c (default is SipHash24)]), [ AC_MSG_RESULT($withval) case "$withval" in @@ -2927,7 +2943,7 @@ esac AC_MSG_CHECKING(for --with-address-sanitizer) AC_ARG_WITH(address_sanitizer, AS_HELP_STRING([--with-address-sanitizer], - [enable AddressSanitizer (asan)]), + [enable AddressSanitizer memory error detector, 'asan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" @@ -2940,7 +2956,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-memory-sanitizer) AC_ARG_WITH(memory_sanitizer, AS_HELP_STRING([--with-memory-sanitizer], - [enable MemorySanitizer (msan)]), + [enable MemorySanitizer allocation error detector, 'msan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" @@ -2953,7 +2969,7 @@ with_pymalloc="no" AC_MSG_CHECKING(for --with-undefined-behavior-sanitizer) AC_ARG_WITH(undefined_behavior_sanitizer, AS_HELP_STRING([--with-undefined-behavior-sanitizer], - [enable UndefinedBehaviorSanitizer (ubsan)]), + [enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)]), [ AC_MSG_RESULT($withval) BASECFLAGS="-fsanitize=undefined $BASECFLAGS" @@ -2967,7 +2983,7 @@ AC_CHECK_LIB(socket, socket, [LIBS="-lsocket $LIBS"], [], $LIBS) # SVR4 sockets AC_MSG_CHECKING(for --with-libs) AC_ARG_WITH(libs, - AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs]), + AS_HELP_STRING([--with-libs='lib1 ...'], [link against additional libs (default is no)]), [ AC_MSG_RESULT($withval) LIBS="$withval $LIBS" @@ -2979,7 +2995,7 @@ PKG_PROG_PKG_CONFIG # Check for use of the system expat library AC_MSG_CHECKING(for --with-system-expat) AC_ARG_WITH(system_expat, - AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library]), + AS_HELP_STRING([--with-system-expat], [build pyexpat module using an installed expat library, see Doc/library/pyexpat.rst (default is no)]), [], [with_system_expat="no"]) @@ -2988,7 +3004,7 @@ AC_MSG_RESULT($with_system_expat) # Check for use of the system libffi library AC_MSG_CHECKING(for --with-system-ffi) AC_ARG_WITH(system_ffi, - AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library]),,,) + AS_HELP_STRING([--with-system-ffi], [build _ctypes module using an installed ffi library, see Doc/library/ctypes.rst (default is system-dependent)]),,,) if test "$ac_sys_system" = "Darwin" then @@ -3022,7 +3038,7 @@ AC_SUBST(LIBFFI_INCLUDEDIR) # Check for use of the system libmpdec library AC_MSG_CHECKING(for --with-system-libmpdec) AC_ARG_WITH(system_libmpdec, - AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library]), + AS_HELP_STRING([--with-system-libmpdec], [build _decimal module using an installed libmpdec library, see Doc/library/decimal.rst (default is no)]), [], [with_system_libmpdec="no"]) @@ -3031,7 +3047,8 @@ AC_MSG_RESULT($with_system_libmpdec) # Check for support for loadable sqlite extensions AC_MSG_CHECKING(for --enable-loadable-sqlite-extensions) AC_ARG_ENABLE(loadable-sqlite-extensions, - AS_HELP_STRING([--enable-loadable-sqlite-extensions], [support loadable extensions in _sqlite module]), + AS_HELP_STRING([--enable-loadable-sqlite-extensions], + [support loadable extensions in _sqlite module, see Doc/library/sqlite3.rst (default is no)]), [], [enable_loadable_sqlite_extensions="no"]) @@ -3068,7 +3085,7 @@ fi # Check for --with-dbmliborder AC_MSG_CHECKING(for --with-dbmliborder) AC_ARG_WITH(dbmliborder, - AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [order to check db backends for dbm. Valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), + AS_HELP_STRING([--with-dbmliborder=db1:db2:...], [override order to check db backends for dbm; a valid value is a colon separated string with the backend names `ndbm', `gdbm' and `bdb'.]), [ if test x$with_dbmliborder = xyes then @@ -3240,8 +3257,8 @@ fi AH_TEMPLATE(ENABLE_IPV6, [Define if --enable-ipv6 is specified]) AC_MSG_CHECKING([if --enable-ipv6 is specified]) AC_ARG_ENABLE(ipv6, -[ --enable-ipv6 Enable ipv6 (with ipv4) support - --disable-ipv6 Disable ipv6 support], + AS_HELP_STRING([--enable-ipv6], + [enable ipv6 (with ipv4) support, see Doc/library/socket.rst (default is yes if supported)]), [ case "$enableval" in no) AC_MSG_RESULT(no) @@ -3412,7 +3429,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ /* CAN_RAW_FD_FRAMES available check */ # Check for --with-doc-strings AC_MSG_CHECKING(for --with-doc-strings) AC_ARG_WITH(doc-strings, - AS_HELP_STRING([--with(out)-doc-strings], [disable/enable documentation strings])) + AS_HELP_STRING([--with-doc-strings], [enable documentation strings (default is yes)])) if test -z "$with_doc_strings" then with_doc_strings="yes" @@ -3427,7 +3444,7 @@ AC_MSG_RESULT($with_doc_strings) # Check for Python-specific malloc support AC_MSG_CHECKING(for --with-pymalloc) AC_ARG_WITH(pymalloc, - AS_HELP_STRING([--with(out)-pymalloc], [disable/enable specialized mallocs])) + AS_HELP_STRING([--with-pymalloc], [enable specialized mallocs (default is yes)])) if test -z "$with_pymalloc" then @@ -3443,8 +3460,8 @@ AC_MSG_RESULT($with_pymalloc) # Check for --with-c-locale-coercion AC_MSG_CHECKING(for --with-c-locale-coercion) AC_ARG_WITH(c-locale-coercion, - AS_HELP_STRING([--with(out)-c-locale-coercion], - [disable/enable C locale coercion to a UTF-8 based locale])) + AS_HELP_STRING([--with-c-locale-coercion], + [enable C locale coercion to a UTF-8 based locale (default is yes)])) if test -z "$with_c_locale_coercion" then @@ -3460,7 +3477,7 @@ AC_MSG_RESULT($with_c_locale_coercion) # Check for Valgrind support AC_MSG_CHECKING([for --with-valgrind]) AC_ARG_WITH([valgrind], - AS_HELP_STRING([--with-valgrind], [Enable Valgrind support]),, + AS_HELP_STRING([--with-valgrind], [enable Valgrind support (default is no)]),, with_valgrind=no) AC_MSG_RESULT([$with_valgrind]) if test "$with_valgrind" != no; then @@ -3474,7 +3491,7 @@ fi # Check for DTrace support AC_MSG_CHECKING(for --with-dtrace) AC_ARG_WITH(dtrace, - AS_HELP_STRING([--with(out)-dtrace],[disable/enable DTrace support]),, + AS_HELP_STRING([--with-dtrace],[enable DTrace support (default is no)]),, with_dtrace=no) AC_MSG_RESULT($with_dtrace) @@ -4321,7 +4338,7 @@ Darwin) ;; esac AC_MSG_CHECKING(for --with-libm=STRING) AC_ARG_WITH(libm, - AS_HELP_STRING([--with-libm=STRING], [math library]), + AS_HELP_STRING([--with-libm=STRING], [override libm math library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBM= @@ -4337,7 +4354,7 @@ fi], AC_SUBST(LIBC) AC_MSG_CHECKING(for --with-libc=STRING) AC_ARG_WITH(libc, - AS_HELP_STRING([--with-libc=STRING], [C library]), + AS_HELP_STRING([--with-libc=STRING], [override libc C library to STRING (default is system-dependent)]), [ if test "$withval" = no then LIBC= @@ -4555,7 +4572,7 @@ AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTL # determine what size digit to use for Python's longs AC_MSG_CHECKING([digit size for Python's longs]) AC_ARG_ENABLE(big-digits, -AS_HELP_STRING([--enable-big-digits@<:@=BITS@:>@],[use big digits for Python longs [[BITS=30]]]), +AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is system-dependent)]]), [case $enable_big_digits in yes) enable_big_digits=30 ;; @@ -5267,8 +5284,8 @@ fi # Check for --with-computed-gotos AC_MSG_CHECKING(for --with-computed-gotos) AC_ARG_WITH(computed-gotos, - AS_HELP_STRING([--with(out)-computed-gotos], - [Use computed gotos in evaluation loop (enabled by default on supported compilers)]), + AS_HELP_STRING([--with-computed-gotos], + [enable computed gotos in evaluation loop (enabled by default on supported compilers)]), [ if test "$withval" = yes then @@ -5464,8 +5481,8 @@ fi # ensurepip option AC_MSG_CHECKING(for ensurepip) AC_ARG_WITH(ensurepip, - [AS_HELP_STRING([--with(out)-ensurepip=@<:@=upgrade@:>@], - ["install" or "upgrade" using bundled pip])], + [AS_HELP_STRING([--with-ensurepip@<:@=install|upgrade|no@:>@], + ["install" or "upgrade" using bundled pip (default is upgrade)])], [], [with_ensurepip=upgrade]) AS_CASE($with_ensurepip, @@ -5621,11 +5638,11 @@ AH_TEMPLATE(PY_SSL_DEFAULT_CIPHER_STRING, AC_MSG_CHECKING(for --with-ssl-default-suites) AC_ARG_WITH(ssl-default-suites, AS_HELP_STRING([--with-ssl-default-suites=@<:@python|openssl|STRING@:>@], - [Override default cipher suites string, + [override default cipher suites string, python: use Python's preferred selection (default), openssl: leave OpenSSL's defaults untouched, STRING: use a custom string, - PROTOCOL_SSLv2 ignores the setting]), + PROTOCOL_SSLv2 ignores the setting, see Doc/library/ssl.rst]), [ AC_MSG_RESULT($withval) case "$withval" in diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4 index 28e48cbefb6..2846fd14c49 100644 --- a/m4/ax_check_openssl.m4 +++ b/m4/ax_check_openssl.m4 @@ -39,7 +39,7 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ found=false AC_ARG_WITH([openssl], [AS_HELP_STRING([--with-openssl=DIR], - [root of the OpenSSL directory])], + [override root of the OpenSSL directory to DIR])], [ case "$withval" in "" | y | ye | yes | n | no) From 62e3973395fb9fab2eb8f651bcd0fea4e695e1cf Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 14 Jan 2020 16:49:59 +0900 Subject: [PATCH 125/380] bpo-39259: smtp.SMTP/SMTP_SSL now reject timeout = 0 (GH-17958) --- Doc/library/smtplib.rst | 6 ++++++ Doc/whatsnew/3.9.rst | 7 +++++++ Lib/smtplib.py | 15 ++++++++------- Lib/test/test_smtplib.py | 5 +++++ .../2020-01-12-16-34-28.bpo-39259.J_yBVq.rst | 3 +++ 5 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 6176c35a0e4..f6ac123823b 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -70,6 +70,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). .. versionadded:: 3.5 The SMTPUTF8 extension (:rfc:`6531`) is now supported. + .. versionchanged:: 3.9 + 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:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, \ certfile=None [, timeout], context=None, \ @@ -108,6 +111,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). :func:`ssl.create_default_context` select the system's trusted CA certificates for you. + .. versionchanged:: 3.9 + 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, source_address=None) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 859bf440f89..00409af4387 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -259,6 +259,13 @@ now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative import attempts. (Contributed by Ngalim Siregar in :issue:`37444`.) +smtplib +------- + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + signal ------ diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 6513842eb6c..4d5cdb5ac0a 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -303,6 +303,8 @@ class SMTP: def _get_socket(self, host, port, timeout): # This makes it simpler for SMTP_SSL to use the SMTP connect code # and just alter the socket connection bit. + if timeout is not None and not timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') if self.debuglevel > 0: self._print_debug('connect: to', (host, port), self.source_address) return socket.create_connection((host, port), timeout, @@ -1030,13 +1032,12 @@ if _have_ssl: keyfile=keyfile) self.context = context SMTP.__init__(self, host, port, local_hostname, timeout, - source_address) + source_address) def _get_socket(self, host, port, timeout): if self.debuglevel > 0: self._print_debug('connect:', (host, port)) - new_socket = socket.create_connection((host, port), timeout, - self.source_address) + new_socket = super()._get_socket(host, port, timeout) new_socket = self.context.wrap_socket(new_socket, server_hostname=self._host) return new_socket @@ -1065,15 +1066,15 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None): """Initialize a new instance.""" - SMTP.__init__(self, host, port, local_hostname=local_hostname, - source_address=source_address) + super().__init__(host, port, local_hostname=local_hostname, + source_address=source_address) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': - return SMTP.connect(self, host, port, source_address=source_address) + return super().connect(host, port, source_address=source_address) # Handle Unix-domain sockets. try: diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index faf013ac9a6..cc5c4b13464 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -122,6 +122,11 @@ class GeneralTests(unittest.TestCase): self.assertIsNone(smtp.sock.gettimeout()) smtp.close() + def testTimeoutZero(self): + mock_socket.reply_with(b"220 Hola mundo") + with self.assertRaises(ValueError): + smtplib.SMTP(HOST, self.port, timeout=0) + def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") smtp = smtplib.SMTP(HOST, self.port, timeout=30) diff --git a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst new file mode 100644 index 00000000000..6cc490eb35e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst @@ -0,0 +1,3 @@ +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. From 9af0e47b1705457bb6b327c197f2ec5737a1d8f6 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 14 Jan 2020 10:12:45 +0000 Subject: [PATCH 126/380] bpo-39156: Break up COMPARE_OP into four logically distinct opcodes. (GH-17754) Break up COMPARE_OP into four logically distinct opcodes: * COMPARE_OP for rich comparisons * IS_OP for 'is' and 'is not' tests * CONTAINS_OP for 'in' and 'is not' tests * JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. --- Doc/library/dis.rst | 21 + Include/opcode.h | 8 +- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 7 +- Lib/test/test_dis.py | 137 +- Lib/test/test_peepholer.py | 12 +- Lib/test/test_positional_only_arg.py | 6 +- .../2019-12-30-10-53-59.bpo-39156.veT-CB.rst | 9 + PC/launcher.c | 3 +- Python/ceval.c | 137 +- Python/compile.c | 71 +- Python/importlib.h | 2930 ++++++----- Python/importlib_external.h | 4570 ++++++++--------- Python/importlib_zipimport.h | 1833 ++++--- Python/opcode_targets.h | 6 +- Python/peephole.c | 6 +- Tools/scripts/generate_opcode_h.py | 5 - 17 files changed, 4909 insertions(+), 4855 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 1f540d95078..d3124f973f1 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -927,6 +927,20 @@ All of the following opcodes use their arguments. ``cmp_op[opname]``. +.. opcode:: IS_OP (invert) + + 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. + + .. versionadded:: 3.9 + + .. opcode:: IMPORT_NAME (namei) Imports the module ``co_names[namei]``. TOS and TOS1 are popped and provide @@ -961,6 +975,13 @@ All of the following opcodes use their arguments. .. versionadded:: 3.1 +.. 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. + + .. versionadded:: 3.9 + .. opcode:: JUMP_IF_TRUE_OR_POP (target) diff --git a/Include/opcode.h b/Include/opcode.h index 712664224dc..05354847958 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -93,6 +93,9 @@ extern "C" { #define POP_JUMP_IF_FALSE 114 #define POP_JUMP_IF_TRUE 115 #define LOAD_GLOBAL 116 +#define IS_OP 117 +#define CONTAINS_OP 118 +#define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 #define STORE_FAST 125 @@ -132,11 +135,6 @@ extern "C" { remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index d62c6cb77cd..b86612beac8 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -274,6 +274,7 @@ _code_type = type(_write_atomic.__code__) # Python 3.9a0 3420 (add LOAD_ASSERTION_ERROR #34880) # Python 3.9a0 3421 (simplified bytecode for with blocks #32949) # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) +# Python 3.9a2 3423 (add IS_OP, CONTAINS_OP and JUMP_IF_NOT_EXC_MATCH bytecodes #39156) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -282,7 +283,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3422).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3423).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 1898a38abbb..e31563bfbcb 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -21,8 +21,7 @@ try: except ImportError: pass -cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', - 'is not', 'exception match', 'BAD') +cmp_op = ('<', '<=', '==', '!=', '>', '>=') hasconst = [] hasname = [] @@ -159,6 +158,10 @@ jabs_op('POP_JUMP_IF_TRUE', 115) # "" name_op('LOAD_GLOBAL', 116) # Index in name list +def_op('IS_OP', 117) +def_op('CONTAINS_OP', 118) + +jabs_op('JUMP_IF_NOT_EXC_MATCH', 121) jrel_op('SETUP_FINALLY', 122) # Distance to target address def_op('LOAD_FAST', 124) # Local variable number diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index 313eefd9b88..ac5836d2889 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -278,34 +278,33 @@ dis_traceback = """\ --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 44 (to 58) + 12 JUMP_FORWARD 42 (to 56) %3d >> 14 DUP_TOP 16 LOAD_GLOBAL 0 (Exception) - 18 COMPARE_OP 10 (exception match) - 20 POP_JUMP_IF_FALSE 56 - 22 POP_TOP - 24 STORE_FAST 0 (e) - 26 POP_TOP - 28 SETUP_FINALLY 18 (to 48) + 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 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) - 46 JUMP_FORWARD 10 (to 58) - >> 48 LOAD_CONST 0 (None) - 50 STORE_FAST 0 (e) - 52 DELETE_FAST 0 (e) - 54 RERAISE - >> 56 RERAISE +%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 >> 58 LOAD_FAST 1 (tb) - 60 RETURN_VALUE +%3d >> 56 LOAD_FAST 1 (tb) + 58 RETURN_VALUE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 3, @@ -506,7 +505,8 @@ class DisTests(unittest.TestCase): def test_widths(self): for opcode, opname in enumerate(dis.opname): if opname in ('BUILD_MAP_UNPACK_WITH_CALL', - 'BUILD_TUPLE_UNPACK_WITH_CALL'): + 'BUILD_TUPLE_UNPACK_WITH_CALL', + 'JUMP_IF_NOT_EXC_MATCH'): continue with self.subTest(opname=opname): width = dis._OPNAME_WIDTH @@ -1045,63 +1045,62 @@ expected_opinfo_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=28, argval=146, argrepr='to 146', offset=116, 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='COMPARE_OP', opcode=107, arg=10, argval='exception match', argrepr='exception match', offset=122, starts_line=None, is_jump_target=False), - Instruction(opname='POP_JUMP_IF_FALSE', opcode=114, arg=144, argval=144, argrepr='', offset=124, 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='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='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=46, argval=190, argrepr='to 190', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=174, argrepr='to 174', offset=148, starts_line=None, is_jump_target=False), - Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=162, 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='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=190, argrepr='to 190', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=True), - Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=180, argval=180, argrepr='', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='RERAISE', opcode=48, 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=True), + 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_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=190, starts_line=None, is_jump_target=True), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=192, 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=194, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=196, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=212, argrepr='to 212', 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), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=212, starts_line=None, is_jump_target=True), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=214, 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), ] # 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 23cc36c6053..567e6a14361 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -65,14 +65,14 @@ class TestTranforms(BytecodeTestCase): self.check_lnotab(unot) def test_elim_inversion_of_is_or_in(self): - for line, cmp_op in ( - ('not a is b', 'is not',), - ('not a in b', 'not in',), - ('not a is not b', 'is',), - ('not a not in b', 'in',), + for line, cmp_op, invert in ( + ('not a is b', 'IS_OP', 1,), + ('not a is not b', 'IS_OP', 0,), + ('not a in b', 'CONTAINS_OP', 1,), + ('not a not in b', 'CONTAINS_OP', 0,), ): code = compile(line, '', 'single') - self.assertInBytecode(code, 'COMPARE_OP', cmp_op) + self.assertInBytecode(code, cmp_op, invert) self.check_lnotab(code) def test_global_as_constant(self): diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py index bf332e55259..0a9503e2025 100644 --- a/Lib/test/test_positional_only_arg.py +++ b/Lib/test/test_positional_only_arg.py @@ -434,11 +434,11 @@ class PositionalOnlyTestCase(unittest.TestCase): def f(x: not (int is int), /): ... # without constant folding we end up with - # COMPARE_OP(is), UNARY_NOT - # with constant folding we should expect a COMPARE_OP(is not) + # 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(('COMPARE_OP', 'is not'), codes) + self.assertIn(('IS_OP', 1), codes) if __name__ == "__main__": diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst new file mode 100644 index 00000000000..f8d1a1a88a7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst @@ -0,0 +1,9 @@ +Split the COMPARE_OP bytecode instruction into four distinct instructions. + +* COMPARE_OP for rich comparisons +* IS_OP for 'is' and 'is not' tests +* CONTAINS_OP for 'in' and 'is not' tests +* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. + +This improves the clarity of the interpreter and should provide a modest +speedup. diff --git a/PC/launcher.c b/PC/launcher.c index 2749a4e7054..fd5ad0ab1a1 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1247,6 +1247,7 @@ static PYC_MAGIC magic_values[] = { { 3360, 3379, L"3.6" }, { 3390, 3399, L"3.7" }, { 3400, 3419, L"3.8" }, + { 3420, 3429, L"3.9" }, { 0 } }; @@ -1830,7 +1831,7 @@ process(int argc, wchar_t ** argv) #if !defined(VENV_REDIRECT) /* bpo-35811: The __PYVENV_LAUNCHER__ variable is used to - * override sys.executable and locate the original prefix path. + * override sys.executable and locate the original prefix path. * However, if it is silently inherited by a non-venv Python * process, that process will believe it is running in the venv * still. This is the only place where *we* can clear it (that is, diff --git a/Python/ceval.c b/Python/ceval.c index e8931c88820..096645aeebf 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -67,7 +67,6 @@ static void maybe_dtrace_line(PyFrameObject *, int *, int *, int *); static void dtrace_function_entry(PyFrameObject *); static void dtrace_function_return(PyFrameObject *); -static PyObject * cmp_outcome(PyThreadState *, int, PyObject *, PyObject *); static PyObject * import_name(PyThreadState *, PyFrameObject *, PyObject *, PyObject *, PyObject *); static PyObject * import_from(PyThreadState *, PyObject *, PyObject *); @@ -2897,12 +2896,13 @@ main_loop: } case TARGET(COMPARE_OP): { + assert(oparg <= Py_GE); PyObject *right = POP(); PyObject *left = TOP(); - PyObject *res = cmp_outcome(tstate, oparg, left, right); + PyObject *res = PyObject_RichCompare(left, right, oparg); + SET_TOP(res); Py_DECREF(left); Py_DECREF(right); - SET_TOP(res); if (res == NULL) goto error; PREDICT(POP_JUMP_IF_FALSE); @@ -2910,6 +2910,81 @@ main_loop: DISPATCH(); } + case TARGET(IS_OP): { + PyObject *right = POP(); + PyObject *left = TOP(); + int res = (left == right)^oparg; + PyObject *b = res ? Py_True : Py_False; + Py_INCREF(b); + SET_TOP(b); + Py_DECREF(left); + Py_DECREF(right); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + + case TARGET(CONTAINS_OP): { + PyObject *right = POP(); + PyObject *left = POP(); + int res = PySequence_Contains(right, left); + Py_DECREF(left); + Py_DECREF(right); + if (res < 0) { + goto error; + } + PyObject *b = (res^oparg) ? Py_True : Py_False; + Py_INCREF(b); + PUSH(b); + PREDICT(POP_JUMP_IF_FALSE); + PREDICT(POP_JUMP_IF_TRUE); + FAST_DISPATCH(); + } + +#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ + "BaseException is not allowed" + + case TARGET(JUMP_IF_NOT_EXC_MATCH): { + PyObject *right = POP(); + PyObject *left = POP(); + if (PyTuple_Check(right)) { + Py_ssize_t i, length; + length = PyTuple_GET_SIZE(right); + for (i = 0; i < length; i++) { + PyObject *exc = PyTuple_GET_ITEM(right, i); + if (!PyExceptionClass_Check(exc)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + } + else { + if (!PyExceptionClass_Check(right)) { + _PyErr_SetString(tstate, PyExc_TypeError, + CANNOT_CATCH_MSG); + Py_DECREF(left); + Py_DECREF(right); + goto error; + } + } + int res = PyErr_GivenExceptionMatches(left, right); + Py_DECREF(left); + Py_DECREF(right); + if (res > 0) { + /* Exception matches -- Do nothing */; + } + else if (res == 0) { + JUMPTO(oparg); + } + else { + goto error; + } + DISPATCH(); + } + case TARGET(IMPORT_NAME): { PyObject *name = GETITEM(names, oparg); PyObject *fromlist = POP(); @@ -4951,62 +5026,6 @@ _PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) return 1; } - -#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ - "BaseException is not allowed" - -static PyObject * -cmp_outcome(PyThreadState *tstate, int op, PyObject *v, PyObject *w) -{ - int res = 0; - switch (op) { - case PyCmp_IS: - res = (v == w); - break; - case PyCmp_IS_NOT: - res = (v != w); - break; - case PyCmp_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - break; - case PyCmp_NOT_IN: - res = PySequence_Contains(w, v); - if (res < 0) - return NULL; - res = !res; - break; - case PyCmp_EXC_MATCH: - if (PyTuple_Check(w)) { - Py_ssize_t i, length; - length = PyTuple_Size(w); - for (i = 0; i < length; i += 1) { - PyObject *exc = PyTuple_GET_ITEM(w, i); - if (!PyExceptionClass_Check(exc)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - } - else { - if (!PyExceptionClass_Check(w)) { - _PyErr_SetString(tstate, PyExc_TypeError, - CANNOT_CATCH_MSG); - return NULL; - } - } - res = PyErr_GivenExceptionMatches(v, w); - break; - default: - return PyObject_RichCompare(v, w, op); - } - v = res ? Py_True : Py_False; - Py_INCREF(v); - return v; -} - static PyObject * import_name(PyThreadState *tstate, PyFrameObject *f, PyObject *name, PyObject *fromlist, PyObject *level) diff --git a/Python/compile.c b/Python/compile.c index ce6f18a1f57..3138a3f50dd 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1021,7 +1021,11 @@ stack_effect(int opcode, int oparg, int jump) case LOAD_ATTR: return 0; case COMPARE_OP: + case IS_OP: + case CONTAINS_OP: return -1; + case JUMP_IF_NOT_EXC_MATCH: + return -2; case IMPORT_NAME: return -1; case IMPORT_FROM: @@ -1502,6 +1506,12 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) return 0; \ } + +#define ADDOP_COMPARE(C, CMP) { \ + if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \ + return 0; \ +} + /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use the ASDL name to synthesize the name of the C type and the visit function. */ @@ -2433,35 +2443,49 @@ check_compare(struct compiler *c, expr_ty e) return 1; } -static int -cmpop(cmpop_ty op) +static int compiler_addcompare(struct compiler *c, cmpop_ty op) { + int cmp; switch (op) { case Eq: - return PyCmp_EQ; + cmp = Py_EQ; + break; case NotEq: - return PyCmp_NE; + cmp = Py_NE; + break; case Lt: - return PyCmp_LT; + cmp = Py_LT; + break; case LtE: - return PyCmp_LE; + cmp = Py_LE; + break; case Gt: - return PyCmp_GT; + cmp = Py_GT; + break; case GtE: - return PyCmp_GE; + cmp = Py_GE; + break; case Is: - return PyCmp_IS; + ADDOP_I(c, IS_OP, 0); + return 1; case IsNot: - return PyCmp_IS_NOT; + ADDOP_I(c, IS_OP, 1); + return 1; case In: - return PyCmp_IN; + ADDOP_I(c, CONTAINS_OP, 0); + return 1; case NotIn: - return PyCmp_NOT_IN; + ADDOP_I(c, CONTAINS_OP, 1); + return 1; default: - return PyCmp_BAD; + Py_UNREACHABLE(); } + ADDOP_I(c, COMPARE_OP, cmp); + return 1; } + + static int compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) { @@ -2526,14 +2550,12 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, POP_JUMP_IF_FALSE, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); ADDOP_JABS(c, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next); basicblock *end = compiler_new_block(c); if (end == NULL) @@ -2976,8 +2998,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L1: DUP ) [tb, val, exc, exc] ) - [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 - [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 ) + [tb, val, exc, exc, E1] JUMP_IF_NOT_EXC_MATCH L2 ) only if E1 [tb, val, exc] POP [tb, val] (or POP if no V1) [tb] POP @@ -3029,8 +3050,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) if (handler->v.ExceptHandler.type) { ADDOP(c, DUP_TOP); VISIT(c, expr, handler->v.ExceptHandler.type); - ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); - ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); + ADDOP_JABS(c, JUMP_IF_NOT_EXC_MATCH, except); } ADDOP(c, POP_TOP); if (handler->v.ExceptHandler.name) { @@ -3873,8 +3893,7 @@ compiler_compare(struct compiler *c, expr_ty e) n = asdl_seq_LEN(e->v.Compare.ops) - 1; if (n == 0) { VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, 0)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, 0)); } else { basicblock *cleanup = compiler_new_block(c); @@ -3885,14 +3904,12 @@ compiler_compare(struct compiler *c, expr_ty e) (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); ADDOP(c, DUP_TOP); ADDOP(c, ROT_THREE); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, i)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, i)); ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); NEXT_BLOCK(c); } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n)); - ADDOP_I(c, COMPARE_OP, - cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n)))); + ADDOP_COMPARE(c, asdl_seq_GET(e->v.Compare.ops, n)); basicblock *end = compiler_new_block(c); if (end == NULL) return 0; diff --git a/Python/importlib.h b/Python/importlib.h index dea619e29d7..63e2064889b 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -121,7 +121,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0, 67,0,0,0,115,60,0,0,0,116,0,160,1,161,0,125, 1,124,0,106,2,125,2,116,3,160,4,124,2,161,1,125, - 3,124,3,100,0,107,8,114,36,100,1,83,0,124,3,106, + 3,124,3,100,0,117,0,114,36,100,1,83,0,124,3,106, 2,125,2,124,2,124,1,107,2,114,14,100,2,83,0,113, 14,100,0,83,0,41,3,78,70,84,41,5,114,23,0,0, 0,218,9,103,101,116,95,105,100,101,110,116,114,26,0,0, @@ -303,461 +303,460 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,114,49,0,0,0,141,0,0,0,115,6,0,0, 0,8,2,8,4,8,4,114,49,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,138,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,24,4,0,116,3,107,10,114,48,1,0,1,0, - 1,0,100,1,125,1,89,0,110,2,48,0,124,1,100,1, - 107,8,114,112,116,4,100,1,107,8,114,76,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,107,8,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,34,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,176,0,0,0,115,12,0,0,0,0, - 1,8,1,2,4,14,1,8,2,10,0,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,56,0,0,0, - 114,57,0,0,0,114,58,0,0,0,218,8,75,101,121,69, - 114,114,111,114,114,23,0,0,0,114,48,0,0,0,114,20, - 0,0,0,218,8,95,119,101,97,107,114,101,102,114,60,0, - 0,0,114,59,0,0,0,41,3,114,17,0,0,0,114,24, - 0,0,0,114,61,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,52,0,0,0,157,0,0,0, - 115,30,0,0,0,0,6,8,1,2,1,2,1,14,1,14, - 1,10,2,8,1,8,1,10,2,8,2,12,11,18,2,10, - 0,10,2,114,52,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, - 107,10,114,40,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,52,0,0,0,114,38,0,0,0,114,19,0,0,0,114, - 39,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,194,0,0,0,115,12,0,0,0,0,6,8, - 1,2,1,12,1,14,3,6,2,114,64,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,79,0,0,0,115,10,0,0,0,124,0,124,1, - 124,2,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,54,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,211,0,0,0,115,2, - 0,0,0,0,8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115,116,100, - 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,67, - 0,0,0,114,54,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,222,0,0,0,115,8,0, - 0,0,0,2,12,1,10,1,8,1,114,75,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,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,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,34,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,176,0,0,0,115,12,0,0,0,0,1,8, + 1,2,4,14,1,8,2,10,0,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,56,0,0,0,114,57, + 0,0,0,114,58,0,0,0,218,8,75,101,121,69,114,114, + 111,114,114,23,0,0,0,114,48,0,0,0,114,20,0,0, + 0,218,8,95,119,101,97,107,114,101,102,114,60,0,0,0, + 114,59,0,0,0,41,3,114,17,0,0,0,114,24,0,0, + 0,114,61,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,52,0,0,0,157,0,0,0,115,30, + 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,10,0,10, + 2,114,52,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,52,0,0, + 0,114,38,0,0,0,114,19,0,0,0,114,39,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, + 194,0,0,0,115,12,0,0,0,0,6,8,1,2,1,12, + 1,12,3,6,2,114,64,0,0,0,99,1,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,79, + 0,0,0,115,10,0,0,0,124,0,124,1,124,2,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,54,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,211,0,0,0,115,2,0,0,0,0, + 8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115,116,100,101,114,114,41, + 3,218,7,109,101,115,115,97,103,101,114,67,0,0,0,114, + 54,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,222,0,0,0,115,8,0,0,0,0,2, + 12,1,10,1,8,1,114,75,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,44,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,232, + 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,82,0,0,0,114,83,0,0,0,114,10,0,0,0, + 114,81,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,230,0,0, + 0,115,6,0,0,0,0,2,12,5,10,1,114,85,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,124,1,116,0,106,1, - 107,7,114,28,116,2,100,1,160,3,124,1,161,1,124,1, + 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, - 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,44,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,232,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,82,0,0,0,114,83,0,0,0,114, - 10,0,0,0,114,81,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,230,0,0,0,115,6,0,0,0,0,2,12,5,10,1, - 114,85,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,56,0,0,0, - 218,9,105,115,95,102,114,111,122,101,110,114,78,0,0,0, - 114,44,0,0,0,114,79,0,0,0,114,81,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,243,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,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,84,0,0,0,41, - 2,114,82,0,0,0,114,88,0,0,0,114,10,0,0,0, - 114,81,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,241,0,0,0, - 115,6,0,0,0,0,2,12,5,10,1,114,89,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,62,0,0,0,116,0, - 124,1,124,0,131,2,125,2,124,1,116,1,106,2,107,6, - 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,100,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,80,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,253,0,0, - 0,115,12,0,0,0,0,6,10,1,10,1,10,1,10,1, - 10,2,114,96,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,226,0,0,0,116,0,124,0,100,1,100,0,131,3,125, - 1,116,1,124,1,100,2,131,2,114,56,122,12,124,1,160, - 2,124,0,161,1,87,0,83,0,4,0,116,3,107,10,114, - 54,1,0,1,0,1,0,89,0,110,2,48,0,122,10,124, - 0,106,4,125,2,87,0,110,20,4,0,116,5,107,10,114, - 86,1,0,1,0,1,0,89,0,110,18,48,0,124,2,100, - 0,107,9,114,104,116,6,124,2,131,1,83,0,122,10,124, - 0,106,7,125,3,87,0,110,24,4,0,116,5,107,10,114, - 138,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,58,4,0,116, - 5,107,10,114,208,1,0,1,0,1,0,124,1,100,0,107, - 8,114,188,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,89,0,110,14,48,0,100,6,160,9,124,3,124,4,161, - 2,83,0,100,0,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,98,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,44,0,0,0,41,5,114,95,0,0,0,218,6,108, - 111,97,100,101,114,114,94,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,13,1,0,0,115,46,0,0,0,0, - 2,12,1,10,4,2,1,12,1,14,1,6,1,2,1,10, - 1,14,1,6,2,8,1,8,4,2,1,10,1,14,1,10, - 1,2,1,10,1,14,1,8,1,14,2,22,2,114,110,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,108,0,0,0,114,112, - 0,0,0,114,113,0,0,0,218,26,115,117,98,109,111,100, + 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,56,0,0,0,218,9,105,115, + 95,102,114,111,122,101,110,114,78,0,0,0,114,44,0,0, + 0,114,79,0,0,0,114,81,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,243, + 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,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,84,0,0,0,41,2,114,82,0, + 0,0,114,88,0,0,0,114,10,0,0,0,114,81,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,241,0,0,0,115,6,0,0, + 0,0,2,12,5,10,1,114,89,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,62,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,100,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,80,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,253,0,0,0,115,12,0, + 0,0,0,6,10,1,10,1,10,1,10,1,10,2,114,96, + 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,218,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,56,4,0,116,5,121,200,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,89,0,110,14,48,0,100,6,160,9,124, + 3,124,4,161,2,83,0,100,0,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,98,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,44,0,0,0,41,5,114,95,0,0, + 0,218,6,108,111,97,100,101,114,114,94,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,13,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,22, + 2,114,110,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,30, - 0,0,0,114,17,0,0,0,114,108,0,0,0,114,112,0, - 0,0,114,113,0,0,0,114,114,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,31,0,0,0, - 86,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,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,107,9,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,107,9,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,44,0,0,0,114,17,0,0,0,114, - 108,0,0,0,114,112,0,0,0,218,6,97,112,112,101,110, - 100,114,115,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,54,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,47,0,0,0,98,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,108,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, - 107,10,114,102,1,0,1,0,1,0,116,7,6,0,89,0, - 83,0,48,0,100,0,83,0,114,13,0,0,0,41,8,114, - 115,0,0,0,114,17,0,0,0,114,108,0,0,0,114,112, - 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,105,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,108,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,14,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,107,8,114,52,124,0,106,1,100, - 0,107,9,114,52,124,0,106,2,114,52,116,3,100,0,107, - 8,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,117,0,0,0,114,112,0,0,0,114,116,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,46,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,121,0,0, - 0,120,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,117,0,0,0,41,2,114, - 30,0,0,0,114,121,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,121,0,0,0,129,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,36,0,0,0,124,0,106,0,100,1,107,8,114,26, - 124,0,106,1,160,2,100,2,161,1,100,3,25,0,83,0, - 124,0,106,1,83,0,100,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,115,0,0,0,114,17, - 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, - 46,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,133,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,116,0,0,0,114,46,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,122,0,0,0,141,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,116,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,122,0,0,0,145,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,47,0,0,0,114,124,0,0,0,218,8,112,114,111,112, - 101,114,116,121,114,121,0,0,0,218,6,115,101,116,116,101, - 114,114,129,0,0,0,114,122,0,0,0,114,10,0,0,0, + 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,108,0, + 0,0,114,112,0,0,0,114,113,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,108,0,0, + 0,114,112,0,0,0,114,113,0,0,0,114,114,0,0,0, 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 111,0,0,0,49,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,111,0, - 0,0,169,2,114,112,0,0,0,114,114,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,154,0,0,0,116,0,124,1, - 100,1,131,2,114,74,116,1,100,2,107,8,114,22,116,2, - 130,1,116,1,106,3,125,4,124,3,100,2,107,8,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,107,8,114,138,116,0, - 124,1,100,5,131,2,114,134,122,14,124,1,160,4,124,0, - 161,1,125,3,87,0,113,138,4,0,116,5,107,10,114,130, - 1,0,1,0,1,0,100,2,125,3,89,0,113,138,48,0, + 31,0,0,0,86,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,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,44,0,0,0,114,17, + 0,0,0,114,108,0,0,0,114,112,0,0,0,218,6,97, + 112,112,101,110,100,114,115,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,54,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,47,0,0,0, + 98,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,106,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,100,0,83,0,114,13,0,0,0,41, + 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, + 114,112,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,105,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,108,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,117,0,0,0,114,112,0,0,0,114,116, + 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,46,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, + 0,0,0,120,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,117,0,0,0,41, + 2,114,30,0,0,0,114,121,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,121,0,0,0,129, + 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,36,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,100,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,115,0,0,0, + 114,17,0,0,0,218,10,114,112,97,114,116,105,116,105,111, + 110,114,46,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,133,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,116,0,0,0,114, + 46,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,122,0,0,0,141,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,116,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,122,0,0,0,145,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,47,0,0,0,114,124,0,0,0,218,8,112,114, + 111,112,101,114,116,121,114,121,0,0,0,218,6,115,101,116, + 116,101,114,114,129,0,0,0,114,122,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,111,0,0,0,49,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, + 111,0,0,0,169,2,114,112,0,0,0,114,114,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,152,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,136, + 116,0,124,1,100,5,131,2,114,132,122,14,124,1,160,4, + 124,0,161,1,125,3,87,0,113,136,4,0,116,5,121,128, + 1,0,1,0,1,0,100,2,125,3,89,0,113,136,48,0, 110,4,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, @@ -775,1030 +774,1027 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,114,11,0,0,0,114,90,0,0,0,150,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,14,1,12,3,4,2,114,90,0,0,0,99,3, + 1,14,1,12,1,12,3,4,2,114,90,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,56,1,0,0,122,10,124,0, - 106,0,125,3,87,0,110,20,4,0,116,1,107,10,114,30, - 1,0,1,0,1,0,89,0,110,14,48,0,124,3,100,0, - 107,9,114,44,124,3,83,0,124,0,106,2,125,4,124,1, - 100,0,107,8,114,90,122,10,124,0,106,3,125,1,87,0, - 110,20,4,0,116,1,107,10,114,88,1,0,1,0,1,0, - 89,0,110,2,48,0,122,10,124,0,106,4,125,5,87,0, - 110,24,4,0,116,1,107,10,114,124,1,0,1,0,1,0, - 100,0,125,5,89,0,110,2,48,0,124,2,100,0,107,8, - 114,184,124,5,100,0,107,8,114,180,122,10,124,1,106,5, - 125,2,87,0,113,184,4,0,116,1,107,10,114,176,1,0, - 1,0,1,0,100,0,125,2,89,0,113,184,48,0,110,4, - 124,5,125,2,122,10,124,0,106,6,125,6,87,0,110,24, - 4,0,116,1,107,10,114,218,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,26,4,0,116,1,107,10,144,1, - 114,4,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,107,8,144,1,114,34,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,112,0,0,0,70,84, - 41,13,114,104,0,0,0,114,105,0,0,0,114,1,0,0, - 0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0,114,121,0,0,0,114, - 115,0,0,0,41,8,114,95,0,0,0,114,108,0,0,0, - 114,112,0,0,0,114,94,0,0,0,114,17,0,0,0,90, - 8,108,111,99,97,116,105,111,110,114,121,0,0,0,114,115, - 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,176,1,0,0,115,72,0,0,0,0,2, - 2,1,10,1,14,1,6,2,8,1,4,2,6,1,8,1, - 2,1,10,1,14,2,6,1,2,1,10,1,14,1,10,1, - 8,1,8,1,2,1,10,1,14,1,12,2,4,1,2,1, - 10,1,14,1,10,1,2,1,14,1,16,1,10,2,14,1, - 20,1,6,1,6,1,114,141,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,226,1,0,0,124,2,115,20,116,0,124,1,100,1, - 100,0,131,3,100,0,107,8,114,54,122,12,124,0,106,1, - 124,1,95,2,87,0,110,20,4,0,116,3,107,10,114,52, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,115,74, - 116,0,124,1,100,2,100,0,131,3,100,0,107,8,114,178, - 124,0,106,4,125,3,124,3,100,0,107,8,114,146,124,0, - 106,5,100,0,107,9,114,146,116,6,100,0,107,8,114,110, + 0,0,0,67,0,0,0,115,42,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,176,124,5,100,0, + 117,0,114,172,122,10,124,1,106,5,125,2,87,0,113,176, + 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, + 89,0,113,176,48,0,110,4,124,5,125,2,122,10,124,0, + 106,6,125,6,87,0,110,22,4,0,116,1,121,208,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,246,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,20,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,112,0,0,0, + 70,84,41,13,114,104,0,0,0,114,105,0,0,0,114,1, + 0,0,0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0,114,121,0,0, + 0,114,115,0,0,0,41,8,114,95,0,0,0,114,108,0, + 0,0,114,112,0,0,0,114,94,0,0,0,114,17,0,0, + 0,90,8,108,111,99,97,116,105,111,110,114,121,0,0,0, + 114,115,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,176,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,12,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,141,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,20,4,0,116,3,107,10,114,176,1,0,1,0, - 1,0,89,0,110,2,48,0,124,2,115,198,116,0,124,1, - 100,3,100,0,131,3,100,0,107,8,114,232,122,12,124,0, - 106,13,124,1,95,14,87,0,110,20,4,0,116,3,107,10, - 114,230,1,0,1,0,1,0,89,0,110,2,48,0,122,10, - 124,0,124,1,95,15,87,0,110,22,4,0,116,3,107,10, - 144,1,114,8,1,0,1,0,1,0,89,0,110,2,48,0, - 124,2,144,1,115,34,116,0,124,1,100,4,100,0,131,3, - 100,0,107,8,144,1,114,82,124,0,106,5,100,0,107,9, - 144,1,114,82,122,12,124,0,106,5,124,1,95,16,87,0, - 110,22,4,0,116,3,107,10,144,1,114,80,1,0,1,0, - 1,0,89,0,110,2,48,0,124,0,106,17,144,1,114,222, - 124,2,144,1,115,114,116,0,124,1,100,5,100,0,131,3, - 100,0,107,8,144,1,114,150,122,12,124,0,106,18,124,1, - 95,11,87,0,110,22,4,0,116,3,107,10,144,1,114,148, - 1,0,1,0,1,0,89,0,110,2,48,0,124,2,144,1, - 115,174,116,0,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,222,124,0,106,19,100,0,107,9,144,1,114,222, - 122,12,124,0,106,19,124,1,95,20,87,0,110,22,4,0, - 116,3,107,10,144,1,114,220,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,97,0,0,0,218,11,95,95,112,97,99,107,97,103,101, - 95,95,114,140,0,0,0,114,107,0,0,0,114,138,0,0, - 0,41,21,114,6,0,0,0,114,17,0,0,0,114,1,0, - 0,0,114,105,0,0,0,114,108,0,0,0,114,115,0,0, - 0,114,125,0,0,0,114,126,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,107,0, - 0,0,114,97,0,0,0,114,129,0,0,0,114,144,0,0, - 0,114,104,0,0,0,114,140,0,0,0,114,122,0,0,0, - 114,112,0,0,0,114,121,0,0,0,114,138,0,0,0,41, - 5,114,94,0,0,0,114,95,0,0,0,114,143,0,0,0, - 114,108,0,0,0,114,145,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,221,1,0, - 0,115,96,0,0,0,0,4,20,1,2,1,12,1,14,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,14,1,6,2, - 20,1,2,1,12,1,14,1,6,2,2,1,10,1,16,1, - 6,2,24,1,12,1,2,1,12,1,16,1,6,2,8,1, - 24,1,2,1,12,1,16,1,6,2,24,1,12,1,2,1, - 12,1,16,1,6,1,114,147,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,107, - 8,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,108,0,0,0,114,148,0,0,0,114,78,0,0, - 0,114,18,0,0,0,114,17,0,0,0,114,147,0,0,0, - 169,2,114,94,0,0,0,114,95,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,37,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,151,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,106,0,0,0,124,0,106,0,100, - 1,107,8,114,14,100,2,110,4,124,0,106,0,125,1,124, - 0,106,1,100,1,107,8,114,66,124,0,106,2,100,1,107, - 8,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,110,36,124,0,106, - 4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0,114,101,0,0,0,114, - 102,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, - 112,0,0,0,114,108,0,0,0,114,44,0,0,0,114,122, - 0,0,0,41,2,114,94,0,0,0,114,17,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,106, - 0,0,0,54,2,0,0,115,16,0,0,0,0,3,20,1, - 10,1,10,1,10,2,16,2,6,1,14,2,114,106,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,1,107,9,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,107,8,114, - 106,124,0,106,8,100,3,107,8,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,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,142,0,0,0,114, - 149,0,0,0,41,14,114,17,0,0,0,114,49,0,0,0, - 114,15,0,0,0,114,91,0,0,0,114,34,0,0,0,114, - 44,0,0,0,114,78,0,0,0,114,108,0,0,0,114,115, - 0,0,0,114,147,0,0,0,114,4,0,0,0,218,11,108, - 111,97,100,95,109,111,100,117,108,101,114,149,0,0,0,218, - 3,112,111,112,41,4,114,94,0,0,0,114,95,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,92,0,0,0,71,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,92,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,26,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,107,6,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,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,107,8, - 114,148,122,12,124,0,106,0,124,1,95,7,87,0,110,20, - 4,0,116,8,107,10,114,146,1,0,1,0,1,0,89,0, - 110,2,48,0,116,6,124,1,100,2,100,0,131,3,100,0, - 107,8,114,226,122,40,124,1,106,9,124,1,95,10,116,11, - 124,1,100,3,131,2,115,202,124,0,106,2,160,12,100,4, - 161,1,100,5,25,0,124,1,95,10,87,0,110,20,4,0, - 116,8,107,10,114,224,1,0,1,0,1,0,89,0,110,2, - 48,0,116,6,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,22,122,10,124,0,124,1,95,13,87,0,110,22, - 4,0,116,8,107,10,144,1,114,20,1,0,1,0,1,0, - 89,0,110,2,48,0,124,1,83,0,41,7,78,114,97,0, - 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, - 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, - 0,0,114,154,0,0,0,114,17,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,155,0,0,0,114,6,0,0,0, - 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, - 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, - 0,0,0,114,150,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,101,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,14,1,6,1,16,1,2,4,8,1,10, - 1,22,1,14,1,6,1,18,1,2,1,10,1,16,1,6, - 1,114,157,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, - 226,0,0,0,124,0,106,0,100,0,107,9,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,168,124,1,116,5,106,6,124,0,106,7,60,0,122,52, - 124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0, - 107,8,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,50,1,0,1,0,1,0,122,14,116,5,106,6, - 124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10, - 114,152,1,0,1,0,1,0,89,0,110,2,48,0,130,0, - 89,0,110,2,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,149,0,0,0,84,114, - 153,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,108,0,0,0,114,4,0,0,0,114,157,0,0,0,114, - 151,0,0,0,90,13,95,105,110,105,116,105,97,108,105,122, - 105,110,103,114,15,0,0,0,114,91,0,0,0,114,17,0, - 0,0,114,115,0,0,0,114,78,0,0,0,114,149,0,0, - 0,114,62,0,0,0,114,155,0,0,0,114,75,0,0,0, - 114,150,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,138,2,0,0,115,48,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,14,1,6, - 1,8,5,14,1,12,1,18,2,8,0,8,2,114,158,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,49,0,0, - 0,114,17,0,0,0,114,158,0,0,0,41,1,114,94,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,93,0,0,0,180,2,0,0,115,4,0,0,0,0, - 9,12,1,114,93,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,159,0,0,0,114,137,0,0,0,41, - 1,114,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,98,0,0,0,206,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,46,0,0, - 0,124,2,100,0,107,9,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,100,0,83,0,169, - 2,78,114,136,0,0,0,41,4,114,56,0,0,0,90,10, - 105,115,95,98,117,105,108,116,105,110,114,90,0,0,0,114, - 137,0,0,0,169,4,218,3,99,108,115,114,80,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,215,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,107,9,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,166,0,0,0,114,108,0, - 0,0,41,4,114,163,0,0,0,114,80,0,0,0,114,164, - 0,0,0,114,94,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,224,2,0,0,115,4,0,0,0,0,9,12, - 1,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,107,7,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,76,0,0,0,114,16,0,0,0, - 41,8,114,17,0,0,0,114,15,0,0,0,114,77,0,0, - 0,114,78,0,0,0,114,44,0,0,0,114,66,0,0,0, - 114,56,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,94,0,0, + 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,97,0,0,0,218,11,95,95,112,97,99,107,97, + 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, + 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, + 1,0,0,0,114,105,0,0,0,114,108,0,0,0,114,115, + 0,0,0,114,125,0,0,0,114,126,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, + 107,0,0,0,114,97,0,0,0,114,129,0,0,0,114,144, + 0,0,0,114,104,0,0,0,114,140,0,0,0,114,122,0, + 0,0,114,112,0,0,0,114,121,0,0,0,114,138,0,0, + 0,41,5,114,94,0,0,0,114,95,0,0,0,114,143,0, + 0,0,114,108,0,0,0,114,145,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,221, + 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,147,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,108,0,0,0,114,148,0,0,0,114,78, + 0,0,0,114,18,0,0,0,114,17,0,0,0,114,147,0, + 0,0,169,2,114,94,0,0,0,114,95,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,37, + 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,151,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,106,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,66,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,110,36,124, + 0,106,4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0,114,101,0,0, + 0,114,102,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,112,0,0,0,114,108,0,0,0,114,44,0,0,0, + 114,122,0,0,0,41,2,114,94,0,0,0,114,17,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,148,0,0,0,236,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,66,0,0,0,114,56,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,95,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,149,0,0,0,244,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,163,0,0,0,114,80, - 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,249,2,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, + 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, + 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, + 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,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,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,142,0,0, + 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, + 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, + 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, + 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,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,92,0,0,0, + 71,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, + 92,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,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,97,0,0,0,114,144, + 0,0,0,114,140,0,0,0,114,127,0,0,0,114,22,0, + 0,0,114,104,0,0,0,41,14,114,108,0,0,0,114,154, + 0,0,0,114,17,0,0,0,114,15,0,0,0,114,91,0, + 0,0,114,155,0,0,0,114,6,0,0,0,114,97,0,0, + 0,114,105,0,0,0,114,1,0,0,0,114,144,0,0,0, + 114,4,0,0,0,114,128,0,0,0,114,104,0,0,0,114, + 150,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,101,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,1,22,1,12, + 1,6,1,18,1,2,1,10,1,14,1,6,1,114,157,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,224,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,166,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,48, + 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, + 61,0,87,0,110,18,4,0,116,11,121,150,1,0,1,0, + 1,0,89,0,110,2,48,0,130,0,89,0,110,2,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,149,0,0,0,84,114,153,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,108,0,0,0,114, + 4,0,0,0,114,157,0,0,0,114,151,0,0,0,90,13, + 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, + 0,0,114,91,0,0,0,114,17,0,0,0,114,115,0,0, + 0,114,78,0,0,0,114,149,0,0,0,114,62,0,0,0, + 114,155,0,0,0,114,75,0,0,0,114,150,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,138,2, + 0,0,115,48,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,1,8,5,14,1,12, + 1,18,2,8,0,8,2,114,158,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,49,0,0,0,114,17,0,0,0, + 114,158,0,0,0,41,1,114,94,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, + 180,2,0,0,115,4,0,0,0,0,9,12,1,114,93,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, + 159,0,0,0,114,137,0,0,0,41,1,114,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 98,0,0,0,206,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,46,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,100,0,83,0,169,2,78,114,136,0,0, + 0,41,4,114,56,0,0,0,90,10,105,115,95,98,117,105, + 108,116,105,110,114,90,0,0,0,114,137,0,0,0,169,4, + 218,3,99,108,115,114,80,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,215,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,166,0,0,0,114,108,0,0,0,41,4,114,163, + 0,0,0,114,80,0,0,0,114,164,0,0,0,114,94,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,224,2, + 0,0,115,4,0,0,0,0,9,12,1,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,76,0,0,0,114,16,0,0,0,41,8,114,17,0,0, + 0,114,15,0,0,0,114,77,0,0,0,114,78,0,0,0, + 114,44,0,0,0,114,66,0,0,0,114,56,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,94,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,148,0,0,0,236, + 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,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,168,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,255,2,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,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,66,0,0, + 0,114,56,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,95,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 149,0,0,0,244,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,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,168,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,114,0,0,0,5,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,137,0,0,0,218,12, - 115,116,97,116,105,99,109,101,116,104,111,100,114,98,0,0, - 0,218,11,99,108,97,115,115,109,101,116,104,111,100,114,166, - 0,0,0,114,167,0,0,0,114,148,0,0,0,114,149,0, - 0,0,114,85,0,0,0,114,169,0,0,0,114,170,0,0, - 0,114,114,0,0,0,114,96,0,0,0,114,154,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,159,0,0,0,195,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,159, - 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,160,0,0,0, - 114,152,0,0,0,41,4,114,44,0,0,0,114,1,0,0, - 0,114,173,0,0,0,114,137,0,0,0,41,1,218,1,109, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 98,0,0,0,25,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,34,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,100,0,83,0,114,161,0,0, - 0,41,4,114,56,0,0,0,114,87,0,0,0,114,90,0, - 0,0,114,137,0,0,0,114,162,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,166,0,0,0, - 34,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,56,0, - 0,0,114,87,0,0,0,41,3,114,163,0,0,0,114,80, - 0,0,0,114,164,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,167,0,0,0,41,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,163,0,0,0, - 114,94,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,114,148,0,0,0,50,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,86,0,0,0,41,10,114,104,0,0,0,114,17,0,0, - 0,114,56,0,0,0,114,87,0,0,0,114,78,0,0,0, - 114,44,0,0,0,114,66,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,95,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,149,0,0,0,54,3, - 0,0,115,14,0,0,0,0,2,8,1,10,1,10,1,2, - 255,6,2,12,1,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,96, - 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,154,0,0,0,63,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,56, - 0,0,0,114,175,0,0,0,114,168,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,169,0,0, - 0,72,3,0,0,115,2,0,0,0,0,4,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,168,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,170,0,0,0, - 78,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, + 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,163,0,0,0,114,80,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,249,2,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, + 168,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,255, + 2,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,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,56,0,0,0,90,17,105,115,95,102,114,111,122, - 101,110,95,112,97,99,107,97,103,101,114,168,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,114, - 0,0,0,84,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,137,0,0,0,114,171,0,0,0, - 114,98,0,0,0,114,172,0,0,0,114,166,0,0,0,114, - 167,0,0,0,114,148,0,0,0,114,149,0,0,0,114,154, - 0,0,0,114,89,0,0,0,114,169,0,0,0,114,170,0, - 0,0,114,114,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,173,0,0,0, - 14,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,173,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, - 56,0,0,0,114,57,0,0,0,114,46,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,53,0, - 0,0,97,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,56,0,0,0,114,59,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,55,0,0, - 0,101,3,0,0,115,2,0,0,0,0,2,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,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,168,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,114,0,0,0,5, + 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,137,0,0,0,218,12,115,116,97,116,105,99, + 109,101,116,104,111,100,114,98,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,166,0,0,0,114,167,0, + 0,0,114,148,0,0,0,114,149,0,0,0,114,85,0,0, + 0,114,169,0,0,0,114,170,0,0,0,114,114,0,0,0, + 114,96,0,0,0,114,154,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,159, + 0,0,0,195,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,159,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,160,0,0,0,114,152,0,0,0,41, + 4,114,44,0,0,0,114,1,0,0,0,114,173,0,0,0, + 114,137,0,0,0,41,1,218,1,109,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,98,0,0,0,25,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, + 34,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,100,0,83,0,114,161,0,0,0,41,4,114,56,0, + 0,0,114,87,0,0,0,114,90,0,0,0,114,137,0,0, + 0,114,162,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,166,0,0,0,34,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,56,0,0,0,114,87,0,0, + 0,41,3,114,163,0,0,0,114,80,0,0,0,114,164,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,167,0,0,0,41,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,163,0,0,0,114,94,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, + 0,0,0,50,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,86,0,0,0,41, + 10,114,104,0,0,0,114,17,0,0,0,114,56,0,0,0, + 114,87,0,0,0,114,78,0,0,0,114,44,0,0,0,114, + 66,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,95,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,149,0,0,0,54,3,0,0,115,14,0,0, + 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,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,96,0,0,0,114,168,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,154,0,0,0,63,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,56,0,0,0,114,175,0, + 0,0,114,168,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,169,0,0,0,72,3,0,0,115, + 2,0,0,0,0,4,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,168,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,170,0,0,0,78,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,56,0,0, + 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, + 107,97,103,101,114,168,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,114,0,0,0,84,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,53,0,0,0,114,55,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,178, - 0,0,0,93,3,0,0,115,6,0,0,0,8,2,4,2, - 8,4,114,178,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,127,0,0,0, - 114,37,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,78,0,0,0,114,44,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,106, - 3,0,0,115,10,0,0,0,0,2,16,1,12,1,8,1, - 8,1,114,187,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,107,8,114,24,100,0,83,0,116,1,124, - 1,124,3,131,2,83,0,114,13,0,0,0,41,2,114,167, - 0,0,0,114,90,0,0,0,41,4,218,6,102,105,110,100, - 101,114,114,17,0,0,0,114,164,0,0,0,114,108,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,115,3,0,0,115,8,0,0,0,0,3,12,1, - 8,1,4,1,114,189,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,107,8,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,107,6,125,4,124,3,68,0,93,234,125,5,116, - 7,131,0,143,96,1,0,122,10,124,5,106,8,125,6,87, - 0,110,56,4,0,116,9,107,10,114,130,1,0,1,0,1, - 0,116,10,124,5,124,0,124,1,131,3,125,7,124,7,100, - 1,107,8,114,126,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,164,48,0,1,0,1,0,1, - 0,89,0,1,0,124,7,100,1,107,9,114,52,124,4,144, - 1,115,22,124,0,116,0,106,6,107,6,144,1,114,22,116, - 0,106,6,124,0,25,0,125,8,122,10,124,8,106,11,125, - 9,87,0,110,28,4,0,116,9,107,10,114,248,1,0,1, - 0,1,0,124,7,6,0,89,0,2,0,1,0,83,0,48, - 0,124,9,100,1,107,8,144,1,114,12,124,7,2,0,1, - 0,83,0,124,9,2,0,1,0,83,0,113,52,124,7,2, - 0,1,0,83,0,113,52,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,78,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,91,0,0,0, - 114,178,0,0,0,114,166,0,0,0,114,105,0,0,0,114, - 189,0,0,0,114,104,0,0,0,41,10,114,17,0,0,0, - 114,164,0,0,0,114,165,0,0,0,114,190,0,0,0,90, - 9,105,115,95,114,101,108,111,97,100,114,188,0,0,0,114, - 166,0,0,0,114,94,0,0,0,114,95,0,0,0,114,104, + 114,137,0,0,0,114,171,0,0,0,114,98,0,0,0,114, + 172,0,0,0,114,166,0,0,0,114,167,0,0,0,114,148, + 0,0,0,114,149,0,0,0,114,154,0,0,0,114,89,0, + 0,0,114,169,0,0,0,114,170,0,0,0,114,114,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,173,0,0,0,14,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,173,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,56,0,0,0,114,57, + 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,53,0,0,0,97,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,56,0,0,0,114,59,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,55,0,0,0,101,3,0,0,115, + 2,0,0,0,0,2,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,53,0,0,0,114, + 55,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,178,0,0,0,93,3,0, + 0,115,6,0,0,0,8,2,4,2,8,4,114,178,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,127,0,0,0,114,37,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,78, + 0,0,0,114,44,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,106,3,0,0,115,10,0, + 0,0,0,2,16,1,12,1,8,1,8,1,114,187,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,167,0,0,0,114,90,0, + 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, + 0,114,164,0,0,0,114,108,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,115,3,0, + 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,189, + 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,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,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,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,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,113,52,124,7,2,0,1,0,83,0,113,52,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,78,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,91,0,0,0,114,178,0,0,0,114,166,0,0,0, + 114,105,0,0,0,114,189,0,0,0,114,104,0,0,0,41, + 10,114,17,0,0,0,114,164,0,0,0,114,165,0,0,0, + 114,190,0,0,0,90,9,105,115,95,114,101,108,111,97,100, + 114,188,0,0,0,114,166,0,0,0,114,94,0,0,0,114, + 95,0,0,0,114,104,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,124,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,10, + 2,10,2,114,194,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,44,0,0,0,114,14,0,0, + 0,218,10,86,97,108,117,101,69,114,114,111,114,114,78,0, + 0,0,169,3,114,17,0,0,0,114,185,0,0,0,114,186, 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,124,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,14,1,12, - 1,8,1,22,2,42,1,8,2,18,1,10,1,2,1,10, - 1,14,4,14,2,10,1,8,2,10,2,10,2,114,194,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,44,0,0,0,114,14,0,0,0,218,10,86,97,108, - 117,101,69,114,114,111,114,114,78,0,0,0,169,3,114,17, - 0,0,0,114,185,0,0,0,114,186,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,171,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,200,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,8,0,0,0,8,0,0,0,67,0,0,0, - 115,220,0,0,0,100,0,125,2,124,0,160,0,100,1,161, - 1,100,2,25,0,125,3,124,3,114,134,124,3,116,1,106, - 2,107,7,114,42,116,3,124,1,124,3,131,2,1,0,124, - 0,116,1,106,2,107,6,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,50,4,0,116,5,107,10,114, - 132,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,107,8,114,172,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,114,216,116,1,106, - 2,124,3,25,0,125,4,116,11,124,4,124,0,160,0,100, - 1,161,1,100,5,25,0,124,7,131,3,1,0,124,7,83, - 0,41,6,78,114,127,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,41,12,114,128,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,66,0,0,0,114,140,0,0,0,114,105,0,0, - 0,218,8,95,69,82,82,95,77,83,71,114,44,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,194,0,0,0,114,158,0,0,0,114, - 5,0,0,0,41,8,114,17,0,0,0,218,7,105,109,112, - 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, - 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, - 0,0,114,94,0,0,0,114,95,0,0,0,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,190,3,0,0,115,42,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,14,1,16,1,20,1,10,1,8,1,20,2,8, - 1,4,2,10,1,22,1,114,205,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,107,8,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,107,8,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,49,0,0,0,114,15, - 0,0,0,114,91,0,0,0,114,34,0,0,0,218,14,95, - 78,69,69,68,83,95,76,79,65,68,73,78,71,114,205,0, - 0,0,114,44,0,0,0,114,203,0,0,0,114,64,0,0, - 0,41,4,114,17,0,0,0,114,204,0,0,0,114,95,0, - 0,0,114,74,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,220,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,207,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,200,0,0,0,114,187,0,0, - 0,114,207,0,0,0,218,11,95,103,99,100,95,105,109,112, - 111,114,116,114,199,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,208,0,0,0,236,3,0,0, - 115,8,0,0,0,0,9,12,1,8,1,12,1,114,208,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,234,0,0,0,124,1,68, - 0,93,224,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,228,116,5,124,0,100, - 6,131,2,114,228,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,107,10,114,226,1,0,125,7,1,0,122, - 54,124,7,106,11,124,6,107,2,114,204,116,12,106,13,160, - 14,124,6,116,15,161,2,100,10,107,9,114,204,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,209,0, - 0,0,114,182,0,0,0,78,41,16,114,195,0,0,0,114, - 196,0,0,0,114,1,0,0,0,114,197,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,212,0,0,0,114, - 44,0,0,0,114,66,0,0,0,114,203,0,0,0,114,17, - 0,0,0,114,15,0,0,0,114,91,0,0,0,114,34,0, - 0,0,114,206,0,0,0,41,8,114,95,0,0,0,218,8, - 102,114,111,109,108,105,115,116,114,204,0,0,0,114,210,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,213,0,0,0, - 251,3,0,0,115,44,0,0,0,0,10,8,1,10,1,4, - 1,12,2,4,1,28,2,8,1,14,1,10,1,2,255,8, - 2,10,1,14,1,2,1,14,1,16,4,10,1,16,255,2, - 2,12,1,26,1,114,213,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, - 107,9,114,82,124,2,100,3,107,9,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,107,9, - 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,107,7,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,144,0,0,0,114,104,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,140, - 0,0,0,114,127,0,0,0,114,22,0,0,0,41,6,114, - 34,0,0,0,114,129,0,0,0,114,191,0,0,0,114,192, - 0,0,0,114,193,0,0,0,114,128,0,0,0,41,3,218, - 7,103,108,111,98,97,108,115,114,185,0,0,0,114,94,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,32,4,0,0,115,38,0,0,0,0,7,10, - 1,10,1,8,1,18,1,22,2,2,0,2,254,6,3,4, - 1,8,1,6,2,6,2,2,0,2,254,6,3,8,1,8, - 1,14,1,114,219,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,180,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,107,9,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,150,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,110, - 26,116,7,124,5,100,4,131,2,114,172,116,8,124,5,124, - 3,116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41,9,114, - 208,0,0,0,114,219,0,0,0,218,9,112,97,114,116,105, - 116,105,111,110,114,184,0,0,0,114,15,0,0,0,114,91, - 0,0,0,114,1,0,0,0,114,4,0,0,0,114,213,0, - 0,0,41,9,114,17,0,0,0,114,218,0,0,0,218,6, - 108,111,99,97,108,115,114,214,0,0,0,114,186,0,0,0, - 114,95,0,0,0,90,8,103,108,111,98,97,108,115,95,114, - 185,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,59,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,32,1,10,1,12,2,114, - 222,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, - 107,8,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,159,0,0,0,114,166,0, - 0,0,114,78,0,0,0,114,158,0,0,0,41,2,114,17, - 0,0,0,114,94,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,96,4,0,0,115, - 8,0,0,0,0,1,10,1,8,1,12,1,114,223,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,107,6,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,107,7,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,191,0,0,0,114, - 63,0,0,0,78,41,15,114,56,0,0,0,114,15,0,0, - 0,114,14,0,0,0,114,91,0,0,0,218,5,105,116,101, - 109,115,114,195,0,0,0,114,77,0,0,0,114,159,0,0, - 0,114,87,0,0,0,114,173,0,0,0,114,141,0,0,0, - 114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,103,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, - 227,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, - 227,0,0,0,114,15,0,0,0,114,190,0,0,0,114,118, - 0,0,0,114,159,0,0,0,114,173,0,0,0,41,2,114, - 225,0,0,0,114,226,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,138,4,0,0,115,6,0,0,0,0,2,10,2,12, - 1,114,228,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,125,0,0,0,114,228,0,0,0,114, - 15,0,0,0,114,91,0,0,0,114,1,0,0,0,41,1, - 114,229,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,146,4,0,0,115,6,0,0,0,0,3,8,1,4,1, - 114,230,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,125,0,0,0,114,12, - 0,0,0,114,18,0,0,0,114,58,0,0,0,114,33,0, - 0,0,114,42,0,0,0,114,19,0,0,0,114,20,0,0, - 0,114,48,0,0,0,114,49,0,0,0,114,52,0,0,0, - 114,64,0,0,0,114,66,0,0,0,114,75,0,0,0,114, - 85,0,0,0,114,89,0,0,0,114,96,0,0,0,114,110, - 0,0,0,114,111,0,0,0,114,90,0,0,0,114,141,0, - 0,0,114,147,0,0,0,114,151,0,0,0,114,106,0,0, - 0,114,92,0,0,0,114,157,0,0,0,114,158,0,0,0, - 114,93,0,0,0,114,159,0,0,0,114,173,0,0,0,114, - 178,0,0,0,114,187,0,0,0,114,189,0,0,0,114,194, - 0,0,0,114,200,0,0,0,90,15,95,69,82,82,95,77, - 83,71,95,80,82,69,70,73,88,114,202,0,0,0,114,205, - 0,0,0,218,6,111,98,106,101,99,116,114,206,0,0,0, - 114,207,0,0,0,114,208,0,0,0,114,213,0,0,0,114, - 219,0,0,0,114,222,0,0,0,114,223,0,0,0,114,227, - 0,0,0,114,228,0,0,0,114,230,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,68,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,27, - 6,3,8,16,10,15,14,37,8,27,10,37,8,7,8,35, - 8,8, + 0,0,218,13,95,115,97,110,105,116,121,95,99,104,101,99, + 107,171,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,200,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,8,0,0,0,8,0, + 0,0,67,0,0,0,115,218,0,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,114, + 214,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, + 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, + 0,124,7,83,0,41,6,78,114,127,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,41,12,114,128,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,66,0,0,0,114,140,0,0,0, + 114,105,0,0,0,218,8,95,69,82,82,95,77,83,71,114, + 44,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,194,0,0,0,114,158, + 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, + 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, + 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,190,3,0,0,115,42,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,4,2,10,1,22,1,114,205,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,49,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, + 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, + 71,114,205,0,0,0,114,44,0,0,0,114,203,0,0,0, + 114,64,0,0,0,41,4,114,17,0,0,0,114,204,0,0, + 0,114,95,0,0,0,114,74,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,220,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,207,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,200,0,0,0, + 114,187,0,0,0,114,207,0,0,0,218,11,95,103,99,100, + 95,105,109,112,111,114,116,114,199,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,208,0,0,0, + 236,3,0,0,115,8,0,0,0,0,9,12,1,8,1,12, + 1,114,208,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, + 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, + 0,114,196,0,0,0,114,1,0,0,0,114,197,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,212,0,0, + 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, + 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, + 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, + 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, + 210,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,213,0, + 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, + 1,4,1,12,2,4,1,28,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,213,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,144,0,0,0,114,104,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,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, + 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, + 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, + 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, + 94,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,32,4,0,0,115,38,0,0,0,0, + 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, + 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, + 1,8,1,14,1,114,219,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,180,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,150,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,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, + 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41, + 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, + 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, + 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, + 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, + 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, + 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, + 95,114,185,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,59,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,32,1,10,1,12, + 2,114,222,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,159,0,0,0,114, + 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, + 114,17,0,0,0,114,94,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,96,4,0, + 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, + 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,191,0,0, + 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, + 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, + 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, + 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, + 0,0,114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,103,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,227,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,227,0,0,0,114,15,0,0,0,114,190,0,0,0, + 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, + 2,114,225,0,0,0,114,226,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,138,4,0,0,115,6,0,0,0,0,2,10, + 2,12,1,114,228,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,125,0,0,0,114,228,0,0, + 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, + 41,1,114,229,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,146,4,0,0,115,6,0,0,0,0,3,8,1, + 4,1,114,230,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,125,0,0,0, + 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, + 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, + 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, + 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, + 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, + 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, + 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, + 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, + 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, + 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, + 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, + 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, + 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, + 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, + 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, + 114,227,0,0,0,114,228,0,0,0,114,230,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,68,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,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, + 8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 8c1fa3cac8f..52783fc6213 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -69,7 +69,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,10,0,0,0,136,0,116,0,106,1,107,6,83,0, + 0,115,10,0,0,0,136,0,116,0,106,1,118,0,83,0, 41,1,250,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, @@ -158,7 +158,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,107,6,114, + 0,131,1,68,0,93,42,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,113, 44,100,3,124,0,102,2,83,0,41,4,122,32,82,101,112, @@ -189,1933 +189,1930 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,48,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,50,0,0,0,122,12,116, - 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, - 10,114,34,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,48,0,0, - 0,218,7,79,83,69,114,114,111,114,218,7,115,116,95,109, - 111,100,101,41,3,114,43,0,0,0,218,4,109,111,100,101, - 90,9,115,116,97,116,95,105,110,102,111,114,3,0,0,0, - 114,3,0,0,0,114,6,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,14,1,8, - 1,114,52,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,52,0,0,0,114,47,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,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,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,2,0,0, - 0,218,6,103,101,116,99,119,100,114,52,0,0,0,114,47, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,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,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,107,6,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,38,0, - 0,0,233,3,0,0,0,41,3,114,10,0,0,0,114,30, - 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,47,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,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,58,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,182,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,58,4,0,116,11,107,10,114,176,1,0,1, - 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, - 0,110,20,4,0,116,11,107,10,114,168,1,0,1,0,1, - 0,89,0,110,2,48,0,130,0,89,0,110,2,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,59,0,0,0,90,2,119,98,78,41,13,218,6,102,111, - 114,109,97,116,218,2,105,100,114,2,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,49,0,0,0, - 90,6,117,110,108,105,110,107,41,6,114,43,0,0,0,114, - 25,0,0,0,114,51,0,0,0,90,8,112,97,116,104,95, - 116,109,112,90,2,102,100,218,4,102,105,108,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,119, - 114,105,116,101,95,97,116,111,109,105,99,120,0,0,0,115, - 30,0,0,0,0,5,16,1,6,1,16,0,6,255,4,2, - 2,3,14,1,40,1,16,1,14,1,2,1,14,1,14,1, - 6,1,114,68,0,0,0,105,94,13,0,0,114,27,0,0, - 0,114,16,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,107,9, - 114,52,116,0,160,1,100,2,116,2,161,2,1,0,124,2, - 100,1,107,9,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, - 107,8,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,107,8,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,107,9,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, - 107,7,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,39,0,0,0,114,38,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,27,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,2,0,0,0,218,6, - 102,115,112,97,116,104,114,46,0,0,0,114,40,0,0,0, - 114,8,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,35,0,0,0,218,5,102,108,97,103, - 115,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,61,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,58,0,0,0,114,37,0,0,0,114,54,0, - 0,0,114,30,0,0,0,218,6,108,115,116,114,105,112,218, - 8,95,80,89,67,65,67,72,69,41,12,114,43,0,0,0, - 90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,101, - 114,69,0,0,0,218,7,109,101,115,115,97,103,101,218,4, - 104,101,97,100,114,45,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,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,17,99,97,99,104,101, - 95,102,114,111,109,95,115,111,117,114,99,101,41,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,107,8,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,107,9,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,107,7, - 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,71,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,70,0,0, - 0,62,2,0,0,0,114,27,0,0,0,114,56,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, - 56,0,0,0,114,27,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,72,0,0,0,41,22, - 114,8,0,0,0,114,79,0,0,0,114,80,0,0,0,114, - 81,0,0,0,114,2,0,0,0,114,78,0,0,0,114,46, - 0,0,0,114,89,0,0,0,114,29,0,0,0,114,30,0, - 0,0,114,10,0,0,0,114,34,0,0,0,114,22,0,0, - 0,114,91,0,0,0,114,86,0,0,0,218,5,99,111,117, - 110,116,114,42,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,37,0,0, - 0,218,15,83,79,85,82,67,69,95,83,85,70,70,73,88, - 69,83,41,10,114,43,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,69,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,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,115,111,117,114, - 99,101,95,102,114,111,109,95,99,97,99,104,101,112,1,0, - 0,115,52,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,18,2,10,1,8,1,16,1,10,1,16,1,10,1, - 14,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,126,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,36,4,0,116,4,116,5,102,2,107, - 10,114,108,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,122,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,72,0,0,0, - 78,114,70,0,0,0,233,253,255,255,255,233,255,255,255,255, - 90,2,112,121,41,7,114,22,0,0,0,114,40,0,0,0, - 218,5,108,111,119,101,114,114,102,0,0,0,114,81,0,0, - 0,114,86,0,0,0,114,53,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,44,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, - 103,101,116,95,115,111,117,114,99,101,102,105,108,101,152,1, - 0,0,115,20,0,0,0,0,7,12,1,4,1,16,1,24, - 1,4,1,2,1,12,1,18,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,74,0,0,0,124,0, - 160,0,116,1,116,2,131,1,161,1,114,48,122,10,116,3, - 124,0,131,1,87,0,83,0,4,0,116,4,107,10,114,44, - 1,0,1,0,1,0,89,0,113,70,48,0,110,22,124,0, - 160,0,116,1,116,5,131,1,161,1,114,66,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,81,0,0,0,114,88,0, - 0,0,41,1,114,96,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,11,95,103,101,116,95,99, - 97,99,104,101,100,171,1,0,0,115,16,0,0,0,0,1, - 14,1,2,1,10,1,14,1,8,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,52,0,0, - 0,122,14,116,0,124,0,131,1,106,1,125,1,87,0,110, - 24,4,0,116,2,107,10,114,38,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,59,0,0, - 0,233,128,0,0,0,41,3,114,48,0,0,0,114,50,0, - 0,0,114,49,0,0,0,41,2,114,43,0,0,0,114,51, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,10,95,99,97,108,99,95,109,111,100,101,183,1, - 0,0,115,12,0,0,0,0,2,2,1,14,1,14,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,68,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,28, - 4,0,116,2,107,10,114,52,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,66,0,0,0,124,1,100,0,107,8,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,102, - 2,124,2,158,2,124,3,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, - 3,0,0,0,114,6,0,0,0,218,19,95,99,104,101,99, - 107,95,110,97,109,101,95,119,114,97,112,112,101,114,203,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,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,66,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,5,95,119,114,97, - 112,214,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,3,0,0,0,114,121,0,0,0,114,6,0,0,0,218, - 11,95,99,104,101,99,107,95,110,97,109,101,195,1,0,0, - 115,14,0,0,0,0,8,14,7,2,1,10,1,14,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,107,8,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,72,0,0,0,41,6,218,11,102,105,110,100,95,108,111, - 97,100,101,114,114,22,0,0,0,114,74,0,0,0,114,75, - 0,0,0,114,61,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, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, - 109,223,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,158,0,0,0,124,0,100,1,100,2,133,2,25, - 0,125,3,124,3,116,0,107,3,114,60,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,124,2,142, - 1,130,1,116,4,124,0,131,1,100,6,107,0,114,102,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,154,100,10,124,5,155,2,100,11,124,1,155, - 2,157,4,125,4,116,3,124,4,102,1,124,2,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,15,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, - 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,26, - 0,0,0,41,6,114,25,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,82,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,240,1,0,0,115, - 28,0,0,0,0,16,12,1,8,1,16,1,12,1,12,1, - 12,1,10,1,12,1,8,1,16,2,8,1,16,1,12,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,112, - 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,58,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,124,4,142,1,130,1,124,2,100, - 6,107,9,114,108,116,0,124,0,100,2,100,7,133,2,25, - 0,131,1,124,2,100,3,64,0,107,3,114,108,116,3,100, - 4,124,3,155,2,157,2,102,1,124,4,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,14,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,26,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,117,0,0,0,41,6,114,25,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,3,0,0,0,114, - 3,0,0,0,114,6,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,17,2,0,0,115,16,0,0,0,0,19,24,1,10, - 1,12,1,12,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,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 100,1,100,2,133,2,25,0,124,1,107,3,114,34,116,0, - 100,3,124,2,155,2,157,2,102,1,124,3,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,25,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,95, - 118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,121, - 99,45,2,0,0,115,12,0,0,0,0,17,16,1,2,1, - 8,255,2,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,107,9,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,43,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,61, - 0,0,0,41,5,114,25,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, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,99,111,109,112,105,108,101,95,98,121,116,101,99,111,100, - 101,69,2,0,0,115,20,0,0,0,0,2,10,1,10,1, - 12,1,8,1,12,1,4,2,10,1,2,0,2,255,114,165, - 0,0,0,114,72,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,72,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,20,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,25, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,82,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,38,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,20,0,0,0,114,22,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,25,0,0,0,114,82,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,100, - 101,95,116,111,95,104,97,115,104,95,112,121,99,92,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,72,0,0,0,78,84,41,7,218,8,116,111,107, - 101,110,105,122,101,114,63,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,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,13,100,101,99,111,100,101,95, - 115,111,117,114,99,101,103,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,16,1,0,0,124, - 1,100,1,107,8,114,60,100,2,125,1,116,0,124,2,100, - 3,131,2,114,70,122,14,124,2,160,1,124,0,161,1,125, - 1,87,0,113,70,4,0,116,2,107,10,114,56,1,0,1, - 0,1,0,89,0,113,70,48,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,107, - 8,114,154,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,106,124, - 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, - 0,113,154,113,106,100,1,83,0,124,3,116,12,107,8,114, - 220,116,0,124,2,100,6,131,2,114,226,122,14,124,2,160, - 13,124,0,161,1,125,7,87,0,110,20,4,0,116,2,107, - 10,114,206,1,0,1,0,1,0,89,0,113,226,48,0,124, - 7,114,226,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,12,124,1,144, - 1,114,12,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,72,0,0,0,41,17,114,128,0,0,0, - 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, - 78,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,46,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,3,0,0,0,114,3, - 0,0,0,114,6,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,120,2,0,0,115,62,0,0,0,0,12,8,4,4,1, - 10,2,2,1,14,1,14,1,8,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,14,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,56, - 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,107,10,114,50,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,100,0,83,0,114,109,0,0,0, - 41,5,218,7,95,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,49,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,5,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,14,95,111,112, - 101,110,95,114,101,103,105,115,116,114,121,200,2,0,0,115, - 8,0,0,0,0,2,2,1,16,1,14,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,0,0,0,0,0,0,0,0,0,6, - 0,0,0,8,0,0,0,67,0,0,0,115,134,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,22,4,0,116,9, - 107,10,114,128,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,27,0,0,0,41,2,114,139,0,0,0,90,11,115,121, - 115,95,118,101,114,115,105,111,110,114,39,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, - 61,0,0,0,114,8,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,49,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,5,0,0, - 0,90,4,104,107,101,121,218,8,102,105,108,101,112,97,116, - 104,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,16,95,115,101,97,114,99,104,95,114,101,103,105,115,116, - 114,121,207,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,14, - 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,122,0,0,0,124,0,160,0,124,1, - 161,1,125,4,124,4,100,0,107,8,114,22,100,0,83,0, - 122,12,116,1,124,4,131,1,1,0,87,0,110,22,4,0, - 116,2,107,10,114,56,1,0,1,0,1,0,89,0,100,0, - 83,0,48,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,64, - 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,64, - 100,0,83,0,41,2,78,114,180,0,0,0,41,8,114,200, - 0,0,0,114,48,0,0,0,114,49,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, - 43,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, + 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,48,0,0,0,218, + 7,79,83,69,114,114,111,114,218,7,115,116,95,109,111,100, + 101,41,3,114,43,0,0,0,218,4,109,111,100,101,90,9, + 115,116,97,116,95,105,110,102,111,114,3,0,0,0,114,3, + 0,0,0,114,6,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, + 52,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,52,0,0,0,114,47,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 9,102,105,110,100,95,115,112,101,99,222,2,0,0,115,28, - 0,0,0,0,2,10,1,8,1,4,1,2,1,12,1,14, - 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,34,0,0,0,124,0, - 160,0,124,1,124,2,161,2,125,3,124,3,100,1,107,9, - 114,26,124,3,106,1,83,0,100,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,43,0,0,0,114,187, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,238, - 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,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,191,0,0,0,188,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,38,0,0,0,114,70,0,0,0, - 114,72,0,0,0,114,27,0,0,0,218,8,95,95,105,110, - 105,116,95,95,41,4,114,46,0,0,0,114,179,0,0,0, - 114,42,0,0,0,114,40,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,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,182,0,0,0,1,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,3,0,0,0,169,2,114,118,0,0, - 0,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,13,99,114,101,97,116,101,95,109,111, - 100,117,108,101,9,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, - 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,107,8,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,61,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,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,101,120,101,99,95, - 109,111,100,117,108,101,12,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,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, - 20,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,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,208,0,0,0,252,2,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,49,0,0, - 0,169,2,114,118,0,0,0,114,43,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,10,112,97, - 116,104,95,109,116,105,109,101,27,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,10,112, - 97,116,104,95,115,116,97,116,115,35,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, + 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,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,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,2,0,0,0,218, + 6,103,101,116,99,119,100,114,52,0,0,0,114,47,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,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,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,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,38,0,0,0, + 233,3,0,0,0,41,3,114,10,0,0,0,114,30,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,47,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,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,58,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,178,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,54,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,110,18,4, + 0,116,11,121,164,1,0,1,0,1,0,89,0,110,2,48, + 0,130,0,89,0,110,2,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,59,0,0,0,90, + 2,119,98,78,41,13,218,6,102,111,114,109,97,116,218,2, + 105,100,114,2,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,49,0,0,0,90,6,117,110,108,105, + 110,107,41,6,114,43,0,0,0,114,25,0,0,0,114,51, + 0,0,0,90,8,112,97,116,104,95,116,109,112,90,2,102, + 100,218,4,102,105,108,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,13,95,119,114,105,116,101,95,97, + 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, + 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, + 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, + 0,105,95,13,0,0,114,27,0,0,0,114,16,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,39, + 0,0,0,114,38,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,27,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,2,0,0,0,218,6,102,115,112,97,116,104, + 114,46,0,0,0,114,40,0,0,0,114,8,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, + 35,0,0,0,218,5,102,108,97,103,115,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, + 61,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,58,0, + 0,0,114,37,0,0,0,114,54,0,0,0,114,30,0,0, + 0,218,6,108,115,116,114,105,112,218,8,95,80,89,67,65, + 67,72,69,41,12,114,43,0,0,0,90,14,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,114,69,0,0,0,218, + 7,109,101,115,115,97,103,101,218,4,104,101,97,100,114,45, + 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,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, + 115,111,117,114,99,101,42,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,71, + 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,70,0,0,0,62,2,0,0,0, + 114,27,0,0,0,114,56,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,56,0,0,0,114,27, + 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,72,0,0,0,41,22,114,8,0,0,0,114, + 79,0,0,0,114,80,0,0,0,114,81,0,0,0,114,2, + 0,0,0,114,78,0,0,0,114,46,0,0,0,114,89,0, + 0,0,114,29,0,0,0,114,30,0,0,0,114,10,0,0, + 0,114,34,0,0,0,114,22,0,0,0,114,91,0,0,0, + 114,86,0,0,0,218,5,99,111,117,110,116,114,42,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,37,0,0,0,218,15,83,79,85, + 82,67,69,95,83,85,70,70,73,88,69,83,41,10,114,43, + 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,69,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,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, + 109,95,99,97,99,104,101,113,1,0,0,115,52,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,18,2,10,1, + 8,1,16,1,10,1,16,1,10,1,14,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,72,0,0,0,78,114,70,0,0,0,233,253, + 255,255,255,233,255,255,255,255,90,2,112,121,41,7,114,22, + 0,0,0,114,40,0,0,0,218,5,108,111,119,101,114,114, + 102,0,0,0,114,81,0,0,0,114,86,0,0,0,114,53, + 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,44,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,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, + 99,101,102,105,108,101,153,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,72,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,42,1,0,1,0,1,0,89,0,113,68, + 48,0,110,22,124,0,160,0,116,1,116,5,131,1,161,1, + 114,64,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,81, + 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, + 95,103,101,116,95,99,97,99,104,101,100,172,1,0,0,115, + 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,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,59,0,0,0,233,128,0,0,0,41,3,114,48,0,0, + 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, + 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, + 100,101,184,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,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,25,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,15,95,99,97,99,104,101,95, - 98,121,116,101,99,111,100,101,49,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, + 0,0,31,0,0,0,115,66,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,102,2,124,2,158,2,124,3,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,3,0,0,0,114,6,0,0,0,218,19,95,99,104, + 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, + 204,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,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,66,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,5,95,119, + 114,97,112,215,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,3,0,0,0,114,121,0,0,0,114,6,0,0, + 0,218,11,95,99,104,101,99,107,95,110,97,109,101,196,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,72,0,0,0,41,6,218,11,102,105,110,100,95, + 108,111,97,100,101,114,114,22,0,0,0,114,74,0,0,0, + 114,75,0,0,0,114,61,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,17,95,102,105,110,100,95,109,111,100,117,108,101,95,115, + 104,105,109,224,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,158,0,0,0,124,0,100,1,100,2,133, + 2,25,0,125,3,124,3,116,0,107,3,114,60,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,124, + 2,142,1,130,1,116,4,124,0,131,1,100,6,107,0,114, + 102,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,154,100,10,124,5,155,2,100,11,124, + 1,155,2,157,4,125,4,116,3,124,4,102,1,124,2,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,15,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,22,0,0,0,218,8,69,79,70,69,114,114,111,114, + 114,26,0,0,0,41,6,114,25,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,82,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, + 95,99,108,97,115,115,105,102,121,95,112,121,99,241,1,0, + 0,115,28,0,0,0,0,16,12,1,8,1,16,1,12,1, + 12,1,12,1,10,1,12,1,8,1,16,2,8,1,16,1, + 12,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,112,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,58,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,124,4,142,1,130,1,124, + 2,100,6,117,1,114,108,116,0,124,0,100,2,100,7,133, + 2,25,0,131,1,124,2,100,3,64,0,107,3,114,108,116, + 3,100,4,124,3,155,2,157,2,102,1,124,4,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,14,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,26,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,117,0,0,0,41,6,114,25,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,3,0,0, + 0,114,3,0,0,0,114,6,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,18,2,0,0,115,16,0,0,0,0,19,24, + 1,10,1,12,1,12,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,3,0,0,0,67,0,0,0,115,38,0,0,0, + 124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,34, + 116,0,100,3,124,2,155,2,157,2,102,1,124,3,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,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 18,95,118,97,108,105,100,97,116,101,95,104,97,115,104,95, + 112,121,99,46,2,0,0,115,12,0,0,0,0,17,16,1, + 2,1,8,255,2,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,43,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,61,0,0,0,41,5,114,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, + 111,100,101,70,2,0,0,115,20,0,0,0,0,2,10,1, + 10,1,12,1,8,1,12,1,4,2,10,1,2,0,2,255, + 114,165,0,0,0,114,72,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,72,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,20,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,25,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,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,83,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, + 38,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,20,0,0,0,114, + 22,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,25,0,0,0,114,82,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,17,95,99, + 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,93, + 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,72,0,0,0,78,84,41,7,218,8,116, + 111,107,101,110,105,122,101,114,63,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,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,13,100,101,99,111,100, + 101,95,115,111,117,114,99,101,104,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,12,1,0, + 0,124,1,100,1,117,0,114,58,100,2,125,1,116,0,124, + 2,100,3,131,2,114,68,122,14,124,2,160,1,124,0,161, + 1,125,1,87,0,113,68,4,0,116,2,121,54,1,0,1, + 0,1,0,89,0,113,68,48,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,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,104,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,222,122,14,124,2,160, + 13,124,0,161,1,125,7,87,0,110,18,4,0,116,2,121, + 202,1,0,1,0,1,0,89,0,113,222,48,0,124,7,114, + 222,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,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,72,0,0,0,41,17,114,128,0,0,0,114,179, + 0,0,0,114,117,0,0,0,114,2,0,0,0,114,78,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,46,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,3,0,0,0,114,3,0,0, + 0,114,6,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,121, + 2,0,0,115,62,0,0,0,0,12,8,4,4,1,10,2, + 2,1,14,1,12,1,8,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,54,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,100,0,83,0,114,109,0,0,0,41,5,218,7, + 95,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,49,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,5,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,14,95,111,112,101,110,95,114, + 101,103,105,115,116,114,121,201,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,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,27,0,0,0,41, + 2,114,139,0,0,0,90,11,115,121,115,95,118,101,114,115, + 105,111,110,114,39,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,61,0,0,0,114,8, + 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,49,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,5,0,0,0,90,4,104,107,101, + 121,218,8,102,105,108,101,112,97,116,104,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,16,95,115,101,97, + 114,99,104,95,114,101,103,105,115,116,114,121,208,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, + 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,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,52,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,113,62,100,0,83,0,41,2,78,114, + 180,0,0,0,41,8,114,200,0,0,0,114,48,0,0,0, + 114,49,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,43,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,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,9,102,105,110,100,95,115,112, + 101,99,223,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,34,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,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,43,0,0,0,114,187,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,11,102,105,110,100, + 95,109,111,100,117,108,101,239,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,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,191,0,0, + 0,189,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,38, + 0,0,0,114,70,0,0,0,114,72,0,0,0,114,27,0, + 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,46, + 0,0,0,114,179,0,0,0,114,42,0,0,0,114,40,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,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, + 0,2,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,3,0, + 0,0,169,2,114,118,0,0,0,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,99, + 114,101,97,116,101,95,109,111,100,117,108,101,10,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,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,61, + 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,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,101,120,101,99,95,109,111,100,117,108,101,13,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,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,108,111,97, + 100,95,109,111,100,117,108,101,21,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,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,208,0, + 0,0,253,2,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,49,0,0,0,169,2,114,118,0,0,0, + 114,43,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, + 28,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,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,3, - 0,0,0,41,3,114,118,0,0,0,114,43,0,0,0,114, - 25,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,225,0,0,0,59,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,86,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,52,4,0,116,2,107,10,114,76,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,49,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,43,0,0,0,114,174,0,0,0,218,3,101,120,99, + 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,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,10,112,97,116,104,95,115,116,97,116, + 115,36,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,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,25,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 10,103,101,116,95,115,111,117,114,99,101,66,3,0,0,115, - 20,0,0,0,0,2,10,1,2,1,14,1,16,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,25,0,0,0,114,43,0,0,0,114,230, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111, - 100,101,76,3,0,0,115,8,0,0,0,0,5,12,1,2, - 0,2,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,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,26,4,0,116,2,107,10, - 114,68,1,0,1,0,1,0,100,1,125,8,89,0,144,1, - 110,48,48,0,122,14,124,0,160,3,124,2,161,1,125,9, - 87,0,110,22,4,0,116,4,107,10,114,106,1,0,1,0, - 1,0,89,0,144,1,110,10,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,20,4,0,116,4,107,10,114,154,1,0, - 1,0,1,0,89,0,110,218,48,0,124,1,124,8,100,5, + 15,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, + 50,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,3,0,0,0,41,3,114,118,0, + 0,0,114,43,0,0,0,114,25,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,0, + 60,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,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,49,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,43,0,0,0,114,174,0,0, + 0,218,3,101,120,99,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, + 101,67,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,25,0,0,0,114, + 43,0,0,0,114,230,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,14,115,111,117,114,99,101, + 95,116,111,95,99,111,100,101,77,3,0,0,115,8,0,0, + 0,0,5,12,1,2,0,2,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,36,124,12,100,9,64,0,100,8,107,3,125,7, - 116,9,106,10,100,10,107,3,144,1,114,56,124,7,115,254, - 116,9,106,10,100,11,107,2,144,1,114,56,124,0,160,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,26,4,0,116,15,116,16, - 102,2,107,10,144,1,114,84,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,107,8,144,1,114,136,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,30,124,8,100,1,107,9,144,2,114,30, - 124,3,100,1,107,9,144,2,114,30,124,6,144,1,114,228, - 124,5,100,1,107,8,144,1,114,214,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,22,4,0,116,2,107,10,144,2,114,28, - 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,38,0,0,0,114,72,0,0,0,114,27, - 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,81,0,0,0,114,224, - 0,0,0,114,49,0,0,0,114,17,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, - 8,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,22,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,25,0,0,0,114,151,0,0,0,114,82,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,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,84,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,14,1,12,2,2,1,14,1,14, - 1,8,2,12,1,2,1,14,1,14,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,20,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,16,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,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,221,0, - 0,0,25,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,124,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, - 100,16,100,17,132,0,90,12,100,18,100,19,132,0,90,13, - 100,20,100,21,132,0,90,14,100,22,100,23,132,0,90,15, - 135,0,4,0,90,16,83,0,41,24,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,43, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,174,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,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,6,95,95,101,113,95,95,180,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,43,0,0,0,169,1,114,118,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,95, - 104,97,115,104,95,95,184,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,3,0,0,0, - 114,6,0,0,0,114,220,0,0,0,187,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,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, - 47,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,179,0,0,0,199,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,63,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,64,0,0,0,41,3,114, - 118,0,0,0,114,43,0,0,0,114,67,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,227,0, - 0,0,204,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,2,0,0,0,3,0,0,0,67, - 0,0,0,115,18,0,0,0,124,0,160,0,124,1,161,1, - 114,14,124,0,83,0,100,0,83,0,114,109,0,0,0,41, - 1,114,182,0,0,0,169,2,114,118,0,0,0,114,216,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, - 114,101,97,100,101,114,215,3,0,0,115,6,0,0,0,0, - 2,10,1,4,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,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,32, - 0,0,0,116,0,116,1,124,0,106,2,131,1,100,1,25, - 0,124,1,131,2,125,2,116,3,160,4,124,2,100,2,161, - 2,83,0,41,3,78,114,72,0,0,0,114,251,0,0,0, - 41,5,114,37,0,0,0,114,46,0,0,0,114,43,0,0, - 0,114,63,0,0,0,114,64,0,0,0,169,3,114,118,0, - 0,0,90,8,114,101,115,111,117,114,99,101,114,43,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,221, - 3,0,0,115,4,0,0,0,0,1,20,1,122,24,70,105, - 108,101,76,111,97,100,101,114,46,111,112,101,110,95,114,101, - 115,111,117,114,99,101,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, - 38,0,0,0,124,0,160,0,124,1,161,1,115,14,116,1, - 130,1,116,2,116,3,124,0,106,4,131,1,100,1,25,0, - 124,1,131,2,125,2,124,2,83,0,169,2,78,114,72,0, - 0,0,41,5,218,11,105,115,95,114,101,115,111,117,114,99, - 101,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, - 114,114,111,114,114,37,0,0,0,114,46,0,0,0,114,43, - 0,0,0,114,255,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,13,114,101,115,111,117,114,99, - 101,95,112,97,116,104,225,3,0,0,115,8,0,0,0,0, - 1,10,1,4,1,20,1,122,24,70,105,108,101,76,111,97, - 100,101,114,46,114,101,115,111,117,114,99,101,95,112,97,116, - 104,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,40,0,0,0,116, - 0,124,1,107,6,114,12,100,1,83,0,116,1,116,2,124, - 0,106,3,131,1,100,2,25,0,124,1,131,2,125,2,116, - 4,124,2,131,1,83,0,41,3,78,70,114,72,0,0,0, - 41,5,114,34,0,0,0,114,37,0,0,0,114,46,0,0, - 0,114,43,0,0,0,114,53,0,0,0,169,3,114,118,0, - 0,0,114,116,0,0,0,114,43,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,2,1,0,0, - 231,3,0,0,115,8,0,0,0,0,1,8,1,4,1,20, - 1,122,22,70,105,108,101,76,111,97,100,101,114,46,105,115, - 95,114,101,115,111,117,114,99,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,24,0,0,0,116,0,116,1,160,2,116,3,124, - 0,106,4,131,1,100,1,25,0,161,1,131,1,83,0,114, - 1,1,0,0,41,5,218,4,105,116,101,114,114,2,0,0, - 0,218,7,108,105,115,116,100,105,114,114,46,0,0,0,114, - 43,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,99,111,110,116,101,110, - 116,115,237,3,0,0,115,2,0,0,0,0,1,122,19,70, - 105,108,101,76,111,97,100,101,114,46,99,111,110,116,101,110, - 116,115,41,17,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, - 114,0,1,0,0,114,4,1,0,0,114,2,1,0,0,114, - 8,1,0,0,90,13,95,95,99,108,97,115,115,99,101,108, - 108,95,95,114,3,0,0,0,114,3,0,0,0,114,249,0, - 0,0,114,6,0,0,0,114,239,0,0,0,169,3,0,0, - 115,30,0,0,0,8,2,4,3,8,6,8,4,8,3,2, - 1,14,11,2,1,10,4,8,11,2,1,10,5,8,4,8, - 6,8,6,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, - 48,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,43, - 0,0,0,114,238,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,224,0,0,0,245,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,25,0,0,0,114,51,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,226, - 0,0,0,250,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,59,0,0,0,114,11,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,2,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,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,108,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,107,10,114,112,1,0,1,0, - 1,0,89,0,113,60,89,0,113,60,4,0,116,8,107,10, - 114,166,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,113,60,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,54,4,0,116,8,107,10,144,0,114,252,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,46,0,0,0,114,55, - 0,0,0,114,186,0,0,0,114,41,0,0,0,114,37,0, - 0,0,114,2,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, - 49,0,0,0,114,134,0,0,0,114,149,0,0,0,114,68, - 0,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, - 25,0,0,0,114,12,1,0,0,218,6,112,97,114,101,110, - 116,114,96,0,0,0,114,36,0,0,0,114,32,0,0,0, - 114,228,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,225,0,0,0,255,3,0,0,115,48,0, - 0,0,0,2,12,1,4,2,12,1,12,1,12,2,12,1, - 10,1,2,1,14,1,14,2,8,1,16,3,6,1,2,0, - 2,255,4,2,28,1,2,1,12,1,16,1,18,2,8,1, - 2,255,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, + 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,38,0,0,0,114,72,0,0,0,114,27,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,81,0,0,0,114,224,0,0,0,114, + 49,0,0,0,114,17,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,8,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, + 22,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,25,0,0, + 0,114,151,0,0,0,114,82,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,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,213,0,0,0,85,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,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,221,0,0,0,26,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,124,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,100,16,100,17, + 132,0,90,12,100,18,100,19,132,0,90,13,100,20,100,21, + 132,0,90,14,100,22,100,23,132,0,90,15,135,0,4,0, + 90,16,83,0,41,24,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,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,209, + 0,0,0,175,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 6,95,95,101,113,95,95,181,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,43,0, + 0,0,169,1,114,118,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,95,104,97,115,104, + 95,95,185,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,3,0,0,0,114,6,0,0, + 0,114,220,0,0,0,188,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,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,47,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,179,0,0,0,200,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,63,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,64,0,0,0,41,3,114,118,0,0,0, + 114,43,0,0,0,114,67,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,227,0,0,0,205,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,2,0,0,0,3,0,0,0,67,0,0,0,115, + 18,0,0,0,124,0,160,0,124,1,161,1,114,14,124,0, + 83,0,100,0,83,0,114,109,0,0,0,41,1,114,182,0, + 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,19,103, + 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, + 101,114,216,3,0,0,115,6,0,0,0,0,2,10,1,4, + 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,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,32,0,0,0,116, + 0,116,1,124,0,106,2,131,1,100,1,25,0,124,1,131, + 2,125,2,116,3,160,4,124,2,100,2,161,2,83,0,41, + 3,78,114,72,0,0,0,114,251,0,0,0,41,5,114,37, + 0,0,0,114,46,0,0,0,114,43,0,0,0,114,63,0, + 0,0,114,64,0,0,0,169,3,114,118,0,0,0,90,8, + 114,101,115,111,117,114,99,101,114,43,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,13,111,112, + 101,110,95,114,101,115,111,117,114,99,101,222,3,0,0,115, + 4,0,0,0,0,1,20,1,122,24,70,105,108,101,76,111, + 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, + 99,101,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,38,0,0,0, + 124,0,160,0,124,1,161,1,115,14,116,1,130,1,116,2, + 116,3,124,0,106,4,131,1,100,1,25,0,124,1,131,2, + 125,2,124,2,83,0,169,2,78,114,72,0,0,0,41,5, + 218,11,105,115,95,114,101,115,111,117,114,99,101,218,17,70, + 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, + 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, + 255,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, + 116,104,226,3,0,0,115,8,0,0,0,0,1,10,1,4, + 1,20,1,122,24,70,105,108,101,76,111,97,100,101,114,46, + 114,101,115,111,117,114,99,101,95,112,97,116,104,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,40,0,0,0,116,0,124,1,118, + 0,114,12,100,1,83,0,116,1,116,2,124,0,106,3,131, + 1,100,2,25,0,124,1,131,2,125,2,116,4,124,2,131, + 1,83,0,41,3,78,70,114,72,0,0,0,41,5,114,34, + 0,0,0,114,37,0,0,0,114,46,0,0,0,114,43,0, + 0,0,114,53,0,0,0,169,3,114,118,0,0,0,114,116, + 0,0,0,114,43,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,2,1,0,0,232,3,0,0, + 115,8,0,0,0,0,1,8,1,4,1,20,1,122,22,70, + 105,108,101,76,111,97,100,101,114,46,105,115,95,114,101,115, + 111,117,114,99,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,24, + 0,0,0,116,0,116,1,160,2,116,3,124,0,106,4,131, + 1,100,1,25,0,161,1,131,1,83,0,114,1,1,0,0, + 41,5,218,4,105,116,101,114,114,2,0,0,0,218,7,108, + 105,115,116,100,105,114,114,46,0,0,0,114,43,0,0,0, + 114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,99,111,110,116,101,110,116,115,238,3, + 0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,76, + 111,97,100,101,114,46,99,111,110,116,101,110,116,115,41,17, 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,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,9,1,0,0,241,3,0,0, - 115,8,0,0,0,8,2,4,2,8,5,8,5,114,9,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,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,43,0,0,0,114,25, - 0,0,0,114,151,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,34,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,3,0,0,0,114,219,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,229,0,0,0,50,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,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,15,1,0,0,30,4,0,0, - 115,6,0,0,0,8,2,4,2,8,16,114,15,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,114,5,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, - 0,67,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,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,243,0,0,0,71,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,247,0,0,0,75,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,43,0, - 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,212,0,0,0,78,4,0,0,115,18,0,0,0, - 0,2,4,1,4,0,2,255,4,2,6,1,4,0,4,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,43,0, - 0,0,114,253,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,217,0,0,0,86,4,0,0,115, - 10,0,0,0,0,2,14,1,6,1,4,0,4,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,38,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,3,0,0,0, - 169,2,114,31,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,3,0,0, - 0,114,6,0,0,0,218,9,60,103,101,110,101,120,112,114, - 62,95,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,120,112,114, - 62,41,4,114,46,0,0,0,114,43,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,3,0,0,0, - 114,18,1,0,0,114,6,0,0,0,114,182,0,0,0,92, - 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, + 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,114,0,1,0, + 0,114,4,1,0,0,114,2,1,0,0,114,8,1,0,0, + 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, + 3,0,0,0,114,3,0,0,0,114,249,0,0,0,114,6, + 0,0,0,114,239,0,0,0,170,3,0,0,115,30,0,0, + 0,8,2,4,3,8,6,8,4,8,3,2,1,14,11,2, + 1,10,4,8,11,2,1,10,5,8,4,8,6,8,6,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,48,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,43,0,0,0,114, + 238,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,224,0,0,0,246,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,25,0,0,0,114,51,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,226,0,0,0,251, + 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,59, + 0,0,0,114,11,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,252,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,104,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,113,60,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,52,4,0,116,8,144,0, + 121,246,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, + 46,0,0,0,114,55,0,0,0,114,186,0,0,0,114,41, + 0,0,0,114,37,0,0,0,114,2,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,49,0,0,0,114,134,0,0,0,114, + 149,0,0,0,114,68,0,0,0,41,9,114,118,0,0,0, + 114,43,0,0,0,114,25,0,0,0,114,12,1,0,0,218, + 6,112,97,114,101,110,116,114,96,0,0,0,114,36,0,0, + 0,114,32,0,0,0,114,228,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,225,0,0,0,0, + 4,0,0,115,48,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,2,0,2,255,4,2,28,1,2,1,12,1, + 16,1,16,2,8,1,2,255,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,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,9,1, + 0,0,242,3,0,0,115,8,0,0,0,8,2,4,2,8, + 5,8,5,114,9,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,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, + 43,0,0,0,114,25,0,0,0,114,151,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, + 0,0,35,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,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,3,0,0,0,114,219,0,0,0, + 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,3, + 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,229,0,0,0,51,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,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,15,1, + 0,0,31,4,0,0,115,6,0,0,0,8,2,4,2,8, + 16,114,15,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,114,5, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,209,0,0,0,68,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,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,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,243,0,0,0,72,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,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,247,0,0,0,76,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,43,0,0,0,41,3,114,118,0,0,0,114, + 187,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,212,0,0,0,79,4,0, + 0,115,18,0,0,0,0,2,4,1,4,0,2,255,4,2, + 6,1,4,0,4,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,43,0,0,0,114,253,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, + 0,87,4,0,0,115,10,0,0,0,0,2,14,1,6,1, + 4,0,4,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,38,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,3,0,0,0,169,2,114,31,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,3,0,0,0,114,6,0,0,0,218,9,60,103, + 101,110,101,120,112,114,62,96,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,120,112,114,62,41,4,114,46,0,0,0,114,43, + 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,3,0,0,0,114,18,1,0,0,114,6,0,0,0, + 114,182,0,0,0,93,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,3,0,0, + 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,213,0,0,0,99,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, + 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,229,0,0,0,103,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,47,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,107, + 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,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,252,0,0,0,60,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,43,0,0,0,90,11,112,97,116,104,95,102,105,110,100, + 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,209,0,0,0,120,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,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,70,0,0,0,114,39,0,0,0, + 41,2,114,8,0,0,0,114,43,0,0,0,90,8,95,95, + 112,97,116,104,95,95,41,2,114,23,1,0,0,114,40,0, + 0,0,41,4,114,118,0,0,0,114,14,1,0,0,218,3, + 100,111,116,90,2,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,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,126, + 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,30,1,0,0,114,130, + 0,0,0,114,8,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,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,25,1,0,0, + 136,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,25,1,0,0,114,26,1, + 0,0,114,27,1,0,0,114,23,1,0,0,114,140,0,0, + 0,114,178,0,0,0,114,24,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,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, + 101,140,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,114,6,1,0,0,114,32,1, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,8,95,95,105,116,101,114,95,95, + 153,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,32,1,0,0,41,2,114,118,0,0, + 0,218,5,105,110,100,101,120,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,11,95,95,103,101,116,105,116, + 101,109,95,95,156,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,24, + 1,0,0,41,3,114,118,0,0,0,114,35,1,0,0,114, + 43,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, + 159,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,22,0,0,0,114,32,1, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,7,95,95,108,101,110,95,95,162, + 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,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,61,0,0,0,114,24,1,0, + 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,8,95,95,114,101,112,114,95,95,165, + 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,34,1,0,0,169,2,114,118,0,0,0,218,4, + 105,116,101,109,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, + 95,168,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,24, + 1,0,0,114,186,0,0,0,114,40,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,186,0,0, + 0,171,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, + 30,1,0,0,114,25,1,0,0,114,32,1,0,0,114,33, + 1,0,0,114,36,1,0,0,114,37,1,0,0,114,38,1, + 0,0,114,39,1,0,0,114,42,1,0,0,114,186,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,22,1,0,0,113,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,22,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,22,1,0,0,114,24, + 1,0,0,114,28,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,209,0,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,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,61,0,0,0,114,125,0,0,0,41,2,114,193,0,0, + 0,114,216,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, + 112,114,180,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,189, + 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,39,0,0, + 0,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,192, + 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,39,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,98,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,3,0,0,0,114,219, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,229,0,0,0,102,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,47,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,179,0,0,0,106,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, - 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,252,0,0,0,59,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,43,0,0,0,90, - 11,112,97,116,104,95,102,105,110,100,101,114,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, - 119,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,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,70,0,0,0,114,39,0,0,0,41,2,114,8,0,0, - 0,114,43,0,0,0,90,8,95,95,112,97,116,104,95,95, - 41,2,114,23,1,0,0,114,40,0,0,0,41,4,114,118, - 0,0,0,114,14,1,0,0,218,3,100,111,116,90,2,109, - 101,114,3,0,0,0,114,3,0,0,0,114,6,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,125,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,30,1,0,0,114,130,0,0,0,114,8,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,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,25,1,0,0,135,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,107,9, - 114,68,124,2,106,5,100,0,107,8,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,25,1,0,0,114,26,1,0,0,114,27,1,0, - 0,114,23,1,0,0,114,140,0,0,0,114,178,0,0,0, - 114,24,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, - 114,101,99,97,108,99,117,108,97,116,101,139,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,114,6,1,0,0,114,32,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,95,95,105,116,101,114,95,95,152,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, - 32,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, - 101,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,95,95,103,101,116,105,116,101,109,95,95,155,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,24,1,0,0,41,3,114, - 118,0,0,0,114,35,1,0,0,114,43,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, - 95,115,101,116,105,116,101,109,95,95,158,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,22,0,0,0,114,32,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,7,95,95,108,101,110,95,95,161,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,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,61,0,0,0,114,24,1,0,0,114,246,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 8,95,95,114,101,112,114,95,95,164,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,107,6,83,0,114,109,0,0,0,114,34,1,0, - 0,169,2,114,118,0,0,0,218,4,105,116,101,109,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, - 95,99,111,110,116,97,105,110,115,95,95,167,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,24,1,0,0,114,186,0, - 0,0,114,40,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,186,0,0,0,170,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,30,1,0,0,114,25, - 1,0,0,114,32,1,0,0,114,33,1,0,0,114,36,1, - 0,0,114,37,1,0,0,114,38,1,0,0,114,39,1,0, - 0,114,42,1,0,0,114,186,0,0,0,114,3,0,0,0, + 213,0,0,0,195,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,3,0,0,0,114,211,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,198, + 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,3,0,0,0,114,253,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,217,0,0,0,201, + 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,24,1,0,0,114, + 218,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,220,0,0,0,204,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,0,0,114,124,0,0,0,114,126,0,0,0,114,209, + 0,0,0,114,207,0,0,0,114,44,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,3,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 22,1,0,0,112,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,22,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,22,1,0,0,114,24,1,0,0,114,28,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,209,0,0,0,176,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,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,61,0,0,0,114, - 125,0,0,0,41,2,114,193,0,0,0,114,216,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 11,109,111,100,117,108,101,95,114,101,112,114,179,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,3,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,182,0,0,0,188,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,39,0,0,0,114,3,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,229,0,0,0,191,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,39,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,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,213,0,0,0,194,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,3,0,0,0, - 114,211,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,212,0,0,0,197,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,3,0,0,0, - 114,253,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,217,0,0,0,200,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,24,1,0,0,114,218,0,0,0,114,219, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,220,0,0,0,203,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,0,0,114,124, - 0,0,0,114,126,0,0,0,114,209,0,0,0,114,207,0, - 0,0,114,44,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,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,43,1,0,0,175,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,43,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,107,8,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,8,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,46,1,0,0,41,3,114,193,0,0,0,114,116,0, - 0,0,218,6,102,105,110,100,101,114,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,46,1,0,0,221,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,84,0,0,0,116,0,106, - 1,100,1,107,9,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, - 44,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, - 0,83,0,4,0,116,5,107,10,114,76,1,0,1,0,1, - 0,89,0,113,34,89,0,113,34,48,0,113,34,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, - 8,0,0,0,218,10,112,97,116,104,95,104,111,111,107,115, - 114,74,0,0,0,114,75,0,0,0,114,138,0,0,0,114, - 117,0,0,0,41,3,114,193,0,0,0,114,43,0,0,0, - 90,4,104,111,111,107,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,112,97,116,104,95,104,111,111, - 107,115,231,4,0,0,115,16,0,0,0,0,3,16,1,12, - 1,10,1,2,1,14,1,14,1,12,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,104,0,0, - 0,124,1,100,1,107,2,114,44,122,12,116,0,160,1,161, - 0,125,1,87,0,110,22,4,0,116,2,107,10,114,42,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,40,4,0,116, - 5,107,10,114,98,1,0,1,0,1,0,124,0,160,6,124, + 43,1,0,0,176,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, + 43,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,8,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,46,1,0,0,41,3,114,193, + 0,0,0,114,116,0,0,0,218,6,102,105,110,100,101,114, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 46,1,0,0,222,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,82, + 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,42,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,113, + 34,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,8,0,0,0,218,10,112,97,116,104,95,104, + 111,111,107,115,114,74,0,0,0,114,75,0,0,0,114,138, + 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, + 43,0,0,0,90,4,104,111,111,107,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,95,112,97,116,104, + 95,104,111,111,107,115,232,4,0,0,115,16,0,0,0,0, + 3,16,1,12,1,10,1,2,1,14,1,12,1,12,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, @@ -2137,16 +2134,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 3,114,193,0,0,0,114,43,0,0,0,114,50,1,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,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,244,4,0,0,115,22,0,0,0,0,8, - 8,1,2,1,12,1,14,3,8,1,2,1,14,1,14,1, + 99,97,99,104,101,245,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,107, - 9,114,60,116,3,160,4,124,1,124,3,161,2,83,0,116, + 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, @@ -2155,7 +2152,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 1,0,0,114,140,0,0,0,114,141,0,0,0,114,187,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, 0,218,16,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,10,5,0,0,115,18,0,0,0,0,4,10,1, + 112,101,99,11,5,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, @@ -2163,12 +2160,12 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,107,9,114,8,116,4,124,6,100,2,131,2, + 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, - 107,8,114,92,113,8,124,7,106,7,100,1,107,9,114,110, + 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,107,8,114,132,116,9,100,3,131,1,130,1,124,4, + 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, @@ -2186,16 +2183,16 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,97,99,101,95,112,97,116,104,90,5,101,110,116,114,121, 114,50,1,0,0,114,187,0,0,0,114,141,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 95,103,101,116,95,115,112,101,99,25,5,0,0,115,40,0, + 95,103,101,116,95,115,112,101,99,26,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,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,100,0,0,0,124,2, - 100,1,107,8,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,107,8, - 114,40,100,1,83,0,124,4,106,3,100,1,107,8,114,92, + 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,92, 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,110,4,124,4,83,0,100,1, @@ -2213,14 +2210,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 181,0,0,0,114,22,1,0,0,41,6,114,193,0,0,0, 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,114, 187,0,0,0,114,57,1,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,203,0,0,0,57,5,0, + 0,0,0,114,6,0,0,0,114,203,0,0,0,58,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,6,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,107,8,114,24,100,1,83,0,124,3,106,1, + 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, @@ -2233,7 +2230,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,81, + 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,82, 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, @@ -2265,7 +2262,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,59,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,60,1,0,0,94,5,0,0,115,4,0, + 6,0,0,0,114,60,1,0,0,95,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, @@ -2274,7 +2271,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, 1,0,0,114,203,0,0,0,114,206,0,0,0,114,60,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,217,4,0,0,115, + 0,114,6,0,0,0,114,45,1,0,0,218,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,45,1,0,0,99,0,0,0,0, @@ -2319,7 +2316,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,109,0,0,0,114,3,0,0,0,114,16,1, 0,0,169,1,114,140,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,19,1,0,0,123,5,0,0,115,4,0,0, + 0,0,0,114,19,1,0,0,124,5,0,0,115,4,0,0, 0,4,0,2,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,70,0, @@ -2332,7 +2329,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,189,0,0,0,114,3,0,0, 0,114,62,1,0,0,114,6,0,0,0,114,209,0,0,0, - 117,5,0,0,115,16,0,0,0,0,4,4,1,12,1,26, + 118,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, @@ -2341,13 +2338,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,64,1,0,0,114,246,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,131, + 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,132, 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,107,8,114,26,100,1,103,0,102,2,83,0, + 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, @@ -2365,7 +2362,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,3,0,0, 0,114,3,0,0,0,114,6,0,0,0,114,137,0,0,0, - 137,5,0,0,115,8,0,0,0,0,7,10,1,8,1,8, + 138,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, @@ -2375,363 +2372,362 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 41,7,114,118,0,0,0,114,188,0,0,0,114,139,0,0, 0,114,43,0,0,0,90,4,115,109,115,108,114,202,0,0, 0,114,140,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,58,1,0,0,149,5,0,0,115,8, + 114,6,0,0,0,114,58,1,0,0,150,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,98,1,0,0, + 0,0,0,8,0,0,0,67,0,0,0,115,96,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,24,4,0,116,6, - 107,10,114,66,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,92,124,0, - 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, - 114,114,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, - 107,6,114,218,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,150,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,150,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,82,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, - 107,6,114,224,116,15,124,12,131,1,114,224,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,113,224,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,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,70,0,0,0,114,27,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,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, - 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, - 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, - 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, - 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, - 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,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,17,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 203,0,0,0,154,5,0,0,115,74,0,0,0,0,5,4, - 1,14,1,2,1,24,1,14,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,26,4,8,2,14,1,16,1,16, - 1,12,1,8,1,10,1,2,0,2,255,10,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,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,30,4,0,116,4,116,5,116, - 6,102,3,107,10,114,58,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,84,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, - 136,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,94,124,3,124,0,95,11,116,7,106,8,160,9,116, - 16,161,1,114,186,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,70,0,0,0,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,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,3,0,0,0,41,1,114,105,0,0,0,41,2, - 114,31,0,0,0,90,2,102,110,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,9,60,115,101,116,99,111, - 109,112,62,231,5,0,0,115,4,0,0,0,6,0,2,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,43, - 0,0,0,114,2,0,0,0,114,7,1,0,0,114,54,0, - 0,0,114,3,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,8,0,0, - 0,114,9,0,0,0,114,10,0,0,0,114,65,1,0,0, - 114,66,1,0,0,114,100,0,0,0,114,61,0,0,0,114, - 105,0,0,0,218,3,97,100,100,114,11,0,0,0,114,67, - 1,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, - 8,1,0,0,90,21,108,111,119,101,114,95,115,117,102,102, - 105,120,95,99,111,110,116,101,110,116,115,114,41,1,0,0, - 114,116,0,0,0,114,29,1,0,0,114,17,1,0,0,90, - 8,110,101,119,95,110,97,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,69,1,0,0,202,5,0, - 0,115,34,0,0,0,0,2,6,1,2,1,22,1,20,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,34,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,102,1,136,1,158,2,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,47,0,0, - 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, - 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, - 0,0,0,114,6,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,243,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,3,0,0,0,41,3, - 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, - 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, - 112,97,116,104,95,104,111,111,107,233,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,61,0, - 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, - 251,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,46, - 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, - 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, - 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,61,1,0,0,108,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,61,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,146,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,20,4,0,116,5,107,10,114,140,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,62,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,15,1, - 0,0,114,9,1,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, + 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,216,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,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,113,148, + 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,82, + 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,222,116,15,124,12,131,1,114,222,124,0,160,16,124,10, + 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, + 113,222,124,3,144,1,114,92,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,70,0,0,0,114,27,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,40, + 0,0,0,114,48,0,0,0,114,43,0,0,0,114,2,0, + 0,0,114,54,0,0,0,114,10,1,0,0,114,49,0,0, + 0,114,64,1,0,0,218,11,95,102,105,108,108,95,99,97, + 99,104,101,114,7,0,0,0,114,67,1,0,0,114,105,0, + 0,0,114,66,1,0,0,114,37,0,0,0,114,63,1,0, + 0,114,53,0,0,0,114,58,1,0,0,114,55,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,17,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,203,0, + 0,0,155,5,0,0,115,74,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,26,4,8,2,14,1,16,1,16,1,12, + 1,8,1,10,1,2,0,2,255,10,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,70,0,0,0,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,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,3, + 0,0,0,41,1,114,105,0,0,0,41,2,114,31,0,0, + 0,90,2,102,110,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,9,60,115,101,116,99,111,109,112,62,232, + 5,0,0,115,4,0,0,0,6,0,2,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,43,0,0,0,114, + 2,0,0,0,114,7,1,0,0,114,54,0,0,0,114,3, + 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,8,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,65,1,0,0,114,66,1,0, + 0,114,100,0,0,0,114,61,0,0,0,114,105,0,0,0, + 218,3,97,100,100,114,11,0,0,0,114,67,1,0,0,41, + 9,114,118,0,0,0,114,43,0,0,0,114,8,1,0,0, + 90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,99, + 111,110,116,101,110,116,115,114,41,1,0,0,114,116,0,0, + 0,114,29,1,0,0,114,17,1,0,0,90,8,110,101,119, + 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,69,1,0,0,203,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,34,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,102,1,136, + 1,158,2,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,47,0,0,0,41,2,114, + 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, + 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, + 6,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,244,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,3,0,0,0,41,3,114,193,0,0, + 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, + 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,234,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,61,0,0,0,114,43, + 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,39,1,0,0,252,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,46,1,0,0,114, + 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, + 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, + 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, - 1,6,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,14,2,114,81,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,9,1,0,0,114,101,0,0, - 0,114,15,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,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,24, - 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,12,0,0,0,9,0,0,0,67,0,0,0,115,178, - 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,68, - 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, - 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, - 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, - 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, - 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, - 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, - 0,131,1,131,1,115,136,74,0,130,1,124,6,100,8,25, - 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, - 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, - 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, - 0,113,106,4,0,116,8,107,10,114,214,1,0,1,0,1, - 0,89,0,113,106,89,0,113,106,48,0,113,106,116,8,100, - 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, - 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, - 1,100,12,100,13,160,9,124,6,161,1,131,3,1,0,116, - 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, - 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, - 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, - 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, - 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, - 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, - 0,116,6,124,1,100,21,116,10,131,0,131,3,1,0,116, - 11,160,12,116,2,160,13,161,0,161,1,1,0,124,5,100, - 4,107,2,144,1,114,174,116,14,160,15,100,22,161,1,1, - 0,100,23,116,11,107,6,144,1,114,174,100,24,116,16,95, - 17,100,25,83,0,41,26,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,41,4,114,63,0,0,0,114,74,0, - 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, - 0,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,38,0,0, - 0,78,41,1,114,22,0,0,0,41,2,114,31,0,0,0, - 114,94,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,19,1,0,0,60,6,0,0,115,4,0, - 0,0,4,0,2,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,72,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,2,0,0,0,114,34,0,0,0, - 114,30,0,0,0,114,39,0,0,0,114,57,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,73,0,0,0,114,3,0,0,0,41, - 2,114,31,0,0,0,218,1,115,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,70,1,0,0,76,6,0, - 0,115,4,0,0,0,6,0,2,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,90,7,95,116,104,114,101,97,100,90,8, - 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, - 114,192,0,0,0,114,7,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,8,0,0,0,114,163,0,0,0,114,31,1,0,0, - 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, - 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, - 97,108,108,114,117,0,0,0,114,35,0,0,0,114,13,0, - 0,0,114,21,1,0,0,114,167,0,0,0,114,82,1,0, - 0,114,101,0,0,0,114,186,0,0,0,114,191,0,0,0, - 114,195,0,0,0,41,12,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,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,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,30,0, - 0,0,114,34,0,0,0,90,9,111,115,95,109,111,100,117, - 108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108, - 101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108, - 101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 6,95,115,101,116,117,112,35,6,0,0,115,78,0,0,0, - 0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2, - 10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1, - 6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1, - 12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1, - 10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,89, - 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,89,1,0,0,114,184,0,0,0,114,8,0, - 0,0,114,51,1,0,0,114,167,0,0,0,114,61,1,0, - 0,114,76,1,0,0,218,9,109,101,116,97,95,112,97,116, - 104,114,186,0,0,0,114,45,1,0,0,41,2,114,88,1, - 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, - 97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,95,105,110,115,116,97,108,108,100,6, - 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, - 91,1,0,0,41,1,114,59,0,0,0,41,1,78,41,3, - 78,78,78,41,2,114,72,0,0,0,114,72,0,0,0,41, - 1,84,41,1,78,41,1,78,41,63,114,127,0,0,0,114, - 12,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,11,0,0,0, - 114,13,0,0,0,114,20,0,0,0,114,26,0,0,0,114, - 28,0,0,0,114,37,0,0,0,114,46,0,0,0,114,48, - 0,0,0,114,52,0,0,0,114,53,0,0,0,114,55,0, - 0,0,114,58,0,0,0,114,68,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,18,0,0,0,114,148,0,0,0,114,17,0,0,0, - 114,23,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,9,1,0,0,114,15,1,0,0,114,21,1,0,0,114, - 252,0,0,0,114,22,1,0,0,114,43,1,0,0,114,45, - 1,0,0,114,61,1,0,0,114,81,1,0,0,114,184,0, - 0,0,114,89,1,0,0,114,91,1,0,0,114,3,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,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,16,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,72,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, - 65, + 114,61,1,0,0,109,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,61,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,62,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,15,1,0,0,114,9,1,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,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,2,6,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,81,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,9,1,0,0,114,101,0,0,0,114,15,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,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,184,0,0,0,25,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,12,0,0,0, + 9,0,0,0,67,0,0,0,115,176,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,68,0,93,48,125,2,124, + 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, + 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, + 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, + 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, + 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, + 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, + 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, + 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, + 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, + 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, + 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, + 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, + 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, + 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, + 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, + 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, + 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, + 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, + 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, + 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, + 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, + 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, + 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, + 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, + 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,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,41,4, + 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, + 116,105,110,115,114,160,0,0,0,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,38,0,0,0,78,41,1,114,22,0,0, + 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, + 0,61,6,0,0,115,4,0,0,0,4,0,2,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,72,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,2, + 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, + 0,0,114,57,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,73,0, + 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, + 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,70,1,0,0,77,6,0,0,115,4,0,0,0,6,0, + 2,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,90,7,95, + 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, + 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,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,8,0,0,0,114,163, + 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, + 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, + 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, + 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, + 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, + 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,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, + 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,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,30,0,0,0,114,34,0,0,0,90, + 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, + 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, + 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, + 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,36, + 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, + 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, + 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, + 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, + 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, + 10,1,10,1,10,1,114,89,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,89,1,0,0, + 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, + 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, + 110,115,116,97,108,108,101,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, + 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,12,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,11,0,0,0,114,13,0,0,0,114,20,0, + 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, + 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, + 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, + 68,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,18,0,0,0,114,148, + 0,0,0,114,17,0,0,0,114,23,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,9,1,0,0,114,15,1, + 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, + 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, + 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,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,17,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,72,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,65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index a05a7a3b945..199c4106280 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -117,863 +117,860 @@ const unsigned char _Py_M__zipimport[] = { 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,36,1,0,0,116, + 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,72,4, - 0,116,10,116,11,102,2,107,10,114,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,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,182,116,4,100,4,124,1,100,3,141,2,130, - 1,113,182,113,64,122,12,116,15,124,1,25,0,125,7,87, - 0,110,36,4,0,116,16,107,10,114,230,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, - 32,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,18,3,14,1,8,1,12,1,4, - 1,16,3,14,2,12,1,4,2,2,1,12,1,14,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,107,9, - 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,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,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,118, - 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,32,4,0,116, - 7,107,10,114,104,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,14,1,18,1,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,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,128,0,0,0,116,0,124,0,124,1,131, - 2,125,2,124,2,100,1,107,8,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,22,4,0,116,6,107,10,114,110,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,14,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, + 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,40,0,0,0,116,0,124,0,124,1,131,2,125, - 2,124,2,100,1,107,8,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,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,248,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,107,8,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,36,4,0,116,17,107,10, - 114,228,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,14,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,88,0,0,0,122,20, - 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, - 87,0,110,22,4,0,116,1,107,10,114,42,1,0,1,0, - 1,0,89,0,100,1,83,0,48,0,116,2,106,3,115,78, - 100,2,100,3,108,4,109,5,125,2,1,0,124,2,160,6, - 116,2,161,1,1,0,100,4,116,2,95,3,116,2,124,0, - 124,1,131,2,83,0,41,5,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,14, - 82,101,115,111,117,114,99,101,82,101,97,100,101,114,84,41, - 7,114,65,0,0,0,114,3,0,0,0,218,24,95,90,105, - 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, - 101,97,100,101,114,218,11,95,114,101,103,105,115,116,101,114, - 101,100,90,13,105,109,112,111,114,116,108,105,98,46,97,98, - 99,114,79,0,0,0,90,8,114,101,103,105,115,116,101,114, - 41,3,114,32,0,0,0,114,38,0,0,0,114,79,0,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,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,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,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,20,0,0,0,0,6, - 2,1,10,1,10,1,14,1,8,1,6,1,12,1,10,1, - 6,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,34,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,82,0,0,0,114,83,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,18,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,52,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,107,6, - 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,56,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,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, - 107,6,114,14,124,5,2,0,1,0,83,0,113,14,100,0, - 83,0,114,88,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,65,1,0,0,115,12,0,0, - 0,0,1,10,1,14,1,8,1,10,1,10,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,18,5,0,0, - 122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38, - 4,0,116,2,107,10,114,52,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,178,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,38,4,0,116,2,107,10,114,136,1,0,1,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,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,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, + 86,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,116,2, + 106,3,115,76,100,2,100,3,108,4,109,5,125,2,1,0, + 124,2,160,6,116,2,161,1,1,0,100,4,116,2,95,3, + 116,2,124,0,124,1,131,2,83,0,41,5,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,14,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,84,41,7,114,65,0,0,0,114,3,0,0,0,218, + 24,95,90,105,112,73,109,112,111,114,116,82,101,115,111,117, + 114,99,101,82,101,97,100,101,114,218,11,95,114,101,103,105, + 115,116,101,114,101,100,90,13,105,109,112,111,114,116,108,105, + 98,46,97,98,99,114,79,0,0,0,90,8,114,101,103,105, + 115,116,101,114,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,20,0, + 0,0,0,6,2,1,10,1,10,1,12,1,8,1,6,1, + 12,1,10,1,6,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,34,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,82,0,0,0,114, + 83,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,18,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,52,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,56,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,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,14,124,5,2,0,1,0,83,0, + 113,14,100,0,83,0,114,88,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,65,1,0,0, + 115,12,0,0,0,0,1,10,1,14,1,8,1,10,1,10, + 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,168,116,3,100,4,124,0,155,2,157,2, + 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,178,122,24,124,1,160,4, + 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,38,4,0,116,2,107,10,114,248,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,40,4,0,116,2,107,10,144,1,114,74,1,0, + 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,124,6,160,12, - 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114, - 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,162, - 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,238,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,10,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,54,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,40,4,0, - 116,2,107,10,144,2,114,116,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,150,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,172,144,4,113,224,116,8,124,3, - 131,1,100,15,107,3,144,2,114,194,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,154,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,40,4,0,116,2,107,10,144,3,114,216,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,250,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,42,116,3,100,4,124,0,155,2, - 157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0, - 116,2,107,10,144,4,114,84,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,106, - 124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16, - 100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10, - 144,4,114,158,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,118, - 87,0,100,0,4,0,4,0,131,3,1,0,110,18,49,0, - 144,4,115,246,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,86,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,96,1,0,0,115,212,0,0,0,0,1,2,1,14, - 1,14,1,24,2,8,1,2,1,14,1,8,1,14,1,14, - 1,24,1,12,1,18,1,18,3,2,1,12,1,12,1,14, - 1,10,1,2,255,12,2,8,1,2,255,2,1,2,255,4, - 2,2,1,10,1,12,1,16,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,16,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,16,1,24,1,14,1,18,4,2,1,28, - 1,22,1,16,1,24,2,10,2,10,3,2,1,14,1,16, - 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,112,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, - 64,122,16,100,4,100,5,108,4,109,5,125,0,1,0,87, - 0,110,38,4,0,116,6,107,10,114,82,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,141,0,0,0,218,9,69, - 120,99,101,112,116,105,111,110,114,140,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,254,1,0,0,115,26,0,0,0,0,2,4,3,10, - 1,8,2,4,1,4,1,16,1,14,1,10,1,16,2,6, - 0,6,2,10,1,114,144,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,150,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,18,125,10,122,14,124,10,160,3, - 124,6,161,1,1,0,87,0,110,38,4,0,116,4,107,10, - 114,102,1,0,1,0,1,0,116,0,100,3,124,0,155,2, + 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,86,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,96,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,141,0,0,0,218, + 9,69,120,99,101,112,116,105,111,110,114,140,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,254,1,0,0,115,26,0,0,0,0,2,4, + 3,10,1,8,2,4,1,4,1,16,1,12,1,10,1,16, + 2,6,0,6,2,10,1,114,144,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,134,116,7,100,6,131,1,130,1,124,11, - 100,0,100,7,133,2,25,0,100,8,107,3,114,168,116,0, + 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,40,4,0,116,4,107,10,144,1,114,18,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,52,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,74, - 48,0,1,0,1,0,1,0,89,0,1,0,124,3,100,1, - 107,2,144,1,114,98,124,15,83,0,122,10,116,9,131,0, - 125,16,87,0,110,30,4,0,116,10,107,10,144,1,114,138, - 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,92,0,0,0,114, - 12,0,0,0,114,104,0,0,0,114,98,0,0,0,114,93, - 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,103,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,139,0,0,0, - 105,241,255,255,255,41,11,114,3,0,0,0,114,110,0,0, - 0,114,111,0,0,0,114,112,0,0,0,114,22,0,0,0, - 114,114,0,0,0,114,51,0,0,0,114,119,0,0,0,114, - 1,0,0,0,114,144,0,0,0,114,143,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,130,0,0,0,114,134,0,0,0,114,125, - 0,0,0,114,137,0,0,0,114,131,0,0,0,114,132,0, - 0,0,114,133,0,0,0,114,123,0,0,0,114,124,0,0, - 0,114,135,0,0,0,114,136,0,0,0,114,127,0,0,0, - 90,8,114,97,119,95,100,97,116,97,114,141,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,52, - 0,0,0,19,2,0,0,115,62,0,0,0,0,1,20,1, - 8,1,8,2,14,2,2,1,14,1,14,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,16,1,24,1,10,1,14,1,40,2,10,2, - 4,3,2,1,10,1,16,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, - 65,2,0,0,115,2,0,0,0,0,2,114,147,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,22,4,0,116,2, - 107,10,114,50,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,114,180,124,8,115,104,116,3,106,4, - 100,6,107,2,114,180,116,5,124,0,124,2,131,2,125,9, - 124,9,100,0,107,9,114,180,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,22,4,0,116,2, - 107,10,114,178,1,0,1,0,1,0,89,0,100,0,83,0, - 48,0,110,84,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,86,0,0,0,90,5,110,101,118,101,114,90, - 6,97,108,119,97,121,115,114,99,0,0,0,114,94,0,0, - 0,114,95,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,147,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,126,0,0,0,90,11, - 101,120,99,95,100,101,116,97,105,108,115,114,129,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,150,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,75,2,0, - 0,115,88,0,0,0,0,2,2,1,2,254,6,5,2,1, - 18,1,14,1,8,2,12,1,4,1,12,1,10,1,2,255, - 2,1,8,255,2,2,10,1,8,1,4,1,4,1,2,254, - 4,5,2,1,4,1,2,0,2,0,2,0,2,255,8,2, - 14,1,10,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,155, - 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,126,2,0,0, - 115,6,0,0,0,0,1,12,1,12,1,114,159,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,159,0,0,0,218,7,99,111,109,112,105,108,101,41, - 2,114,53,0,0,0,114,158,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,133,2,0,0,115, - 4,0,0,0,0,1,8,1,114,161,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,86,0,0,0,114,14,0,0,0,41, - 2,114,131,0,0,0,90,6,109,107,116,105,109,101,41,2, - 218,1,100,114,138,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,139,2,0,0,115,22,0,0,0, - 0,1,4,1,10,1,10,1,6,1,6,1,10,1,10,1, - 2,0,2,0,2,249,114,169,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,116,0,0,0,122,82,124,1,100,1,100, - 0,133,2,25,0,100,2,107,6,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,107,10,114,110,1,0,1,0,1, - 0,89,0,100,6,83,0,48,0,100,0,83,0,41,7,78, - 114,14,0,0,0,169,2,218,1,99,218,1,111,114,163,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, - 169,0,0,0,114,26,0,0,0,218,10,73,110,100,101,120, - 69,114,114,111,114,114,154,0,0,0,41,6,114,32,0,0, - 0,114,13,0,0,0,114,54,0,0,0,114,131,0,0,0, - 114,132,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,151,0,0,0,152,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,20,1,114,151,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,86,0,0,0,124,1,100,1, - 100,0,133,2,25,0,100,2,107,6,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,22,4,0,116,1, - 107,10,114,68,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,100,0, - 83,0,41,3,78,114,14,0,0,0,114,170,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,149,0,0,0,171,2,0,0,115,14, - 0,0,0,0,2,20,1,12,2,2,1,14,1,14,1,8, - 2,114,149,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, - 198,0,0,0,116,0,124,0,124,1,131,2,125,2,116,1, - 68,0,93,160,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,20,4,0,116,7,107,10, - 114,88,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,132,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,107,8,114,152,113,14,124,7,100,4, - 25,0,125,8,124,10,124,5,124,8,102,3,2,0,1,0, - 83,0,113,14,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,86,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,89,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,155,0,0, - 0,114,161,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,90,0,0, - 0,114,91,0,0,0,114,47,0,0,0,114,63,0,0,0, - 114,54,0,0,0,114,40,0,0,0,114,126,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,186,2,0,0,115,36,0,0, - 0,0,1,10,1,14,1,8,1,22,1,2,1,14,1,14, - 1,6,2,8,1,12,1,4,1,18,2,10,1,8,3,2, - 1,8,1,16,2,114,44,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,60,0,0,0,101,0,90,1,100,0,90,2, - 100,1,90,3,100,2,90,4,100,3,100,4,132,0,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,83,0,41,14,114,80,0,0,0,122,165,80,114,105, - 118,97,116,101,32,99,108,97,115,115,32,117,115,101,100,32, - 116,111,32,115,117,112,112,111,114,116,32,90,105,112,73,109, - 112,111,114,116,46,103,101,116,95,114,101,115,111,117,114,99, - 101,95,114,101,97,100,101,114,40,41,46,10,10,32,32,32, - 32,84,104,105,115,32,99,108,97,115,115,32,105,115,32,97, - 108,108,111,119,101,100,32,116,111,32,114,101,102,101,114,101, - 110,99,101,32,97,108,108,32,116,104,101,32,105,110,110,97, - 114,100,115,32,97,110,100,32,112,114,105,118,97,116,101,32, - 112,97,114,116,115,32,111,102,10,32,32,32,32,116,104,101, - 32,122,105,112,105,109,112,111,114,116,101,114,46,10,32,32, - 32,32,70,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,88,0,0,0,41,2,114,4,0,0,0,114,38,0, - 0,0,41,3,114,32,0,0,0,114,4,0,0,0,114,38, + 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,92,0,0,0,114,12,0,0,0, + 114,104,0,0,0,114,98,0,0,0,114,93,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,103,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,139,0,0,0,105,241,255,255, + 255,41,11,114,3,0,0,0,114,110,0,0,0,114,111,0, + 0,0,114,112,0,0,0,114,22,0,0,0,114,114,0,0, + 0,114,51,0,0,0,114,119,0,0,0,114,1,0,0,0, + 114,144,0,0,0,114,143,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,130,0,0,0,114,134,0,0,0,114,125,0,0,0,114, + 137,0,0,0,114,131,0,0,0,114,132,0,0,0,114,133, + 0,0,0,114,123,0,0,0,114,124,0,0,0,114,135,0, + 0,0,114,136,0,0,0,114,127,0,0,0,90,8,114,97, + 119,95,100,97,116,97,114,141,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,10,0,0,0,114,52,0,0,0,19, + 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,65,2,0,0, + 115,2,0,0,0,0,2,114,147,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,56,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,178,124,6,100,4, + 64,0,100,3,107,3,125,8,116,3,106,4,100,5,107,3, + 114,176,124,8,115,102,116,3,106,4,100,6,107,2,114,176, + 116,5,124,0,124,2,131,2,125,9,124,9,100,0,117,1, + 114,176,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,20,4,0,116,2,121,174,1,0,1,0, + 1,0,89,0,100,0,83,0,48,0,110,84,116,9,124,0, + 124,2,131,2,92,2,125,11,125,12,124,11,144,1,114,6, + 116,10,116,11,124,4,100,7,100,8,133,2,25,0,131,1, + 124,11,131,2,114,242,116,11,124,4,100,8,100,9,133,2, + 25,0,131,1,124,12,107,3,144,1,114,6,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,52,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,86,0,0,0, + 90,5,110,101,118,101,114,90,6,97,108,119,97,121,115,114, + 99,0,0,0,114,94,0,0,0,114,95,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,147,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,126,0,0,0,90,11,101,120,99,95,100,101,116,97, + 105,108,115,114,129,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,150,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,75,2,0,0,115,88,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,10,1,2,255,2,1,8,255,2,2,10,1, + 8,1,4,1,4,1,2,254,4,5,2,1,4,1,2,0, + 2,0,2,0,2,255,8,2,12,1,10,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,155,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,126,2,0,0,115,6,0,0,0,0,1,12, + 1,12,1,114,159,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,159,0,0,0,218,7, + 99,111,109,112,105,108,101,41,2,114,53,0,0,0,114,158, 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,114,34,0,0,0,220,2,0,0,115,4,0,0,0, - 0,1,6,1,122,33,95,90,105,112,73,109,112,111,114,116, - 82,101,115,111,117,114,99,101,82,101,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,5,0,0,0,8,0,0,0,67,0,0,0, - 115,92,0,0,0,124,0,106,0,160,1,100,1,100,2,161, - 2,125,2,124,2,155,0,100,2,124,1,155,0,157,3,125, - 3,100,3,100,4,108,2,109,3,125,4,1,0,122,18,124, - 4,124,0,106,4,160,5,124,3,161,1,131,1,87,0,83, - 0,4,0,116,6,107,10,114,86,1,0,1,0,1,0,116, + 0,0,218,15,95,99,111,109,112,105,108,101,95,115,111,117, + 114,99,101,133,2,0,0,115,4,0,0,0,0,1,8,1, + 114,161,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,86,0, + 0,0,114,14,0,0,0,41,2,114,131,0,0,0,90,6, + 109,107,116,105,109,101,41,2,218,1,100,114,138,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,139, + 2,0,0,115,22,0,0,0,0,1,4,1,10,1,10,1, + 6,1,6,1,10,1,10,1,2,0,2,0,2,249,114,169, + 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,114,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,100, + 0,83,0,41,7,78,114,14,0,0,0,169,2,218,1,99, + 218,1,111,114,163,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,169,0,0,0,114,26,0,0,0,218, + 10,73,110,100,101,120,69,114,114,111,114,114,154,0,0,0, + 41,6,114,32,0,0,0,114,13,0,0,0,114,54,0,0, + 0,114,131,0,0,0,114,132,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,151,0, + 0,0,152,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, + 151,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,84,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,100,0,83,0,41,3,78,114,14,0,0,0,114,170, + 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,149,0,0,0,171,2, + 0,0,115,14,0,0,0,0,2,20,1,12,2,2,1,14, + 1,12,1,8,2,114,149,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,196,0,0,0,116,0,124,0,124,1,131,2, + 125,2,116,1,68,0,93,158,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,113,14,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,86, + 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,89,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,155, + 0,0,0,114,161,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,90, + 0,0,0,114,91,0,0,0,114,47,0,0,0,114,63,0, + 0,0,114,54,0,0,0,114,40,0,0,0,114,126,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,186,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,16,2,114,44,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,60,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,90,4,100,3,100,4,132,0, + 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,83,0,41,14,114,80,0,0,0,122,165,80, + 114,105,118,97,116,101,32,99,108,97,115,115,32,117,115,101, + 100,32,116,111,32,115,117,112,112,111,114,116,32,90,105,112, + 73,109,112,111,114,116,46,103,101,116,95,114,101,115,111,117, + 114,99,101,95,114,101,97,100,101,114,40,41,46,10,10,32, + 32,32,32,84,104,105,115,32,99,108,97,115,115,32,105,115, + 32,97,108,108,111,119,101,100,32,116,111,32,114,101,102,101, + 114,101,110,99,101,32,97,108,108,32,116,104,101,32,105,110, + 110,97,114,100,115,32,97,110,100,32,112,114,105,118,97,116, + 101,32,112,97,114,116,115,32,111,102,10,32,32,32,32,116, + 104,101,32,122,105,112,105,109,112,111,114,116,101,114,46,10, + 32,32,32,32,70,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,88,0,0,0,41,2,114,4,0,0,0,114, + 38,0,0,0,41,3,114,32,0,0,0,114,4,0,0,0, + 114,38,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,34,0,0,0,220,2,0,0,115,4,0, + 0,0,0,1,6,1,122,33,95,90,105,112,73,109,112,111, + 114,116,82,101,115,111,117,114,99,101,82,101,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,5,0,0,0,8,0,0,0,67,0, + 0,0,115,90,0,0,0,124,0,106,0,160,1,100,1,100, + 2,161,2,125,2,124,2,155,0,100,2,124,1,155,0,157, + 3,125,3,100,3,100,4,108,2,109,3,125,4,1,0,122, + 18,124,4,124,0,106,4,160,5,124,3,161,1,131,1,87, + 0,83,0,4,0,116,6,121,84,1,0,1,0,1,0,116, 7,124,3,131,1,130,1,89,0,110,2,48,0,100,0,83, 0,41,5,78,114,85,0,0,0,114,109,0,0,0,114,0, 0,0,0,41,1,218,7,66,121,116,101,115,73,79,41,8, @@ -986,7 +983,7 @@ const unsigned char _Py_M__zipimport[] = { 0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0, 0,218,13,111,112,101,110,95,114,101,115,111,117,114,99,101, 224,2,0,0,115,14,0,0,0,0,1,14,1,14,1,12, - 1,2,1,18,1,14,1,122,38,95,90,105,112,73,109,112, + 1,2,1,18,1,12,1,122,38,95,90,105,112,73,109,112, 111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,101, 114,46,111,112,101,110,95,114,101,115,111,117,114,99,101,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, @@ -999,85 +996,85 @@ const unsigned char _Py_M__zipimport[] = { 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, 46,114,101,115,111,117,114,99,101,95,112,97,116,104,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,72,0,0,0,124,0,106,0, + 0,0,0,67,0,0,0,115,70,0,0,0,124,0,106,0, 160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2, 124,1,155,0,157,3,125,3,122,16,124,0,106,2,160,3, - 124,3,161,1,1,0,87,0,110,22,4,0,116,4,107,10, - 114,66,1,0,1,0,1,0,89,0,100,3,83,0,48,0, - 100,4,83,0,41,5,78,114,85,0,0,0,114,109,0,0, - 0,70,84,41,5,114,38,0,0,0,114,19,0,0,0,114, - 4,0,0,0,114,55,0,0,0,114,22,0,0,0,41,4, - 114,32,0,0,0,114,59,0,0,0,114,179,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,105,115,95,114,101,115,111,117,114,99,101, - 239,2,0,0,115,14,0,0,0,0,3,14,1,14,1,2, - 1,16,1,14,1,8,1,122,36,95,90,105,112,73,109,112, - 111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,101, - 114,46,105,115,95,114,101,115,111,117,114,99,101,99,1,0, - 0,0,0,0,0,0,0,0,0,0,9,0,0,0,9,0, - 0,0,99,0,0,0,115,186,0,0,0,100,1,100,2,108, - 0,109,1,125,1,1,0,124,1,124,0,106,2,160,3,124, - 0,106,4,161,1,131,1,125,2,124,2,160,5,124,0,106, - 2,106,6,161,1,125,3,124,3,106,7,100,3,107,2,115, - 58,74,0,130,1,124,3,106,8,125,4,116,9,131,0,125, - 5,124,0,106,2,106,10,68,0,93,102,125,6,122,18,124, - 1,124,6,131,1,160,5,124,4,161,1,125,7,87,0,110, - 24,4,0,116,11,107,10,114,124,1,0,1,0,1,0,89, - 0,113,78,89,0,110,2,48,0,124,7,106,8,106,7,125, - 8,116,12,124,8,131,1,100,1,107,2,114,156,124,7,106, - 7,86,0,1,0,113,78,124,8,124,5,107,7,114,78,124, - 5,160,13,124,8,161,1,1,0,124,8,86,0,1,0,113, - 78,100,0,83,0,41,4,78,114,0,0,0,0,41,1,218, - 4,80,97,116,104,114,60,0,0,0,41,14,90,7,112,97, - 116,104,108,105,98,114,183,0,0,0,114,4,0,0,0,114, - 56,0,0,0,114,38,0,0,0,90,11,114,101,108,97,116, - 105,118,101,95,116,111,114,29,0,0,0,114,59,0,0,0, - 90,6,112,97,114,101,110,116,218,3,115,101,116,114,28,0, - 0,0,114,23,0,0,0,114,51,0,0,0,218,3,97,100, - 100,41,9,114,32,0,0,0,114,183,0,0,0,90,13,102, - 117,108,108,110,97,109,101,95,112,97,116,104,90,13,114,101, - 108,97,116,105,118,101,95,112,97,116,104,90,12,112,97,99, - 107,97,103,101,95,112,97,116,104,90,12,115,117,98,100,105, - 114,115,95,115,101,101,110,218,8,102,105,108,101,110,97,109, - 101,90,8,114,101,108,97,116,105,118,101,90,11,112,97,114, - 101,110,116,95,110,97,109,101,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,218,8,99,111,110,116,101,110,116, - 115,250,2,0,0,115,34,0,0,0,0,8,12,1,18,1, - 14,3,14,1,6,1,6,1,12,1,2,1,18,1,14,1, - 10,5,8,1,12,1,10,1,8,1,10,1,122,33,95,90, - 105,112,73,109,112,111,114,116,82,101,115,111,117,114,99,101, - 82,101,97,100,101,114,46,99,111,110,116,101,110,116,115,78, - 41,10,114,6,0,0,0,114,7,0,0,0,114,8,0,0, - 0,114,84,0,0,0,114,81,0,0,0,114,34,0,0,0, - 114,180,0,0,0,114,181,0,0,0,114,182,0,0,0,114, - 187,0,0,0,114,9,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,10,0,0,0,114,80,0,0,0,212,2,0, - 0,115,14,0,0,0,8,1,4,5,4,2,8,4,8,9, - 8,6,8,11,114,80,0,0,0,41,45,114,84,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,148,0,0,0,114,110,0,0,0,114,152,0, - 0,0,114,67,0,0,0,114,131,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,113,0,0,0,114, - 115,0,0,0,114,117,0,0,0,114,4,0,0,0,114,89, - 0,0,0,114,36,0,0,0,114,37,0,0,0,114,35,0, - 0,0,114,27,0,0,0,114,122,0,0,0,114,142,0,0, - 0,114,144,0,0,0,114,52,0,0,0,114,147,0,0,0, - 114,155,0,0,0,218,8,95,95,99,111,100,101,95,95,114, - 153,0,0,0,114,159,0,0,0,114,161,0,0,0,114,169, - 0,0,0,114,151,0,0,0,114,149,0,0,0,114,44,0, - 0,0,114,80,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,88,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,127,0,1,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,8,26, + 124,3,161,1,1,0,87,0,110,20,4,0,116,4,121,64, + 1,0,1,0,1,0,89,0,100,3,83,0,48,0,100,4, + 83,0,41,5,78,114,85,0,0,0,114,109,0,0,0,70, + 84,41,5,114,38,0,0,0,114,19,0,0,0,114,4,0, + 0,0,114,55,0,0,0,114,22,0,0,0,41,4,114,32, + 0,0,0,114,59,0,0,0,114,179,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,105,115,95,114,101,115,111,117,114,99,101,239,2, + 0,0,115,14,0,0,0,0,3,14,1,14,1,2,1,16, + 1,12,1,8,1,122,36,95,90,105,112,73,109,112,111,114, + 116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46, + 105,115,95,114,101,115,111,117,114,99,101,99,1,0,0,0, + 0,0,0,0,0,0,0,0,9,0,0,0,9,0,0,0, + 99,0,0,0,115,184,0,0,0,100,1,100,2,108,0,109, + 1,125,1,1,0,124,1,124,0,106,2,160,3,124,0,106, + 4,161,1,131,1,125,2,124,2,160,5,124,0,106,2,106, + 6,161,1,125,3,124,3,106,7,100,3,107,2,115,58,74, + 0,130,1,124,3,106,8,125,4,116,9,131,0,125,5,124, + 0,106,2,106,10,68,0,93,100,125,6,122,18,124,1,124, + 6,131,1,160,5,124,4,161,1,125,7,87,0,110,22,4, + 0,116,11,121,122,1,0,1,0,1,0,89,0,113,78,89, + 0,110,2,48,0,124,7,106,8,106,7,125,8,116,12,124, + 8,131,1,100,1,107,2,114,154,124,7,106,7,86,0,1, + 0,113,78,124,8,124,5,118,1,114,78,124,5,160,13,124, + 8,161,1,1,0,124,8,86,0,1,0,113,78,100,0,83, + 0,41,4,78,114,0,0,0,0,41,1,218,4,80,97,116, + 104,114,60,0,0,0,41,14,90,7,112,97,116,104,108,105, + 98,114,183,0,0,0,114,4,0,0,0,114,56,0,0,0, + 114,38,0,0,0,90,11,114,101,108,97,116,105,118,101,95, + 116,111,114,29,0,0,0,114,59,0,0,0,90,6,112,97, + 114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23, + 0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114, + 32,0,0,0,114,183,0,0,0,90,13,102,117,108,108,110, + 97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105, + 118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101, + 95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115, + 101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114, + 101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95, + 110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10, + 0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0, + 0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1, + 6,1,6,1,12,1,2,1,18,1,12,1,10,5,8,1, + 12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109, + 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, + 101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6, + 0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0, + 0,0,114,81,0,0,0,114,34,0,0,0,114,180,0,0, + 0,114,181,0,0,0,114,182,0,0,0,114,187,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114, + 10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0, + 0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11, + 114,80,0,0,0,41,45,114,84,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, + 148,0,0,0,114,110,0,0,0,114,152,0,0,0,114,67, + 0,0,0,114,131,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,113,0,0,0,114,115,0,0,0, + 114,117,0,0,0,114,4,0,0,0,114,89,0,0,0,114, + 36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27, + 0,0,0,114,122,0,0,0,114,142,0,0,0,114,144,0, + 0,0,114,52,0,0,0,114,147,0,0,0,114,155,0,0, + 0,218,8,95,95,99,111,100,101,95,95,114,153,0,0,0, + 114,159,0,0,0,114,161,0,0,0,114,169,0,0,0,114, + 151,0,0,0,114,149,0,0,0,114,44,0,0,0,114,80, + 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,88,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,127,0,1,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, + 8,26, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index e4f4a8c7791..c0a0bf51de3 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -116,11 +116,11 @@ static void *opcode_targets[256] = { &&TARGET_POP_JUMP_IF_FALSE, &&TARGET_POP_JUMP_IF_TRUE, &&TARGET_LOAD_GLOBAL, + &&TARGET_IS_OP, + &&TARGET_CONTAINS_OP, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_JUMP_IF_NOT_EXC_MATCH, &&TARGET_SETUP_FINALLY, &&_unknown_opcode, &&TARGET_LOAD_FAST, diff --git a/Python/peephole.c b/Python/peephole.c index 714a4520ba8..baa217ad02d 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -12,10 +12,10 @@ #define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD) #define CONDITIONAL_JUMP(op) (op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE \ || op==POP_JUMP_IF_FALSE || op==POP_JUMP_IF_TRUE \ - || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP) + || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP || op==JUMP_IF_NOT_EXC_MATCH) #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP) #define GETJUMPTGT(arr, i) (get_arg(arr, i) / sizeof(_Py_CODEUNIT) + \ (ABSOLUTE_JUMP(_Py_OPCODE(arr[i])) ? 0 : i+1)) @@ -194,6 +194,7 @@ markblocks(_Py_CODEUNIT *code, Py_ssize_t len) case JUMP_IF_TRUE_OR_POP: case POP_JUMP_IF_FALSE: case POP_JUMP_IF_TRUE: + case JUMP_IF_NOT_EXC_MATCH: case JUMP_ABSOLUTE: case SETUP_FINALLY: case SETUP_WITH: @@ -493,6 +494,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case POP_JUMP_IF_TRUE: case JUMP_IF_FALSE_OR_POP: case JUMP_IF_TRUE_OR_POP: + case JUMP_IF_NOT_EXC_MATCH: j = blocks[j / sizeof(_Py_CODEUNIT)] * sizeof(_Py_CODEUNIT); break; diff --git a/Tools/scripts/generate_opcode_h.py b/Tools/scripts/generate_opcode_h.py index b184ffa1709..873f82156e2 100644 --- a/Tools/scripts/generate_opcode_h.py +++ b/Tools/scripts/generate_opcode_h.py @@ -22,11 +22,6 @@ footer = """ remaining private.*/ #define EXCEPT_HANDLER 257 - -enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, - PyCmp_GT=Py_GT, PyCmp_GE=Py_GE, PyCmp_IN, PyCmp_NOT_IN, - PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD}; - #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT) #ifdef __cplusplus From 1d1b97ae643dd8b22d87785ed7bd2599c6c8dc8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Ogam?= Date: Tue, 14 Jan 2020 12:58:29 +0100 Subject: [PATCH 127/380] bpo-39048: Look up __aenter__ before __aexit__ in async with (GH-17609) * Reorder the __aenter__ and __aexit__ checks for async with * Add assertions for async with body being skipped * Swap __aexit__ and __aenter__ loading in the documentation --- Doc/reference/compound_stmts.rst | 2 +- Lib/test/test_coroutines.py | 20 ++++++++++--------- Misc/ACKS | 1 + .../2020-01-13-14-45-22.bpo-39048.iPsj81.rst | 4 ++++ Python/ceval.c | 19 +++++++++--------- 5 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 564d6cc4213..e2f44a55b18 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -844,8 +844,8 @@ The following code:: is semantically equivalent to:: manager = (EXPRESSION) - aexit = type(manager).__aexit__ aenter = type(manager).__aenter__ + aexit = type(manager).__aexit__ value = await aenter(manager) hit_except = False diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 208b5c2ccf5..8d1e0692a24 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1203,39 +1203,41 @@ class CoroutineTest(unittest.TestCase): def __aenter__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aexit__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_3(self): class CM: def __aexit__(self): pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_4(self): class CM: - def __enter__(self): - pass - - def __exit__(self): - pass + pass + body_executed = False async def foo(): async with CM(): - pass + body_executed = True - with self.assertRaisesRegex(AttributeError, '__aexit__'): + with self.assertRaisesRegex(AttributeError, '__aenter__'): run_async(foo()) + self.assertFalse(body_executed) def test_with_5(self): # While this test doesn't make a lot of sense, diff --git a/Misc/ACKS b/Misc/ACKS index d3e683d4a08..3e45d5d0f7f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1219,6 +1219,7 @@ Elena Oat Jon Oberheide Milan Oberkirch Pascal Oberndoerfer +Géry Ogam Jeffrey Ollie Adam Olsen Bryan Olson diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst new file mode 100644 index 00000000000..1179ef49651 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst @@ -0,0 +1,4 @@ +Improve the displayed error message when incorrect types are passed to ``async +with`` statements by looking up the :meth:`__aenter__` special method before +the :meth:`__aexit__` special method when entering an asynchronous context +manager. Patch by Géry Ogam. diff --git a/Python/ceval.c b/Python/ceval.c index 096645aeebf..5e586589e96 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3230,20 +3230,21 @@ main_loop: } case TARGET(BEFORE_ASYNC_WITH): { - _Py_IDENTIFIER(__aexit__); _Py_IDENTIFIER(__aenter__); - + _Py_IDENTIFIER(__aexit__); PyObject *mgr = TOP(); - PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__), - *enter; + PyObject *enter = special_lookup(tstate, mgr, &PyId___aenter__); PyObject *res; - if (exit == NULL) + if (enter == NULL) { goto error; + } + PyObject *exit = special_lookup(tstate, mgr, &PyId___aexit__); + if (exit == NULL) { + Py_DECREF(enter); + goto error; + } SET_TOP(exit); - enter = special_lookup(tstate, mgr, &PyId___aenter__); Py_DECREF(mgr); - if (enter == NULL) - goto error; res = _PyObject_CallNoArg(enter); Py_DECREF(enter); if (res == NULL) @@ -3264,8 +3265,8 @@ main_loop: } case TARGET(SETUP_WITH): { - _Py_IDENTIFIER(__exit__); _Py_IDENTIFIER(__enter__); + _Py_IDENTIFIER(__exit__); PyObject *mgr = TOP(); PyObject *enter = special_lookup(tstate, mgr, &PyId___enter__); PyObject *res; From a2ec3f07f7f028ff6229d6be2a7cfbda1f4efaeb Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 14 Jan 2020 12:06:45 +0000 Subject: [PATCH 128/380] bpo-39322: Add gc.is_finalized to check if an object has been finalised by the gc (GH-17989) --- Doc/library/gc.rst | 21 +++++++++++++++++++ Doc/whatsnew/3.9.rst | 4 ++++ Lib/test/test_gc.py | 18 ++++++++++++++++ .../2020-01-13-15-18-13.bpo-39322.aAs-1T.rst | 2 ++ Modules/clinic/gcmodule.c.h | 11 +++++++++- Modules/gcmodule.c | 20 ++++++++++++++++++ 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst index 13eda917b9a..0c33c865304 100644 --- a/Doc/library/gc.rst +++ b/Doc/library/gc.rst @@ -177,6 +177,27 @@ The :mod:`gc` module provides the following functions: .. versionadded:: 3.1 +.. function:: is_finalized(obj) + + Returns ``True`` if the given object has been finalized by the + garbage collector, ``False`` otherwise. :: + + >>> x = None + >>> class Lazarus: + ... def __del__(self): + ... global x + ... x = self + ... + >>> lazarus = Lazarus() + >>> gc.is_finalized(lazarus) + False + >>> del lazarus + >>> gc.is_finalized(x) + True + + .. versionadded:: 3.9 + + .. function:: freeze() Freeze all the objects tracked by gc - move them to a permanent generation diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 00409af4387..c9499999920 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -174,6 +174,10 @@ When the garbage collector makes a collection in which some objects resurrect been executed), do not block the collection of all objects that are still unreachable. (Contributed by Pablo Galindo and Tim Peters in :issue:`38379`.) +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. (Contributed by Pablo Galindo in +:issue:`39322`.) + imaplib ------- diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index c0d4a7507ae..18f8d10c5ba 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -586,6 +586,24 @@ class GCTests(unittest.TestCase): self.assertFalse(gc.is_tracked(UserFloatSlots())) self.assertFalse(gc.is_tracked(UserIntSlots())) + def test_is_finalized(self): + # Objects not tracked by the always gc return false + self.assertFalse(gc.is_finalized(3)) + + storage = [] + class Lazarus: + def __del__(self): + storage.append(self) + + lazarus = Lazarus() + self.assertFalse(gc.is_finalized(lazarus)) + + del lazarus + gc.collect() + + lazarus = storage.pop() + self.assertTrue(gc.is_finalized(lazarus)) + def test_bug1055820b(self): # Corresponds to temp2b.py in the bug report. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst new file mode 100644 index 00000000000..60df44cc672 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst @@ -0,0 +1,2 @@ +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. Patch by Pablo Galindo. diff --git a/Modules/clinic/gcmodule.c.h b/Modules/clinic/gcmodule.c.h index 22d2aa4a87b..72795c66bf7 100644 --- a/Modules/clinic/gcmodule.c.h +++ b/Modules/clinic/gcmodule.c.h @@ -304,6 +304,15 @@ PyDoc_STRVAR(gc_is_tracked__doc__, #define GC_IS_TRACKED_METHODDEF \ {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__}, +PyDoc_STRVAR(gc_is_finalized__doc__, +"is_finalized($module, obj, /)\n" +"--\n" +"\n" +"Returns true if the object has been already finalized by the GC."); + +#define GC_IS_FINALIZED_METHODDEF \ + {"is_finalized", (PyCFunction)gc_is_finalized, METH_O, gc_is_finalized__doc__}, + PyDoc_STRVAR(gc_freeze__doc__, "freeze($module, /)\n" "--\n" @@ -373,4 +382,4 @@ gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored)) exit: return return_value; } -/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=bd6a8056989e2e69 input=a9049054013a1b77]*/ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 5fef114d73e..4ad9d228f5a 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1869,6 +1869,25 @@ gc_is_tracked(PyObject *module, PyObject *obj) return result; } +/*[clinic input] +gc.is_finalized + + obj: object + / + +Returns true if the object has been already finalized by the GC. +[clinic start generated code]*/ + +static PyObject * +gc_is_finalized(PyObject *module, PyObject *obj) +/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/ +{ + if (PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) { + Py_RETURN_TRUE; + } + Py_RETURN_FALSE; +} + /*[clinic input] gc.freeze @@ -1961,6 +1980,7 @@ static PyMethodDef GcMethods[] = { GC_GET_OBJECTS_METHODDEF GC_GET_STATS_METHODDEF GC_IS_TRACKED_METHODDEF + GC_IS_FINALIZED_METHODDEF {"get_referrers", gc_get_referrers, METH_VARARGS, gc_get_referrers__doc__}, {"get_referents", gc_get_referents, METH_VARARGS, From b6791375b2ff86ea07f068fb53d9575c337eaa5b Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 14 Jan 2020 17:38:15 +0000 Subject: [PATCH 129/380] bpo-39322: Add gc.is_finalized to the gc module docstring (GH-18000) --- Modules/gcmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 4ad9d228f5a..aacdb3f45a1 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1961,6 +1961,7 @@ PyDoc_STRVAR(gc__doc__, "get_threshold() -- Return the current the collection thresholds.\n" "get_objects() -- Return a list of all objects tracked by the collector.\n" "is_tracked() -- Returns true if a given object is tracked.\n" +"is_finalized() -- Returns true if a given object has been already finalized.\n" "get_referrers() -- Return the list of objects that refer to an object.\n" "get_referents() -- Return the list of objects that an object refers to.\n" "freeze() -- Freeze all tracked objects and ignore them for future collections.\n" From f04750bb7af45cb6efab8d92d1ff063f0bf2833d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Barto=C5=A1?= Date: Tue, 14 Jan 2020 18:57:04 +0100 Subject: [PATCH 130/380] bpo-38361: syslog: fixed making default "ident" from sys.argv[0] (GH-16557) The default value of "ident" parameter should be sys.argv[0] with leading path components stripped, but it contained the last slash, i.e. '/program' instead of 'program'. BPO issue: https://bugs.python.org/issue38361 https://bugs.python.org/issue38361 --- .../next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst | 1 + Modules/syslogmodule.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst diff --git a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst new file mode 100644 index 00000000000..65186db60b4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst @@ -0,0 +1 @@ +Fixed an issue where ``ident`` could include a leading path separator when :func:`syslog.openlog` was called without arguments. \ No newline at end of file diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index b2ea73baa1b..539224f2c5b 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -99,7 +99,7 @@ syslog_get_argv(void) if (slash == -2) return NULL; if (slash != -1) { - return PyUnicode_Substring(scriptobj, slash, scriptlen); + return PyUnicode_Substring(scriptobj, slash + 1, scriptlen); } else { Py_INCREF(scriptobj); return(scriptobj); From b4cdb3f60e71888d7f3d4e0d40cb31e968ea160c Mon Sep 17 00:00:00 2001 From: Kyle Pollina Date: Tue, 14 Jan 2020 13:47:26 -0600 Subject: [PATCH 131/380] Fix documentation in code.py (GH-17988) --- Doc/library/code.rst | 2 +- Lib/code.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/code.rst b/Doc/library/code.rst index e2c47bab5a0..6708079f778 100644 --- a/Doc/library/code.rst +++ b/Doc/library/code.rst @@ -76,7 +76,7 @@ Interactive Interpreter Objects Compile and run some source in the interpreter. Arguments are the same as for :func:`compile_command`; the default for *filename* is ``''``, and for - *symbol* is ``'single'``. One several things can happen: + *symbol* is ``'single'``. One of several things can happen: * The input is incorrect; :func:`compile_command` raised an exception (:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be diff --git a/Lib/code.py b/Lib/code.py index d8106ae612c..76000f8c8b2 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -40,7 +40,7 @@ class InteractiveInterpreter: Arguments are as for compile_command(). - One several things can happen: + One of several things can happen: 1) The input is incorrect; compile_command() raised an exception (SyntaxError or OverflowError). A syntax traceback From 4b0d91aab4cfba30a2a9728e9eaea15dbc0ba9bd Mon Sep 17 00:00:00 2001 From: Dima <43349662+d-goldin@users.noreply.github.com> Date: Tue, 14 Jan 2020 21:47:59 +0100 Subject: [PATCH 132/380] venv: Suppress warning message when bash hashing is disabled. (GH-17966) When using python's built-in venv activaton script warnings are printed when hashing is disabled in bash or zsh, like; `bash: hash: hashing disabled` This output is not really useful to the end-user and has been disabled in `virtualenv` for long. This commit is based on: https://github.com/pypa/virtualenv/commit/28e85bcd80d04b2a7ebce0e1d0b02d432b7e5593 --- Lib/venv/scripts/common/activate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/venv/scripts/common/activate b/Lib/venv/scripts/common/activate index b1b4625fddd..45af3536aa1 100644 --- a/Lib/venv/scripts/common/activate +++ b/Lib/venv/scripts/common/activate @@ -18,7 +18,7 @@ deactivate () { # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then @@ -62,5 +62,5 @@ fi # be called to get it to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r + hash -r 2> /dev/null fi From 7d6378051feeadf45b4ce45b4b406b65df255648 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Tue, 14 Jan 2020 20:49:30 +0000 Subject: [PATCH 133/380] bpo-38901: Allow setting a venv's prompt to the basename of the current directory. (GH-17946) When a prompt value of '.' is specified, os.path.basename(os.getcwd()) is used to configure the prompt for the created venv. --- Doc/library/venv.rst | 3 ++- Lib/test/test_venv.py | 9 +++++++++ Lib/venv/__init__.py | 2 ++ .../Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst | 3 +++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 5494c0c878b..d778486b0a5 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -122,7 +122,8 @@ creation according to their needs, the :class:`EnvBuilder` class. * ``prompt`` -- a String to be used after virtual environment is activated (defaults to ``None`` which means directory name of the environment would - be used). + be used). If the special string ``"."`` is provided, the basename of the + current directory is used as the prompt. * ``upgrade_deps`` -- Update the base venv modules to the latest on PyPI diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 741ac109bbc..a3b78c4e44e 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -138,6 +138,15 @@ class BasicTest(BaseTest): self.assertEqual(context.prompt, '(My prompt) ') self.assertIn("prompt = 'My prompt'\n", data) + rmtree(self.env_dir) + builder = venv.EnvBuilder(prompt='.') + cwd = os.path.basename(os.getcwd()) + self.run_with_capture(builder.create, self.env_dir) + context = builder.ensure_directories(self.env_dir) + data = self.get_text_file_contents('pyvenv.cfg') + self.assertEqual(context.prompt, '(%s) ' % cwd) + self.assertIn("prompt = '%s'\n" % cwd, data) + def test_upgrade_dependencies(self): builder = venv.EnvBuilder() bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 81cb1d13e21..a220ef784c1 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -51,6 +51,8 @@ class EnvBuilder: self.symlinks = symlinks self.upgrade = upgrade self.with_pip = with_pip + if prompt == '.': # see bpo-38901 + prompt = os.path.basename(os.getcwd()) self.prompt = prompt self.upgrade_deps = upgrade_deps diff --git a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst new file mode 100644 index 00000000000..304d53289e0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst @@ -0,0 +1,3 @@ +When you specify prompt='.' or equivalently python -m venv --prompt . ... +the basename of the current directory is used to set the created venv's +prompt when it's activated. From 65a5ce247f177c4c52cfd104d9df0c2f3b1c91f0 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 15 Jan 2020 06:42:09 +0900 Subject: [PATCH 134/380] bpo-39329: Add timeout parameter for smtplib.LMTP constructor (GH-17998) --- Doc/library/smtplib.rst | 6 +- Doc/whatsnew/3.9.rst | 3 + Lib/smtplib.py | 8 +- Lib/test/test_smtplib.py | 75 +++++++++++-------- .../2020-01-14-22-16-07.bpo-39329.6OKGBn.rst | 2 + 5 files changed, 61 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index f6ac123823b..a88e358eae5 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -115,7 +115,8 @@ 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, source_address=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 standard SMTP client. It's common to use Unix sockets for LMTP, so our @@ -128,6 +129,9 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). Unix socket, LMTP generally don't support or require any authentication, but your mileage might vary. + .. versionchanged:: 3.9 + The optional *timeout* parameter was added. + A nice selection of exceptions is defined as well: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index c9499999920..451902ab1db 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -270,6 +270,9 @@ smtplib if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +(Contributed by Dong-hee Na in :issue:`39329`.) + signal ------ diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 4d5cdb5ac0a..7808ba01cba 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -1066,19 +1066,23 @@ class LMTP(SMTP): ehlo_msg = "lhlo" def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): + source_address=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): """Initialize a new instance.""" super().__init__(host, port, local_hostname=local_hostname, - source_address=source_address) + source_address=source_address, timeout=timeout) def connect(self, host='localhost', port=0, source_address=None): """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" if host[0] != '/': return super().connect(host, port, source_address=source_address) + if self.timeout is not None and not self.timeout: + raise ValueError('Non-blocking socket (timeout=0) is not supported') + # Handle Unix-domain sockets. try: self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.settimeout(self.timeout) self.file = None self.sock.connect(host) except OSError: diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index cc5c4b13464..067c01c10c1 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -56,7 +56,7 @@ def server(evt, buf, serv): serv.close() evt.set() -class GeneralTests(unittest.TestCase): +class GeneralTests: def setUp(self): smtplib.socket = mock_socket @@ -75,29 +75,29 @@ class GeneralTests(unittest.TestCase): def testBasic1(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port) - smtp.close() + client = self.client(HOST, self.port) + client.close() def testSourceAddress(self): mock_socket.reply_with(b"220 Hola mundo") # connects - smtp = smtplib.SMTP(HOST, self.port, - source_address=('127.0.0.1',19876)) - self.assertEqual(smtp.source_address, ('127.0.0.1', 19876)) - smtp.close() + client = self.client(HOST, self.port, + source_address=('127.0.0.1',19876)) + self.assertEqual(client.source_address, ('127.0.0.1', 19876)) + client.close() def testBasic2(self): mock_socket.reply_with(b"220 Hola mundo") # connects, include port in host name - smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) - smtp.close() + client = self.client("%s:%s" % (HOST, self.port)) + client.close() def testLocalHostName(self): mock_socket.reply_with(b"220 Hola mundo") # check that supplied local_hostname is used - smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") - self.assertEqual(smtp.local_hostname, "testhost") - smtp.close() + client = self.client(HOST, self.port, local_hostname="testhost") + self.assertEqual(client.local_hostname, "testhost") + client.close() def testTimeoutDefault(self): mock_socket.reply_with(b"220 Hola mundo") @@ -105,56 +105,71 @@ class GeneralTests(unittest.TestCase): mock_socket.setdefaulttimeout(30) self.assertEqual(mock_socket.getdefaulttimeout(), 30) try: - smtp = smtplib.SMTP(HOST, self.port) + client = self.client(HOST, self.port) finally: mock_socket.setdefaulttimeout(None) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def testTimeoutNone(self): mock_socket.reply_with(b"220 Hola mundo") self.assertIsNone(socket.getdefaulttimeout()) socket.setdefaulttimeout(30) try: - smtp = smtplib.SMTP(HOST, self.port, timeout=None) + client = self.client(HOST, self.port, timeout=None) finally: socket.setdefaulttimeout(None) - self.assertIsNone(smtp.sock.gettimeout()) - smtp.close() + self.assertIsNone(client.sock.gettimeout()) + client.close() def testTimeoutZero(self): mock_socket.reply_with(b"220 Hola mundo") with self.assertRaises(ValueError): - smtplib.SMTP(HOST, self.port, timeout=0) + self.client(HOST, self.port, timeout=0) def testTimeoutValue(self): mock_socket.reply_with(b"220 Hola mundo") - smtp = smtplib.SMTP(HOST, self.port, timeout=30) - self.assertEqual(smtp.sock.gettimeout(), 30) - smtp.close() + client = self.client(HOST, self.port, timeout=30) + self.assertEqual(client.sock.gettimeout(), 30) + client.close() def test_debuglevel(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(1) + client = self.client() + client.set_debuglevel(1) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^connect:", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) def test_debuglevel_2(self): mock_socket.reply_with(b"220 Hello world") - smtp = smtplib.SMTP() - smtp.set_debuglevel(2) + client = self.client() + client.set_debuglevel(2) with support.captured_stderr() as stderr: - smtp.connect(HOST, self.port) - smtp.close() + client.connect(HOST, self.port) + client.close() expected = re.compile(r"^\d{2}:\d{2}:\d{2}\.\d{6} connect: ", re.MULTILINE) self.assertRegex(stderr.getvalue(), expected) +class SMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.SMTP + + +class LMTPGeneralTests(GeneralTests, unittest.TestCase): + + client = smtplib.LMTP + + def testTimeoutZero(self): + super().testTimeoutZero() + local_host = '/some/local/lmtp/delivery/program' + with self.assertRaises(ValueError): + self.client(local_host, timeout=0) + # Test server thread using the specified SMTP server class def debugging_server(serv, serv_evt, client_evt): serv_evt.set() diff --git a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst new file mode 100644 index 00000000000..1e3da4618b4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst @@ -0,0 +1,2 @@ +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +Patch by Dong-hee Na. From 45cf5db587d77606e12f4fdc98c7b87964a2f2be Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 14 Jan 2020 22:32:55 +0000 Subject: [PATCH 135/380] Allow pgen to produce a DOT format dump of the grammar (GH-18005) Originally suggested by Anthony Shaw. --- Parser/pgen/__main__.py | 12 +++++++++++- Parser/pgen/automata.py | 29 +++++++++++++++++++++++++++++ Parser/pgen/pgen.py | 7 ++++++- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Parser/pgen/__main__.py b/Parser/pgen/__main__.py index bb96e75beea..d3780a7b77d 100644 --- a/Parser/pgen/__main__.py +++ b/Parser/pgen/__main__.py @@ -21,9 +21,19 @@ def main(): ) parser.add_argument("--verbose", "-v", action="count") + parser.add_argument( + "--graph", + type=argparse.FileType("w"), + action="store", + metavar="GRAPH_OUTPUT_FILE", + help="Dumps a DOT representation of the generated automata in a file", + ) + args = parser.parse_args() - p = ParserGenerator(args.grammar, args.tokens, verbose=args.verbose) + p = ParserGenerator( + args.grammar, args.tokens, verbose=args.verbose, graph_file=args.graph + ) grammar = p.make_grammar() grammar.produce_graminit_h(args.graminit_h.write) grammar.produce_graminit_c(args.graminit_c.write) diff --git a/Parser/pgen/automata.py b/Parser/pgen/automata.py index 545a7370f7e..d04ca7c6e80 100644 --- a/Parser/pgen/automata.py +++ b/Parser/pgen/automata.py @@ -48,6 +48,26 @@ class NFA: else: writer(" %s -> %d" % (label, j)) + def dump_graph(self, writer): + """Dump a DOT representation of the NFA""" + writer('digraph %s_nfa {\n' % self.name) + todo = [self.start] + for i, state in enumerate(todo): + writer(' %d [label="State %d %s"];\n' % (i, i, state is self.end and "(final)" or "")) + for arc in state.arcs: + label = arc.label + next = arc.target + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + writer(" %d -> %d [style=dotted label=ε];\n" % (i, j)) + else: + writer(" %d -> %d [label=%s];\n" % (i, j, label.replace("'", '"'))) + writer('}\n') + class NFAArc: """An arc representing a transition between two NFA states. @@ -301,6 +321,15 @@ class DFA: for label, next in sorted(state.arcs.items()): writer(" %s -> %d" % (label, self.states.index(next))) + def dump_graph(self, writer): + """Dump a DOT representation of the DFA""" + writer('digraph %s_dfa {\n' % self.name) + for i, state in enumerate(self.states): + writer(' %d [label="State %d %s"];\n' % (i, i, state.is_final and "(final)" or "")) + for label, next in sorted(state.arcs.items()): + writer(" %d -> %d [label=%s];\n" % (i, self.states.index(next), label.replace("'", '"'))) + writer('}\n') + class DFAState(object): """A state of a DFA diff --git a/Parser/pgen/pgen.py b/Parser/pgen/pgen.py index 2f444eb8c86..03032d4ed8c 100644 --- a/Parser/pgen/pgen.py +++ b/Parser/pgen/pgen.py @@ -130,7 +130,7 @@ class Label(str): class ParserGenerator(object): - def __init__(self, grammar_file, token_file, verbose=False): + def __init__(self, grammar_file, token_file, verbose=False, graph_file=None): with open(grammar_file) as f: self.grammar = f.read() with open(token_file) as tok_file: @@ -141,6 +141,7 @@ class ParserGenerator(object): self.opmap["<>"] = "NOTEQUAL" self.verbose = verbose self.filename = grammar_file + self.graph_file = graph_file self.dfas, self.startsymbol = self.create_dfas() self.first = {} # map from symbol name to set of tokens self.calculate_first_sets() @@ -152,11 +153,15 @@ class ParserGenerator(object): if self.verbose: print("Dump of NFA for", nfa.name) nfa.dump() + if self.graph_file is not None: + nfa.dump_graph(self.graph_file.write) dfa = DFA.from_nfa(nfa) if self.verbose: print("Dump of DFA for", dfa.name) dfa.dump() dfa.simplify() + if self.graph_file is not None: + dfa.dump_graph(self.graph_file.write) rule_to_dfas[dfa.name] = dfa if start_nonterminal is None: From 54f743eb315f00b0ff45e115dde7a5d506034153 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Wed, 15 Jan 2020 15:19:49 +0530 Subject: [PATCH 136/380] Improve test coverage for AsyncMock. (GH-17906) * Add test for nested async decorator patch. * Add test for side_effect and wraps with a function. * Add test for side_effect with an exception in the iterable. --- Lib/unittest/test/testmock/testasync.py | 53 +++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 149fd4deff1..73d31a29668 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -72,9 +72,17 @@ class AsyncPatchDecoratorTest(unittest.TestCase): test_async() def test_async_def_patch(self): - @patch(f"{__name__}.async_func", AsyncMock()) - async def test_async(): + @patch(f"{__name__}.async_func", return_value=1) + @patch(f"{__name__}.async_func_args", return_value=2) + async def test_async(func_args_mock, func_mock): + self.assertEqual(func_args_mock._mock_name, "async_func_args") + self.assertEqual(func_mock._mock_name, "async_func") + self.assertIsInstance(async_func, AsyncMock) + self.assertIsInstance(async_func_args, AsyncMock) + + self.assertEqual(await async_func(), 1) + self.assertEqual(await async_func_args(1, 2, c=3), 2) asyncio.run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -375,22 +383,40 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): with self.assertRaises(Exception): await mock(5) - async def test_add_side_effect_function(self): + async def test_add_side_effect_coroutine(self): async def addition(var): return var + 1 mock = AsyncMock(side_effect=addition) result = await mock(5) self.assertEqual(result, 6) + async def test_add_side_effect_normal_function(self): + def addition(var): + return var + 1 + mock = AsyncMock(side_effect=addition) + result = await mock(5) + self.assertEqual(result, 6) + async def test_add_side_effect_iterable(self): vals = [1, 2, 3] mock = AsyncMock(side_effect=vals) for item in vals: - self.assertEqual(item, await mock()) + self.assertEqual(await mock(), item) with self.assertRaises(StopAsyncIteration) as e: await mock() + async def test_add_side_effect_exception_iterable(self): + class SampleException(Exception): + pass + + vals = [1, SampleException("foo")] + mock = AsyncMock(side_effect=vals) + self.assertEqual(await mock(), 1) + + with self.assertRaises(SampleException) as e: + await mock() + async def test_return_value_AsyncMock(self): value = AsyncMock(return_value=10) mock = AsyncMock(return_value=value) @@ -437,6 +463,21 @@ class AsyncArguments(unittest.IsolatedAsyncioTestCase): mock.assert_awaited() self.assertTrue(ran) + async def test_wraps_normal_function(self): + value = 1 + + ran = False + def inner(): + nonlocal ran + ran = True + return value + + mock = AsyncMock(wraps=inner) + result = await mock() + self.assertEqual(result, value) + mock.assert_awaited() + self.assertTrue(ran) + class AsyncMagicMethods(unittest.TestCase): def test_async_magic_methods_return_async_mocks(self): m_mock = MagicMock() @@ -860,6 +901,10 @@ class AsyncMockAssert(unittest.TestCase): self.mock.assert_awaited_once() def test_assert_awaited_with(self): + msg = 'Not awaited' + with self.assertRaisesRegex(AssertionError, msg): + self.mock.assert_awaited_with('foo') + asyncio.run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): From cf288b53e418d8e93626e3d87c9926067d3b3147 Mon Sep 17 00:00:00 2001 From: Elena Oat Date: Wed, 15 Jan 2020 01:50:57 -0800 Subject: [PATCH 137/380] Fix AsyncMock base class in the docs (GH-18008) --- Doc/library/unittest.mock.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index e92f5545d3e..8394304cfdd 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -854,7 +854,7 @@ object:: .. class:: AsyncMock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, unsafe=False, **kwargs) - An asynchronous version of :class:`Mock`. The :class:`AsyncMock` object will + An asynchronous version of :class:`MagicMock`. The :class:`AsyncMock` object will behave so the object is recognized as an async function, and the result of a call is an awaitable. From 3f12ac18a407983a23d43ae785e805e773571477 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 15 Jan 2020 11:23:25 +0100 Subject: [PATCH 138/380] bpo-39164: Fix compiler warning in PyErr_GetExcInfo() (GH-18010) The function has no return value. --- Python/errors.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/errors.c b/Python/errors.c index cdb44605056..18ea9c5652a 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -451,7 +451,7 @@ void PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) { PyThreadState *tstate = _PyThreadState_GET(); - return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); + _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback); } void From ed154c387efc5f978ec97900ec9e0ec6631d5498 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Thu, 16 Jan 2020 00:32:51 +0800 Subject: [PATCH 139/380] bpo-1635741: Port _json extension module to multiphase initialization (PEP 489) (GH-17835) --- ...2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst | 1 + Modules/_json.c | 53 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst new file mode 100644 index 00000000000..9b856c9e1ba --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst @@ -0,0 +1 @@ +Port _json extension module to multiphase initialization (:pep:`489`). diff --git a/Modules/_json.c b/Modules/_json.c index 439414fd59e..3e4fe795a05 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1863,13 +1863,40 @@ static PyMethodDef speedups_methods[] = { PyDoc_STRVAR(module_doc, "json speedups\n"); +static int +_json_exec(PyObject *module) +{ + if (PyType_Ready(&PyScannerType) < 0) { + return -1; + } + if (PyType_Ready(&PyEncoderType) < 0) { + return -1; + } + Py_INCREF((PyObject*)&PyScannerType); + if (PyModule_AddObject(module, "make_scanner", (PyObject*)&PyScannerType) < 0) { + Py_DECREF((PyObject*)&PyScannerType); + return -1; + } + Py_INCREF((PyObject*)&PyEncoderType); + if (PyModule_AddObject(module, "make_encoder", (PyObject*)&PyEncoderType) < 0) { + Py_DECREF((PyObject*)&PyEncoderType); + return -1; + } + return 0; +} + +static PyModuleDef_Slot _json_slots[] = { + {Py_mod_exec, _json_exec}, + {0, NULL} +}; + static struct PyModuleDef jsonmodule = { PyModuleDef_HEAD_INIT, "_json", module_doc, - -1, + 0, speedups_methods, - NULL, + _json_slots, NULL, NULL, NULL @@ -1878,25 +1905,5 @@ static struct PyModuleDef jsonmodule = { PyMODINIT_FUNC PyInit__json(void) { - PyObject *m = PyModule_Create(&jsonmodule); - if (!m) - return NULL; - if (PyType_Ready(&PyScannerType) < 0) - goto fail; - if (PyType_Ready(&PyEncoderType) < 0) - goto fail; - Py_INCREF((PyObject*)&PyScannerType); - if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) { - Py_DECREF((PyObject*)&PyScannerType); - goto fail; - } - Py_INCREF((PyObject*)&PyEncoderType); - if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) { - Py_DECREF((PyObject*)&PyEncoderType); - goto fail; - } - return m; - fail: - Py_DECREF(m); - return NULL; + return PyModuleDef_Init(&jsonmodule); } From e85a305503bf83c5a8ffb3a988dfe7b67461cbee Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 15 Jan 2020 17:38:55 +0100 Subject: [PATCH 140/380] bpo-38630: Fix subprocess.Popen.send_signal() race condition (GH-16984) On Unix, subprocess.Popen.send_signal() now polls the process status. Polling reduces the risk of sending a signal to the wrong process if the process completed, the Popen.returncode attribute is still None, and the pid has been reassigned (recycled) to a new different process. --- Doc/library/subprocess.rst | 2 ++ Lib/subprocess.py | 28 +++++++++++++++++-- Lib/test/test_subprocess.py | 25 +++++++++++++++++ .../2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst | 5 ++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index f2e5463d755..74857480360 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -774,6 +774,8 @@ Instances of the :class:`Popen` class have the following methods: Sends the signal *signal* to the child. + Do nothing if the process completed. + .. note:: On Windows, SIGTERM is an alias for :meth:`terminate`. CTRL_C_EVENT and diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 30f0d1be154..79dffd349a3 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -2061,9 +2061,31 @@ class Popen(object): def send_signal(self, sig): """Send a signal to the process.""" - # Skip signalling a process that we know has already died. - if self.returncode is None: - os.kill(self.pid, sig) + # bpo-38630: Polling reduces the risk of sending a signal to the + # wrong process if the process completed, the Popen.returncode + # attribute is still None, and the pid has been reassigned + # (recycled) to a new different process. This race condition can + # happens in two cases. + # + # Case 1. Thread A calls Popen.poll(), thread B calls + # Popen.send_signal(). In thread A, waitpid() succeed and returns + # the exit status. Thread B calls kill() because poll() in thread A + # did not set returncode yet. Calling poll() in thread B prevents + # the race condition thanks to Popen._waitpid_lock. + # + # Case 2. waitpid(pid, 0) has been called directly, without + # using Popen methods: returncode is still None is this case. + # Calling Popen.poll() will set returncode to a default value, + # since waitpid() fails with ProcessLookupError. + self.poll() + if self.returncode is not None: + # Skip signalling a process that we know has already died. + return + + # 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) def terminate(self): """Terminate the process with SIGTERM diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 2073fd14617..f1fb93455dd 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3120,6 +3120,31 @@ class POSIXProcessTestCase(BaseTestCase): self.assertEqual(returncode, -3) + def test_send_signal_race(self): + # bpo-38630: send_signal() must poll the process exit status to reduce + # the risk of sending the signal to the wrong process. + proc = subprocess.Popen(ZERO_RETURN_CMD) + + # wait until the process completes without using the Popen APIs. + pid, status = os.waitpid(proc.pid, 0) + self.assertEqual(pid, proc.pid) + self.assertTrue(os.WIFEXITED(status), status) + self.assertEqual(os.WEXITSTATUS(status), 0) + + # returncode is still None but the process completed. + self.assertIsNone(proc.returncode) + + with mock.patch("os.kill") as mock_kill: + proc.send_signal(signal.SIGTERM) + + # send_signal() didn't call os.kill() since the process already + # completed. + mock_kill.assert_not_called() + + # Don't check the returncode value: the test reads the exit status, + # so Popen failed to read it and uses a default returncode instead. + self.assertIsNotNone(proc.returncode) + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst new file mode 100644 index 00000000000..1a4d59205ab --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst @@ -0,0 +1,5 @@ +On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. +Polling reduces the risk of sending a signal to the wrong process if the +process completed, the :attr:`subprocess.Popen.returncode` attribute is still +``None``, and the pid has been reassigned (recycled) to a new different +process. From e92d39303feb1d3b4194c6a8275b1fc63b2153b2 Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Wed, 15 Jan 2020 11:48:40 -0500 Subject: [PATCH 141/380] Fix compiler warning on Windows (GH-18012) Python-ast.h contains a macro named Yield that conflicts with the Yield macro in Windows system headers. While Python-ast.h has an "undef Yield" directive to prevent this, it means that Python-ast.h must be included before Windows header files or we run into a re-declaration warning. In commit c96be811fa7d an include for pycore_pystate.h was added which indirectly includes Windows header files. In this commit we re-order the includes to fix this warning. --- Python/compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/compile.c b/Python/compile.c index 3138a3f50dd..1d16e69a085 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -23,8 +23,8 @@ #include "Python.h" -#include "Python-ast.h" #include "pycore_pystate.h" /* _PyInterpreterState_GET_UNSAFE() */ +#include "Python-ast.h" #include "ast.h" #include "code.h" #include "symtable.h" From dc0284ee8f7a270b6005467f26d8e5773d76e959 Mon Sep 17 00:00:00 2001 From: Antoine <43954001+awecx@users.noreply.github.com> Date: Wed, 15 Jan 2020 21:12:42 +0100 Subject: [PATCH 142/380] Fix typo in multiprocessing.pool.AsyncResult.successful doc. (GH-17932) Since 3.7 `successful` raises a `ValueError` as explained in the next text block from the documentation: _Changed in version 3.7: If the result is not ready, ValueError is raised instead of AssertionError._ No issue associated with this PR. Should be backported in 3.7 and 3.8. --- 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 3c7b5cc1262..492f94c3001 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2279,7 +2279,7 @@ with the :class:`Pool` class. .. method:: successful() Return whether the call completed without raising an exception. Will - raise :exc:`AssertionError` if the result is not ready. + raise :exc:`ValueError` if the result is not ready. .. versionchanged:: 3.7 If the result is not ready, :exc:`ValueError` is raised instead of From 01602ae40321ecdb375ee6d44eaeac3255857879 Mon Sep 17 00:00:00 2001 From: Daniel Olshansky Date: Wed, 15 Jan 2020 17:51:54 -0500 Subject: [PATCH 143/380] bpo-37958: Adding get_profile_dict to pstats (GH-15495) pstats is really useful or profiling and printing the output of the execution of some block of code, but I've found on multiple occasions when I'd like to access this output directly in an easily usable dictionary on which I can further analyze or manipulate. The proposal is to add a function called get_profile_dict inside of pstats that'll automatically return this data the data in an easily accessible dict. The output of the following script: ``` import cProfile, pstats import pprint from pstats import func_std_string, f8 def fib(n): if n == 0: return 0 if n == 1: return 1 return fib(n-1) + fib(n-2) pr = cProfile.Profile() pr.enable() fib(5) pr.create_stats() ps = pstats.Stats(pr).sort_stats('tottime', 'cumtime') def get_profile_dict(self, keys_filter=None): """ Returns a dict where the key is a function name and the value is a dict with the following keys: - ncalls - tottime - percall_tottime - cumtime - percall_cumtime - file_name - line_number keys_filter can be optionally set to limit the key-value pairs in the retrieved dict. """ pstats_dict = {} func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) if not func_list: return pstats_dict pstats_dict["total_tt"] = float(f8(self.total_tt)) for func in func_list: cc, nc, tt, ct, callers = self.stats[func] file, line, func_name = func ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) tottime = float(f8(tt)) percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) cumtime = float(f8(ct)) percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) func_dict = { "ncalls": ncalls, "tottime": tottime, # time spent in this function alone "percall_tottime": percall_tottime, "cumtime": cumtime, # time spent in the function plus all functions that this function called, "percall_cumtime": percall_cumtime, "file_name": file, "line_number": line } func_dict_filtered = func_dict if not keys_filter else { key: func_dict[key] for key in keys_filter } pstats_dict[func_name] = func_dict_filtered return pstats_dict pp = pprint.PrettyPrinter(depth=6) pp.pprint(get_profile_dict(ps)) ``` will produce: ``` {"": {'cumtime': 0.0, 'file_name': '~', 'line_number': 0, 'ncalls': '1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'create_stats': {'cumtime': 0.0, 'file_name': '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/cProfile.py', 'line_number': 50, 'ncalls': '1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'fib': {'cumtime': 0.0, 'file_name': 'get_profile_dict.py', 'line_number': 5, 'ncalls': '15/1', 'percall_cumtime': 0.0, 'percall_tottime': 0.0, 'tottime': 0.0}, 'total_tt': 0.0} ``` As an example, this can be used to generate a stacked column chart using various visualization tools which will assist in easily identifying program bottlenecks. https://bugs.python.org/issue37958 Automerge-Triggered-By: @gpshead --- Doc/library/profile.rst | 11 ++++ Lib/pstats.py | 57 ++++++++++++++++++- Lib/test/test_pstats.py | 24 +++++++- .../2019-08-27-03-57-25.bpo-37958.lRORI3.rst | 2 + 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 8d589d247b7..34525a96f55 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -525,6 +525,17 @@ 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() + + This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + 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. + .. _deterministic-profiling: What Is Deterministic Profiling? diff --git a/Lib/pstats.py b/Lib/pstats.py index 4b419a8ecdb..e781b91c605 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -25,11 +25,13 @@ import os import time import marshal import re + from enum import Enum from functools import cmp_to_key +from dataclasses import dataclass +from typing import Dict -__all__ = ["Stats", "SortKey"] - +__all__ = ["Stats", "SortKey", "FunctionProfile", "StatsProfile"] class SortKey(str, Enum): CALLS = 'calls', 'ncalls' @@ -52,6 +54,22 @@ class SortKey(str, Enum): return obj +@dataclass(unsafe_hash=True) +class FunctionProfile: + ncalls: int + tottime: float + percall_tottime: float + cumtime: float + percall_cumtime: float + file_name: str + line_number: int + +@dataclass(unsafe_hash=True) +class StatsProfile: + '''Class for keeping track of an item in inventory.''' + total_tt: float + func_profiles: Dict[str, FunctionProfile] + class Stats: """This class is used for creating reports from data generated by the Profile class. It is a "friend" of that class, and imports data either @@ -333,6 +351,41 @@ class Stats: return new_list, msg + def get_stats_profile(self): + """This method returns an instance of StatsProfile, which contains a mapping + of function names to instances of FunctionProfile. Each FunctionProfile + 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... + """ + func_list = self.fcn_list[:] if self.fcn_list else list(self.stats.keys()) + if not func_list: + return StatsProfile(0, {}) + + total_tt = float(f8(self.total_tt)) + func_profiles = {} + stats_profile = StatsProfile(total_tt, func_profiles) + + for func in func_list: + cc, nc, tt, ct, callers = self.stats[func] + file_name, line_number, func_name = func + ncalls = str(nc) if nc == cc else (str(nc) + '/' + str(cc)) + tottime = float(f8(tt)) + percall_tottime = -1 if nc == 0 else float(f8(tt/nc)) + cumtime = float(f8(ct)) + percall_cumtime = -1 if cc == 0 else float(f8(ct/cc)) + func_profile = FunctionProfile( + ncalls, + tottime, # time spent in this function alone + percall_tottime, + cumtime, # time spent in the function plus all functions that this function called, + percall_cumtime, + file_name, + line_number + ) + func_profiles[func_name] = func_profile + + return stats_profile + def get_print_list(self, sel_list): width = self.max_name_len if self.fcn_list: diff --git a/Lib/test/test_pstats.py b/Lib/test/test_pstats.py index f835ce309a6..f3a6e586c3b 100644 --- a/Lib/test/test_pstats.py +++ b/Lib/test/test_pstats.py @@ -1,10 +1,12 @@ import unittest + from test import support from io import StringIO -import pstats from pstats import SortKey - +import pstats +import time +import cProfile class AddCallersTestCase(unittest.TestCase): """Tests for pstats.add_callers helper.""" @@ -75,6 +77,24 @@ class StatsTestCase(unittest.TestCase): SortKey.TIME, 'calls') + def test_get_stats_profile(self): + def pass1(): pass + def pass2(): pass + def pass3(): pass + + pr = cProfile.Profile() + pr.enable() + pass1() + pass2() + pass3() + pr.create_stats() + ps = pstats.Stats(pr) + + stats_profile = ps.get_stats_profile() + funcs_called = set(stats_profile.func_profiles.keys()) + self.assertIn('pass1', funcs_called) + self.assertIn('pass2', funcs_called) + self.assertIn('pass3', funcs_called) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst new file mode 100644 index 00000000000..d0b4d6adca4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst @@ -0,0 +1,2 @@ +Added the pstats.Stats.get_profile_dict() method to return the profile +data as a StatsProfile instance. From fad8b5674c66d9e00bb788e30adddb0c256c787b Mon Sep 17 00:00:00 2001 From: Oz N Tiram Date: Thu, 16 Jan 2020 00:55:13 +0100 Subject: [PATCH 144/380] bpo-39348: Fix code highlight for the SOCK_NONBLOCK example (GH-18018) The previous double colon was wrongly place directly after Therefore. Which produced a block without syntax highlighting. This fixes it by separating the double colon from the text. As a result, sphinx now properly highlights the python code. https://bugs.python.org/issue39348 --- Doc/library/socket.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 2d7ca33f292..2cc946c519d 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -565,7 +565,9 @@ The following functions all create :ref:`socket objects `. When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC` bit flags are applied to *type* they are cleared, and :attr:`socket.type` will not reflect them. They are still passed - to the underlying system `socket()` call. Therefore:: + to the underlying system `socket()` call. Therefore, + + :: sock = socket.socket( socket.AF_INET, From 210c19e3c5b86535a73487fa737752de8eb1d866 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Jan 2020 10:24:16 +0100 Subject: [PATCH 145/380] bpo-39351: Remove base64.encodestring() (GH-18022) Remove base64.encodestring() and base64.decodestring(), aliases deprecated since Python 3.1: use base64.encodebytes() and base64.decodebytes() instead. --- Doc/library/base64.rst | 12 ------------ Doc/whatsnew/3.9.rst | 5 +++++ Lib/base64.py | 16 ---------------- Lib/test/test_base64.py | 8 -------- .../2020-01-16-09-27-28.bpo-39351.a-FQdv.rst | 3 +++ 5 files changed, 8 insertions(+), 36 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index ad9f5f58bee..1ff22a00d61 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -235,12 +235,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: decodestring(s) - - Deprecated alias of :func:`decodebytes`. - - .. deprecated:: 3.1 - .. function:: encode(input, output) @@ -261,12 +255,6 @@ The legacy interface: .. versionadded:: 3.1 -.. function:: encodestring(s) - - Deprecated alias of :func:`encodebytes`. - - .. deprecated:: 3.1 - An example usage of the module: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 451902ab1db..47e8a37e56c 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -411,6 +411,11 @@ Removed of :pep:`442`. Patch by Joannah Nanjekye. (Contributed by Joannah Nanjekye in :issue:`15088`) +* ``base64.encodestring()`` and ``base64.decodestring()``, aliases deprecated + since Python 3.1, have been removed: use :func:`base64.encodebytes` and + :func:`base64.decodebytes` instead. + (Contributed by Victor Stinner in :issue:`39351`.) + Porting to Python 3.9 ===================== diff --git a/Lib/base64.py b/Lib/base64.py index 2e70223dfe7..a28109f8a7f 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -531,28 +531,12 @@ def encodebytes(s): pieces.append(binascii.b2a_base64(chunk)) return b"".join(pieces) -def encodestring(s): - """Legacy alias of encodebytes().""" - import warnings - warnings.warn("encodestring() is a deprecated alias since 3.1, " - "use encodebytes()", - DeprecationWarning, 2) - return encodebytes(s) - def decodebytes(s): """Decode a bytestring of base-64 data into a bytes object.""" _input_type_check(s) return binascii.a2b_base64(s) -def decodestring(s): - """Legacy alias of decodebytes().""" - import warnings - warnings.warn("decodestring() is a deprecated alias since Python 3.1, " - "use decodebytes()", - DeprecationWarning, 2) - return decodebytes(s) - # Usable as a script... def main(): diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 7dba6635d4e..1dbeac41dc0 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,14 +18,6 @@ class LegacyBase64TestCase(unittest.TestCase): int_data = memoryview(b"1234").cast('I') self.assertRaises(TypeError, f, int_data) - def test_encodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.encodestring(b"www.python.org") - - def test_decodestring_warns(self): - with self.assertWarns(DeprecationWarning): - base64.decodestring(b"d3d3LnB5dGhvbi5vcmc=\n") - def test_encodebytes(self): eq = self.assertEqual eq(base64.encodebytes(b"www.python.org"), b"d3d3LnB5dGhvbi5vcmc=\n") diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst new file mode 100644 index 00000000000..b89bec97bfa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst @@ -0,0 +1,3 @@ +Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases +deprecated since Python 3.1: use :func:`base64.encodebytes` and +:func:`base64.decodebytes` instead. From 4691a2f2a2b8174a6c958ce6976ed5f3354c9504 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Jan 2020 11:02:51 +0100 Subject: [PATCH 146/380] bpo-39350: Remove deprecated fractions.gcd() (GH-18021) Remove fractions.gcd() function, deprecated since Python 3.5 (bpo-22486): use math.gcd() instead. --- Doc/library/fractions.rst | 12 --------- Doc/whatsnew/3.9.rst | 4 +++ Lib/fractions.py | 24 +---------------- Lib/test/test_fractions.py | 27 ++----------------- .../2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst | 2 ++ 5 files changed, 9 insertions(+), 60 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 58e7126b0bf..d3a42762e3f 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -172,18 +172,6 @@ another rational number, or from a string. method can also be accessed through the :func:`round` function. -.. function:: gcd(a, b) - - Return the greatest common divisor of the integers *a* and *b*. If either - *a* or *b* is nonzero, then the absolute value of ``gcd(a, b)`` is the - largest integer that divides both *a* and *b*. ``gcd(a,b)`` has the same - sign as *b* if *b* is nonzero; otherwise it takes the sign of *a*. ``gcd(0, - 0)`` returns ``0``. - - .. deprecated:: 3.5 - Use :func:`math.gcd` instead. - - .. seealso:: Module :mod:`numbers` diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 47e8a37e56c..8ca755645d6 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -416,6 +416,10 @@ Removed :func:`base64.decodebytes` instead. (Contributed by Victor Stinner in :issue:`39351`.) +* ``fractions.gcd()`` function has been removed, it was deprecated since Python + 3.5 (:issue:`22486`): use :func:`math.gcd` instead. + (Contributed by Victor Stinner in :issue:`39350`.) + Porting to Python 3.9 ===================== diff --git a/Lib/fractions.py b/Lib/fractions.py index 2e7047a8184..501f4b74a0b 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -10,31 +10,9 @@ import operator import re import sys -__all__ = ['Fraction', 'gcd'] +__all__ = ['Fraction'] - -def gcd(a, b): - """Calculate the Greatest Common Divisor of a and b. - - Unless b==0, the result will have the same sign as b (so that when - b is divided by it, the result comes out positive). - """ - import warnings - warnings.warn('fractions.gcd() is deprecated. Use math.gcd() instead.', - DeprecationWarning, 2) - if type(a) is int is type(b): - if (b or a) < 0: - return -math.gcd(a, b) - return math.gcd(a, b) - return _gcd(a, b) - -def _gcd(a, b): - # Supports non-integers for backward compatibility. - while b: - a, b = b, a%b - return a - # Constants related to the hash implementation; hash(x) is based # on the reduction of x modulo the prime _PyHASH_MODULUS. _PyHASH_MODULUS = sys.hash_info.modulus diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 18ab28cfebe..7cf7899932b 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -12,7 +12,7 @@ import warnings from copy import copy, deepcopy from pickle import dumps, loads F = fractions.Fraction -gcd = fractions.gcd + class DummyFloat(object): """Dummy float class for testing comparisons with Fractions""" @@ -81,30 +81,6 @@ class DummyRational(object): class DummyFraction(fractions.Fraction): """Dummy Fraction subclass for copy and deepcopy testing.""" -class GcdTest(unittest.TestCase): - - def testMisc(self): - # fractions.gcd() is deprecated - with self.assertWarnsRegex(DeprecationWarning, r'fractions\.gcd'): - gcd(1, 1) - with warnings.catch_warnings(): - warnings.filterwarnings('ignore', r'fractions\.gcd', - DeprecationWarning) - self.assertEqual(0, gcd(0, 0)) - self.assertEqual(1, gcd(1, 0)) - self.assertEqual(-1, gcd(-1, 0)) - self.assertEqual(1, gcd(0, 1)) - self.assertEqual(-1, gcd(0, -1)) - self.assertEqual(1, gcd(7, 1)) - self.assertEqual(-1, gcd(7, -1)) - self.assertEqual(1, gcd(-23, 15)) - self.assertEqual(12, gcd(120, 84)) - self.assertEqual(-12, gcd(84, -120)) - self.assertEqual(gcd(120.0, 84), 12.0) - self.assertEqual(gcd(120, 84.0), 12.0) - self.assertEqual(gcd(F(120), F(84)), F(12)) - self.assertEqual(gcd(F(120, 77), F(84, 55)), F(12, 385)) - def _components(r): return (r.numerator, r.denominator) @@ -690,5 +666,6 @@ class FractionTest(unittest.TestCase): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst new file mode 100644 index 00000000000..264e52fdc51 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst @@ -0,0 +1,2 @@ +Remove ``fractions.gcd()`` function, deprecated since Python 3.5 +(:issue:`22486`): use :func:`math.gcd` instead. From c5b79003f5fe6aa28a2a028680367839ba8677db Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Thu, 16 Jan 2020 15:09:19 +0100 Subject: [PATCH 147/380] bpo-31031: Unify duplicate bits_in_digit and bit_length (GH-2866) Add _Py_bit_length() to unify duplicate bits_in_digit() and bit_length(). --- Include/pymath.h | 8 ++++++++ Modules/mathmodule.c | 28 +++------------------------- Objects/longobject.c | 38 +++++++++----------------------------- Python/pymath.c | 15 +++++++++++++++ 4 files changed, 35 insertions(+), 54 deletions(-) diff --git a/Include/pymath.h b/Include/pymath.h index f869724334a..63ca972784e 100644 --- a/Include/pymath.h +++ b/Include/pymath.h @@ -227,4 +227,12 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * behavior. */ #define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) +/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. + * Equivalent to floor(log2(x))+1. Also equivalent to: bitwidth_of_type - + * count_leading_zero_bits(x) + */ +#ifndef Py_LIMITED_API +PyAPI_FUNC(unsigned int) _Py_bit_length(unsigned long d); +#endif + #endif /* Py_PYMATH_H */ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 5e8e485afd4..81d871786f1 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -1441,28 +1441,6 @@ math_fsum(PyObject *module, PyObject *seq) #undef NUM_PARTIALS -/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. - * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type - - * count_leading_zero_bits(x) - */ - -/* XXX: This routine does more or less the same thing as - * bits_in_digit() in Objects/longobject.c. Someday it would be nice to - * consolidate them. On BSD, there's a library function called fls() - * that we could use, and GCC provides __builtin_clz(). - */ - -static unsigned long -bit_length(unsigned long n) -{ - unsigned long len = 0; - while (n != 0) { - ++len; - n >>= 1; - } - return len; -} - static unsigned long count_set_bits(unsigned long n) { @@ -1877,7 +1855,7 @@ factorial_partial_product(unsigned long start, unsigned long stop, /* find midpoint of range(start, stop), rounded up to next odd number. */ midpoint = (start + num_operands) | 1; left = factorial_partial_product(start, midpoint, - bit_length(midpoint - 2)); + _Py_bit_length(midpoint - 2)); if (left == NULL) goto error; right = factorial_partial_product(midpoint, stop, max_bits); @@ -1907,7 +1885,7 @@ factorial_odd_part(unsigned long n) Py_INCREF(outer); upper = 3; - for (i = bit_length(n) - 2; i >= 0; i--) { + for (i = _Py_bit_length(n) - 2; i >= 0; i--) { v = n >> i; if (v <= 2) continue; @@ -1917,7 +1895,7 @@ factorial_odd_part(unsigned long n) /* Here inner is the product of all odd integers j in the range (0, n/2**(i+1)]. The factorial_partial_product call below gives the product of all odd integers j in the range (n/2**(i+1), n/2**i]. */ - partial = factorial_partial_product(lower, upper, bit_length(upper-2)); + partial = factorial_partial_product(lower, upper, _Py_bit_length(upper-2)); /* inner *= partial */ if (partial == NULL) goto error; diff --git a/Objects/longobject.c b/Objects/longobject.c index be9301f8516..b672ae42018 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -803,26 +803,6 @@ _PyLong_Sign(PyObject *vv) return Py_SIZE(v) == 0 ? 0 : (Py_SIZE(v) < 0 ? -1 : 1); } -/* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d < - 2**k if d is nonzero, else 0. */ - -static const unsigned char BitLengthTable[32] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 -}; - -static int -bits_in_digit(digit d) -{ - int d_bits = 0; - while (d >= 32) { - d_bits += 6; - d >>= 6; - } - d_bits += (int)BitLengthTable[d]; - return d_bits; -} - size_t _PyLong_NumBits(PyObject *vv) { @@ -840,7 +820,7 @@ _PyLong_NumBits(PyObject *vv) if ((size_t)(ndigits - 1) > SIZE_MAX / (size_t)PyLong_SHIFT) goto Overflow; result = (size_t)(ndigits - 1) * (size_t)PyLong_SHIFT; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (SIZE_MAX - msd_bits < result) goto Overflow; result += msd_bits; @@ -1950,7 +1930,7 @@ long_format_binary(PyObject *aa, int base, int alternate, return -1; } size_a_in_bits = (size_a - 1) * PyLong_SHIFT + - bits_in_digit(a->ob_digit[size_a - 1]); + _Py_bit_length(a->ob_digit[size_a - 1]); /* Allow 1 character for a '-' sign. */ sz = negative + (size_a_in_bits + (bits - 1)) / bits; } @@ -2770,7 +2750,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem) /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2. shift v1 left by the same amount. Results go into w and v. */ - d = PyLong_SHIFT - bits_in_digit(w1->ob_digit[size_w-1]); + d = PyLong_SHIFT - _Py_bit_length(w1->ob_digit[size_w-1]); carry = v_lshift(w->ob_digit, w1->ob_digit, size_w, d); assert(carry == 0); carry = v_lshift(v->ob_digit, v1->ob_digit, size_v, d); @@ -2891,7 +2871,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e) *e = 0; return 0.0; } - a_bits = bits_in_digit(a->ob_digit[a_size-1]); + a_bits = _Py_bit_length(a->ob_digit[a_size-1]); /* The following is an overflow-free version of the check "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */ if (a_size >= (PY_SSIZE_T_MAX - 1) / PyLong_SHIFT + 1 && @@ -3986,8 +3966,8 @@ long_true_divide(PyObject *v, PyObject *w) /* Extreme underflow */ goto underflow_or_zero; /* Next line is now safe from overflowing a Py_ssize_t */ - diff = diff * PyLong_SHIFT + bits_in_digit(a->ob_digit[a_size - 1]) - - bits_in_digit(b->ob_digit[b_size - 1]); + diff = diff * PyLong_SHIFT + _Py_bit_length(a->ob_digit[a_size - 1]) - + _Py_bit_length(b->ob_digit[b_size - 1]); /* Now diff = a_bits - b_bits. */ if (diff > DBL_MAX_EXP) goto overflow; @@ -4063,7 +4043,7 @@ long_true_divide(PyObject *v, PyObject *w) } x_size = Py_ABS(Py_SIZE(x)); assert(x_size > 0); /* result of division is never zero */ - x_bits = (x_size-1)*PyLong_SHIFT+bits_in_digit(x->ob_digit[x_size-1]); + x_bits = (x_size-1)*PyLong_SHIFT+_Py_bit_length(x->ob_digit[x_size-1]); /* The number of extra bits that have to be rounded away. */ extra_bits = Py_MAX(x_bits, DBL_MIN_EXP - shift) - DBL_MANT_DIG; @@ -4877,7 +4857,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) alloc_b = Py_SIZE(b); /* reduce until a fits into 2 digits */ while ((size_a = Py_SIZE(a)) > 2) { - nbits = bits_in_digit(a->ob_digit[size_a-1]); + nbits = _Py_bit_length(a->ob_digit[size_a-1]); /* extract top 2*PyLong_SHIFT bits of a into x, along with corresponding bits of b into y */ size_b = Py_SIZE(b); @@ -5395,7 +5375,7 @@ int_bit_length_impl(PyObject *self) return PyLong_FromLong(0); msd = ((PyLongObject *)self)->ob_digit[ndigits-1]; - msd_bits = bits_in_digit(msd); + msd_bits = _Py_bit_length(msd); if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT) return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits); diff --git a/Python/pymath.c b/Python/pymath.c index 24b804223ee..a08a0e79615 100644 --- a/Python/pymath.c +++ b/Python/pymath.c @@ -79,3 +79,18 @@ round(double x) return copysign(y, x); } #endif /* HAVE_ROUND */ + +static const unsigned int BitLengthTable[32] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; + +unsigned int _Py_bit_length(unsigned long d) { + unsigned int d_bits = 0; + while (d >= 32) { + d_bits += 6; + d >>= 6; + } + d_bits += BitLengthTable[d]; + return d_bits; +} From 9baf242fc733ab8a52a0b6201d95c6fdb8251745 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Jan 2020 15:33:30 +0100 Subject: [PATCH 148/380] bpo-39357: Remove buffering parameter of bz2.BZ2File (GH-18028) Remove the buffering parameter of bz2.BZ2File. Since Python 3.0, it was ignored and using it was emitting a DeprecationWarning. Pass an open file object to control how the file is opened. The compresslevel parameter becomes keyword-only. --- Doc/library/bz2.rst | 14 ++++++++------ Doc/whatsnew/3.9.rst | 10 ++++++++++ Lib/bz2.py | 10 +--------- Lib/test/test_bz2.py | 3 +++ .../2020-01-16-11-24-00.bpo-39357.bCwx-h.rst | 4 ++++ 5 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index aa836af2b25..85cdc16a7d7 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -65,7 +65,7 @@ All of the classes in this module may safely be accessed from multiple threads. Accepts a :term:`path-like object`. -.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9) +.. class:: BZ2File(filename, mode='r', *, compresslevel=9) Open a bzip2-compressed file in binary mode. @@ -81,8 +81,6 @@ All of the classes in this module may safely be accessed from multiple threads. If *filename* is a file object (rather than an actual file name), a mode of ``'w'`` does not truncate the file, and is instead equivalent to ``'a'``. - The *buffering* argument is ignored. Its use is deprecated since Python 3.0. - If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between ``1`` and ``9`` specifying the level of compression: ``1`` produces the least compression, and ``9`` (default) produces the most compression. @@ -110,9 +108,6 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionadded:: 3.3 - .. deprecated:: 3.0 - The keyword argument *buffering* was deprecated and is now ignored. - .. versionchanged:: 3.1 Support for the :keyword:`with` statement was added. @@ -138,6 +133,13 @@ All of the classes in this module may safely be accessed from multiple threads. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. + .. versionchanged:: 3.9 + The *buffering* parameter has been removed. It was ignored and deprecated + since Python 3.0. Pass an open file object to control how the file is + opened. + + The *compresslevel* parameter became keyword-only. + Incremental (de)compression --------------------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 8ca755645d6..f40685c9327 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -420,6 +420,12 @@ Removed 3.5 (:issue:`22486`): use :func:`math.gcd` instead. (Contributed by Victor Stinner in :issue:`39350`.) +* The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since + Python 3.0, it was ignored and using it was emitting + :exc:`DeprecationWarning`. Pass an open file object to control how the file + is opened. + (Contributed by Victor Stinner in :issue:`39357`.) + Porting to Python 3.9 ===================== @@ -451,6 +457,10 @@ Changes in the Python API :data:`~errno.EBADF` error. (Contributed by Victor Stinner in :issue:`39239`.) +* The *compresslevel* parameter of :class:`bz2.BZ2File` became keyword-only, + since the *buffering* parameter has been removed. + (Contributed by Victor Stinner in :issue:`39357`.) + CPython bytecode changes ------------------------ diff --git a/Lib/bz2.py b/Lib/bz2.py index 21e8ff49c67..a499ca3598f 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -24,8 +24,6 @@ _MODE_READ = 1 # Value 2 no longer used _MODE_WRITE = 3 -_sentinel = object() - class BZ2File(_compression.BaseStream): @@ -38,7 +36,7 @@ class BZ2File(_compression.BaseStream): returned as bytes, and data to be written should be given as bytes. """ - def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9): + def __init__(self, filename, mode="r", *, compresslevel=9): """Open a bzip2-compressed file. If filename is a str, bytes, or PathLike object, it gives the @@ -65,12 +63,6 @@ class BZ2File(_compression.BaseStream): self._closefp = False self._mode = _MODE_CLOSED - if buffering is not _sentinel: - warnings.warn("Use of 'buffering' argument is deprecated and ignored " - "since Python 3.0.", - DeprecationWarning, - stacklevel=2) - if not (1 <= compresslevel <= 9): raise ValueError("compresslevel must be between 1 and 9") diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index eb2f72ee4a5..030d564fc59 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -100,6 +100,9 @@ class BZ2FileTest(BaseTest): self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=0) self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=10) + # compresslevel is keyword-only + self.assertRaises(TypeError, BZ2File, os.devnull, "r", 3) + def testRead(self): self.createTempFile() with BZ2File(self.filename) as bz2f: diff --git a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst new file mode 100644 index 00000000000..a90802c91a2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst @@ -0,0 +1,4 @@ +Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, it +was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an open +file object, to control how the file is opened. The *compresslevel* parameter +becomes keyword-only. From 10fd6b2b9f0aeb8f5a0ce4cb4b9f21f942d39a71 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 17 Jan 2020 13:50:39 +0100 Subject: [PATCH 149/380] bpo-39357: Update bz2 docstring: remove buffering (GH-18036) Thanks Karthikeyan Singaravelan for the report ;-) --- Lib/bz2.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/bz2.py b/Lib/bz2.py index a499ca3598f..e094fbb548b 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -47,8 +47,6 @@ class BZ2File(_compression.BaseStream): 'x' for creating exclusively, or 'a' for appending. These can equivalently be given as 'rb', 'wb', 'xb', and 'ab'. - buffering is ignored since Python 3.0. Its use is deprecated. - If mode is 'w', 'x' or 'a', compresslevel can be a number between 1 and 9 specifying the level of compression: 1 produces the least compression, and 9 (default) produces the most compression. From 1d3b0aaa54c56282c0a3e7fc396e5b1de8b1974e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 17 Jan 2020 15:17:48 +0100 Subject: [PATCH 150/380] bpo-39356, zipfile: Remove code handling DeprecationWarning (GH-18027) Remove old "except DeprecationWarning:" code path added by commit bf02e3bb21b2d75cba4ce409a14ae64dbc2dd6d2. It's no longer needed. struct.pack() no longer emit DeprecationWarning if getting a float whereas an integer is expected. It now raises an hard error instead. --- Lib/zipfile.py | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index e1d07f2a523..2da87ef505e 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1867,25 +1867,15 @@ class ZipFile: extract_version = max(min_version, zinfo.extract_version) create_version = max(min_version, zinfo.create_version) - try: - filename, flag_bits = zinfo._encodeFilenameFlags() - centdir = struct.pack(structCentralDir, - stringCentralDir, create_version, - zinfo.create_system, extract_version, zinfo.reserved, - flag_bits, zinfo.compress_type, dostime, dosdate, - zinfo.CRC, compress_size, file_size, - len(filename), len(extra_data), len(zinfo.comment), - 0, zinfo.internal_attr, zinfo.external_attr, - header_offset) - except DeprecationWarning: - print((structCentralDir, stringCentralDir, create_version, - zinfo.create_system, extract_version, zinfo.reserved, - zinfo.flag_bits, zinfo.compress_type, dostime, dosdate, - zinfo.CRC, compress_size, file_size, - len(zinfo.filename), len(extra_data), len(zinfo.comment), - 0, zinfo.internal_attr, zinfo.external_attr, - header_offset), file=sys.stderr) - raise + filename, flag_bits = zinfo._encodeFilenameFlags() + centdir = struct.pack(structCentralDir, + stringCentralDir, create_version, + zinfo.create_system, extract_version, zinfo.reserved, + flag_bits, zinfo.compress_type, dostime, dosdate, + zinfo.CRC, compress_size, file_size, + len(filename), len(extra_data), len(zinfo.comment), + 0, zinfo.internal_attr, zinfo.external_attr, + header_offset) self.fp.write(centdir) self.fp.write(filename) self.fp.write(extra_data) From ef8844f1bcbea994a2a69b5a70309369d08b555c Mon Sep 17 00:00:00 2001 From: Grant Jenks Date: Fri, 17 Jan 2020 14:54:44 -0800 Subject: [PATCH 151/380] Fix Lock.locked() to remove extra bold highlighting (#18042) --- Doc/library/threading.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 96989bdd525..1e902941427 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -497,6 +497,7 @@ All methods are executed atomically. There is no return value. .. method:: locked() + Return true if the lock is acquired. From 6aabb63d96845b3cb207d28d40bf0b78e171be75 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 17 Jan 2020 23:44:38 +0000 Subject: [PATCH 152/380] Run doctests in GitHub actions Docs targer (GH-18041) --- .github/workflows/doc.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 405b12e3d29..5bba8e69065 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -23,17 +23,17 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - with: - python-version: '3.7' - architecture: 'x64' + - name: 'Install Dependencies' + run: sudo ./.github/workflows/posix-deps-apt.sh && sudo apt-get install wamerican + - name: 'Configure CPython' + run: ./configure --with-pydebug + - name: 'Build CPython' + run: make -s -j4 - name: 'Install build dependencies' - run: python -m pip install sphinx==2.2.0 blurb python-docs-theme + run: make -C Doc/ PYTHON=../python venv - name: 'Build documentation' - run: | - cd Doc - make check suspicious html PYTHON=python - - name: Upload + run: xvfb-run make -C Doc/ PYTHON=../python SPHINXOPTS="-q -W -j4" doctest suspicious html + - name: 'Upload' uses: actions/upload-artifact@v1 with: name: doc-html From cd7db76a636c218b2d81d3526eb435cfae61f212 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sat, 18 Jan 2020 03:14:59 +0000 Subject: [PATCH 153/380] bpo-39372: Clean header files of declared interfaces with no implementations (GH-18037) 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. --- Include/bytesobject.h | 22 ------------------- Include/cpython/pylifecycle.h | 8 ------- Include/floatobject.h | 9 -------- Include/frameobject.h | 4 ---- Include/genobject.h | 2 -- Include/import.h | 2 -- Include/internal/pycore_pathconfig.h | 2 -- Include/iterobject.h | 1 - Include/listobject.h | 1 - Include/methodobject.h | 2 -- Include/pythread.h | 1 - .../2020-01-17-19-25-48.bpo-39372.hGJMY6.rst | 8 +++++++ Objects/stringlib/asciilib.h | 3 --- Objects/stringlib/ucs1lib.h | 4 ---- Objects/stringlib/ucs2lib.h | 3 --- Objects/stringlib/ucs4lib.h | 2 -- Objects/stringlib/undef.h | 1 - 17 files changed, 8 insertions(+), 67 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst diff --git a/Include/bytesobject.h b/Include/bytesobject.h index fc9981e56d2..4aaa71a832b 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -106,28 +106,6 @@ PyAPI_FUNC(int) PyBytes_AsStringAndSize( strings) */ ); -/* Using the current locale, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGroupingLocale(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width); - -/* Using explicit passed-in values, insert the thousands grouping - into the string pointed to by buffer. For the argument descriptions, - see Objects/stringlib/localeutil.h */ -PyAPI_FUNC(Py_ssize_t) _PyBytes_InsertThousandsGrouping(char *buffer, - Py_ssize_t n_buffer, - char *digits, - Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep); -#endif - /* Flags used by string formatting */ #define F_LJUST (1<<0) #define F_SIGN (1<<1) diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index 2f3a0dbdfe6..a01e9c94f12 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -32,14 +32,6 @@ PyAPI_FUNC(int) _Py_IsCoreInitialized(void); PyAPI_FUNC(PyStatus) Py_InitializeFromConfig( const PyConfig *config); -PyAPI_FUNC(PyStatus) _Py_InitializeFromArgs( - const PyConfig *config, - Py_ssize_t argc, - char * const *argv); -PyAPI_FUNC(PyStatus) _Py_InitializeFromWideArgs( - const PyConfig *config, - Py_ssize_t argc, - wchar_t * const *argv); PyAPI_FUNC(PyStatus) _Py_InitializeMain(void); PyAPI_FUNC(int) Py_RunMain(void); diff --git a/Include/floatobject.h b/Include/floatobject.h index f1044d64cba..0fb9fc4e0fa 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -88,15 +88,6 @@ PyAPI_FUNC(int) _PyFloat_Pack2(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack4(double x, unsigned char *p, int le); PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le); -/* Needed for the old way for marshal to store a floating point number. - Returns the string length copied into p, -1 on error. - */ -PyAPI_FUNC(int) _PyFloat_Repr(double x, char *p, size_t len); - -/* Used to get the important decimal digits of a double */ -PyAPI_FUNC(int) _PyFloat_Digits(char *buf, double v, int *signum); -PyAPI_FUNC(void) _PyFloat_DigitsInit(void); - /* The unpack routines read 2, 4 or 8 bytes, starting at p. le is a bool * argument, true if the string is in little-endian format (exponent * last, at p+1, p+3 or p+7), false if big-endian (exponent first, at p). diff --git a/Include/frameobject.h b/Include/frameobject.h index 3bad86a66f7..ddcf1591aae 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -67,10 +67,6 @@ PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); -/* Extend the value stack */ - -PyAPI_FUNC(PyObject **) PyFrame_ExtendStack(PyFrameObject *, int, int); - /* Conversions between "fast locals" and locals in dictionary */ PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); diff --git a/Include/genobject.h b/Include/genobject.h index 96f8dcc74d8..5ee9a2831d1 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -58,8 +58,6 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCoro_Type; PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; -PyAPI_DATA(PyTypeObject) _PyAIterWrapper_Type; - #define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) PyObject *_PyCoro_GetAwaitableIter(PyObject *o); PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, diff --git a/Include/import.h b/Include/import.h index 735533ee7a7..aeef3efd0bc 100644 --- a/Include/import.h +++ b/Include/import.h @@ -81,8 +81,6 @@ PyAPI_FUNC(int) PyImport_ImportFrozenModule( const char *name /* UTF-8 encoded string */ ); -PyAPI_DATA(PyTypeObject) PyNullImporter_Type; - PyAPI_FUNC(int) PyImport_AppendInittab( const char *name, /* ASCII encoded string */ PyObject* (*initfunc)(void) diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 257c056a77d..42d61b1ca26 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -47,8 +47,6 @@ PyAPI_DATA(wchar_t*) _Py_dll_path; #endif extern void _PyPathConfig_ClearGlobal(void); -extern PyStatus _PyPathConfig_SetGlobal( - const struct _PyPathConfig *pathconfig); extern PyStatus _PyPathConfig_Calculate( _PyPathConfig *pathconfig, diff --git a/Include/iterobject.h b/Include/iterobject.h index f61726f1f7f..eec2ee271eb 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,7 +7,6 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -PyAPI_DATA(PyTypeObject) PyCmpWrapper_Type; #define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) diff --git a/Include/listobject.h b/Include/listobject.h index 6057279d51c..baf94152792 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -43,7 +43,6 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyList_Type; PyAPI_DATA(PyTypeObject) PyListIter_Type; PyAPI_DATA(PyTypeObject) PyListRevIter_Type; -PyAPI_DATA(PyTypeObject) PySortWrapper_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) diff --git a/Include/methodobject.h b/Include/methodobject.h index a15d05f8991..d9f8d4f80c2 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -22,8 +22,6 @@ typedef PyObject *(*PyCFunctionWithKeywords)(PyObject *, PyObject *, typedef PyObject *(*_PyCFunctionFastWithKeywords) (PyObject *, PyObject *const *, Py_ssize_t, PyObject *); -typedef PyObject *(*PyNoArgsFunction)(PyObject *); - PyAPI_FUNC(PyCFunction) PyCFunction_GetFunction(PyObject *); PyAPI_FUNC(PyObject *) PyCFunction_GetSelf(PyObject *); PyAPI_FUNC(int) PyCFunction_GetFlags(PyObject *); diff --git a/Include/pythread.h b/Include/pythread.h index 569d6964899..1cf83b7a36d 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -3,7 +3,6 @@ #define Py_PYTHREAD_H typedef void *PyThread_type_lock; -typedef void *PyThread_type_sema; #ifdef __cplusplus extern "C" { diff --git a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst new file mode 100644 index 00000000000..8415d756ffa --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst @@ -0,0 +1,8 @@ +Clean 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``. diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index d0fc18d22fa..e95552624aa 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index ce1eb57f0d7..bc4b104f112 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -24,7 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping - - diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index f900cb65f8c..86a1dff1b56 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -24,6 +24,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII - -#define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping - diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index 86a480f1e3a..3c32a93c96a 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -25,5 +25,3 @@ #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII -#define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping - diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index f9d3f1d3328..c41e254fde6 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -6,6 +6,5 @@ #undef STRINGLIB_STR #undef STRINGLIB_LEN #undef STRINGLIB_NEW -#undef _Py_InsertThousandsGrouping #undef STRINGLIB_IS_UNICODE From 558f07891170fe5173f277d3749e92d844de0a27 Mon Sep 17 00:00:00 2001 From: Michael Haas Date: Sun, 19 Jan 2020 04:29:42 -0600 Subject: [PATCH 154/380] Fix typo from base to based (GH-18055) --- Lib/webbrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 0af36c4301d..1ef179a91a6 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -87,7 +87,7 @@ def open_new_tab(url): def _synthesize(browser, *, preferred=False): - """Attempt to synthesize a controller base on existing controllers. + """Attempt to synthesize a controller based on existing controllers. This is useful to create a controller when a user specifies a path to an entry in the BROWSER environment variable -- we can copy a general From d8ef64422a75f40cecdb1a7ee43492607d3daaf6 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sun, 19 Jan 2020 15:38:37 -0700 Subject: [PATCH 155/380] bpo-35561: Supress valgrind false alarm on epoll_ctl(event) (GH-18060) Update Misc/valgrind-python.supp to suppress the false alarm. --- Misc/valgrind-python.supp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp index 38a5ea3cd2b..c9c45ba7ed6 100644 --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -263,6 +263,14 @@ } +{ + Uninitialised byte(s) false alarm, see bpo-35561 + Memcheck:Param + epoll_ctl(event) + fun:epoll_ctl + fun:pyepoll_internal_ctl +} + { ZLIB problems, see test_gzip Memcheck:Cond From e96d954527aa376457451e32a9d75ae3ea9ab4bd Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Mon, 20 Jan 2020 12:45:50 +0900 Subject: [PATCH 156/380] bpo-38536: locale: Remove trailing space in formatted currency (GH-16864) --- Lib/locale.py | 2 ++ Lib/test/test_locale.py | 3 +-- .../next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst diff --git a/Lib/locale.py b/Lib/locale.py index dd8a08524a0..1a4e9f694f3 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -279,6 +279,8 @@ def currency(val, symbol=True, grouping=False, international=False): if precedes: s = smb + (separated and ' ' or '') + s else: + if international and smb[-1] == ' ': + smb = smb[:-1] s = s + (separated and ' ' or '') + smb sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index c5d8e269d63..2863d200e25 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -334,8 +334,7 @@ class TestFrFRNumberFormatting(FrFRCookedTest, BaseFormattingTest): euro = '\u20ac' self._test_currency(50000, "50000,00 " + euro) self._test_currency(50000, "50 000,00 " + euro, grouping=True) - # XXX is the trailing space a bug? - self._test_currency(50000, "50 000,00 EUR ", + self._test_currency(50000, "50 000,00 EUR", grouping=True, international=True) diff --git a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst new file mode 100644 index 00000000000..147d181cc7e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst @@ -0,0 +1,2 @@ +Removes trailing space in formatted currency with `international=True` and a locale with symbol following value. +E.g. `locale.currency(12.34, international=True)` returned `'12,34 EUR '` instead of `'12,34 EUR'`. From 5492bfcefec67b016e8239c0e9135bc2f03e3058 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Mon, 20 Jan 2020 13:54:00 +0900 Subject: [PATCH 157/380] bpo-39377: json: Remove the encoding option. (GH-18075) --- Lib/json/__init__.py | 11 ----------- Lib/test/test_json/test_decode.py | 4 ---- .../Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst | 2 ++ 3 files changed, 2 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py index 1ba8b48bd78..2c52bdeba67 100644 --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -329,8 +329,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` kwarg; otherwise ``JSONDecoder`` is used. - - The ``encoding`` argument is ignored and deprecated since Python 3.1. """ if isinstance(s, str): if s.startswith('\ufeff'): @@ -342,15 +340,6 @@ def loads(s, *, cls=None, object_hook=None, parse_float=None, f'not {s.__class__.__name__}') s = s.decode(detect_encoding(s), 'surrogatepass') - if "encoding" in kw: - import warnings - warnings.warn( - "'encoding' is ignored and deprecated. It will be removed in Python 3.9", - DeprecationWarning, - stacklevel=2 - ) - del kw['encoding'] - if (cls is None and object_hook is None and parse_int is None and parse_float is None and parse_constant is None and object_pairs_hook is None and not kw): diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py index 895c95b54c3..fdb9e62124e 100644 --- a/Lib/test/test_json/test_decode.py +++ b/Lib/test/test_json/test_decode.py @@ -95,9 +95,5 @@ class TestDecode: d = self.json.JSONDecoder() self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000) - def test_deprecated_encode(self): - with self.assertWarns(DeprecationWarning): - self.loads('{}', encoding='fake') - class TestPyDecode(TestDecode, PyTest): pass class TestCDecode(TestDecode, CTest): pass diff --git a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst new file mode 100644 index 00000000000..8493ac88e4b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst @@ -0,0 +1,2 @@ +Removed ``encoding`` option from :func:`json.loads`. It has been deprecated +since Python 3.1. From 1e420f849d0c094098543d2c27d35eaec69b2784 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Tue, 21 Jan 2020 08:21:35 +1000 Subject: [PATCH 158/380] bpo-35134: Migrate frameobject.h contents to cpython/frameobject.h (GH-18052) --- Include/cpython/frameobject.h | 87 +++++++++++++++++++++++++++++++++++ Include/frameobject.h | 82 ++++----------------------------- 2 files changed, 95 insertions(+), 74 deletions(-) create mode 100644 Include/cpython/frameobject.h diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h new file mode 100644 index 00000000000..cf8c00c3528 --- /dev/null +++ b/Include/cpython/frameobject.h @@ -0,0 +1,87 @@ +/* Frame object interface */ + +#ifndef Py_CPYTHON_FRAMEOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int b_type; /* what kind of block this is */ + int b_handler; /* where to jump to find handler */ + int b_level; /* value stack level to pop to */ +} PyTryBlock; + +typedef struct _frame { + PyObject_VAR_HEAD + struct _frame *f_back; /* previous frame, or NULL */ + PyCodeObject *f_code; /* code segment */ + PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ + PyObject *f_globals; /* global symbol table (PyDictObject) */ + PyObject *f_locals; /* local symbol table (any mapping) */ + PyObject **f_valuestack; /* points after the last local */ + /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. + Frame evaluation usually NULLs it, but a frame that yields sets it + to the current stack top. */ + PyObject **f_stacktop; + PyObject *f_trace; /* Trace function */ + char f_trace_lines; /* Emit per-line trace events? */ + char f_trace_opcodes; /* Emit per-opcode trace events? */ + + /* Borrowed reference to a generator, or NULL */ + PyObject *f_gen; + + int f_lasti; /* Last instruction if called */ + /* Call PyFrame_GetLineNumber() instead of reading this field + directly. As of 2.3 f_lineno is only valid when tracing is + active (i.e. when f_trace is set). At other times we use + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ + int f_iblock; /* index in f_blockstack */ + char f_executing; /* whether the frame is still executing */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ +} PyFrameObject; + + +/* Standard object interface */ + +PyAPI_DATA(PyTypeObject) PyFrame_Type; + +#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) + +PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + +/* only internal use */ +PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, + PyObject *, PyObject *); + + +/* The rest of the interface is specific for frame objects */ + +/* Block management functions */ + +PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); +PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); + +/* Conversions between "fast locals" and locals in dictionary */ + +PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); + +PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); +PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); + +PyAPI_FUNC(int) PyFrame_ClearFreeList(void); + +PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); + +/* Return the line of code the frame is currently executing. */ +PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); + +#ifdef __cplusplus +} +#endif diff --git a/Include/frameobject.h b/Include/frameobject.h index ddcf1591aae..1460e2210e3 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -1,88 +1,22 @@ /* Frame object interface */ -#ifndef Py_LIMITED_API #ifndef Py_FRAMEOBJECT_H #define Py_FRAMEOBJECT_H #ifdef __cplusplus extern "C" { #endif -typedef struct { - int b_type; /* what kind of block this is */ - int b_handler; /* where to jump to find handler */ - int b_level; /* value stack level to pop to */ -} PyTryBlock; +/* There are currently no frame related APIs in the stable ABI + * (they're all in the full CPython-specific API) + */ -typedef struct _frame { - PyObject_VAR_HEAD - struct _frame *f_back; /* previous frame, or NULL */ - PyCodeObject *f_code; /* code segment */ - PyObject *f_builtins; /* builtin symbol table (PyDictObject) */ - PyObject *f_globals; /* global symbol table (PyDictObject) */ - PyObject *f_locals; /* local symbol table (any mapping) */ - PyObject **f_valuestack; /* points after the last local */ - /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. */ - PyObject **f_stacktop; - PyObject *f_trace; /* Trace function */ - char f_trace_lines; /* Emit per-line trace events? */ - char f_trace_opcodes; /* Emit per-opcode trace events? */ - - /* Borrowed reference to a generator, or NULL */ - PyObject *f_gen; - - int f_lasti; /* Last instruction if called */ - /* Call PyFrame_GetLineNumber() instead of reading this field - directly. As of 2.3 f_lineno is only valid when tracing is - active (i.e. when f_trace is set). At other times we use - PyCode_Addr2Line to calculate the line from the current - bytecode index. */ - int f_lineno; /* Current line number */ - int f_iblock; /* index in f_blockstack */ - char f_executing; /* whether the frame is still executing */ - PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ - PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ -} PyFrameObject; - - -/* Standard object interface */ - -PyAPI_DATA(PyTypeObject) PyFrame_Type; - -#define PyFrame_Check(op) (Py_TYPE(op) == &PyFrame_Type) - -PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - -/* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); - - -/* The rest of the interface is specific for frame objects */ - -/* Block management functions */ - -PyAPI_FUNC(void) PyFrame_BlockSetup(PyFrameObject *, int, int, int); -PyAPI_FUNC(PyTryBlock *) PyFrame_BlockPop(PyFrameObject *); - -/* Conversions between "fast locals" and locals in dictionary */ - -PyAPI_FUNC(void) PyFrame_LocalsToFast(PyFrameObject *, int); - -PyAPI_FUNC(int) PyFrame_FastToLocalsWithError(PyFrameObject *f); -PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); - -PyAPI_FUNC(int) PyFrame_ClearFreeList(void); - -PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); - -/* Return the line of code the frame is currently executing. */ -PyAPI_FUNC(int) PyFrame_GetLineNumber(PyFrameObject *); +#ifndef Py_LIMITED_API +# define Py_CPYTHON_FRAMEOBJECT_H +# include "cpython/frameobject.h" +# undef Py_CPYTHON_FRAMEOBJECT_H +#endif #ifdef __cplusplus } #endif #endif /* !Py_FRAMEOBJECT_H */ -#endif /* Py_LIMITED_API */ From 2c49becc69c05934996a00b902e4a4f089b91954 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Tue, 21 Jan 2020 00:46:38 +0200 Subject: [PATCH 159/380] Fix asyncio.get_event_loop() documentation (GH-18051) Mention that the function implicitly creates new event loop only if called from the main thread. --- Doc/library/asyncio-eventloop.rst | 6 ++++-- .../Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index ee995e04e47..25a3692695d 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -38,8 +38,10 @@ an event loop: .. function:: get_event_loop() - Get the current event loop. If there is no current event loop set - in the current OS thread and :func:`set_event_loop` has not yet + Get the current event loop. + + If there is no current event loop set in the current OS thread, + the OS thread is main, and :func:`set_event_loop` has not yet been called, asyncio will create a new event loop and set it as the current one. diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst new file mode 100644 index 00000000000..37b66ad9dfd --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst @@ -0,0 +1,2 @@ +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. From a96e06db77dcbd3433d39761ddb4615d7d96284a Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Tue, 21 Jan 2020 00:49:30 +0200 Subject: [PATCH 160/380] bpo-39386: Prevent double awaiting of async iterator (GH-18081) --- Lib/test/test_asyncgen.py | 36 +++++++++++++++++++ .../2020-01-20-21-40-57.bpo-39386.ULqD8t.rst | 1 + Objects/genobject.c | 16 ++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 58d8aee19ad..24b20bec2b2 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1128,6 +1128,42 @@ class AsyncGenAsyncioTest(unittest.TestCase): self.assertEqual([], messages) + def test_async_gen_await_anext_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.__anext__() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited __anext__\(\)/asend\(\)" + ): + await nxt + + await it.aclose() # prevent unfinished iterator warning + + self.loop.run_until_complete(run()) + + def test_async_gen_await_aclose_twice(self): + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + nxt = it.aclose() + await nxt + with self.assertRaisesRegex( + RuntimeError, + r"cannot reuse already awaited aclose\(\)/athrow\(\)" + ): + await nxt + + self.loop.run_until_complete(run()) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst new file mode 100644 index 00000000000..f24e1f4e8a1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst @@ -0,0 +1 @@ +Prevent double awaiting of async iterator. diff --git a/Objects/genobject.c b/Objects/genobject.c index c5fe9999af2..652c2903dd2 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1518,7 +1518,9 @@ async_gen_asend_send(PyAsyncGenASend *o, PyObject *arg) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1561,7 +1563,9 @@ async_gen_asend_throw(PyAsyncGenASend *o, PyObject *args) PyObject *result; if (o->ags_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited __anext__()/asend()"); return NULL; } @@ -1795,7 +1799,9 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) if (f == NULL || f->f_stacktop == NULL || o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } @@ -1917,7 +1923,9 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) PyObject *retval; if (o->agt_state == AWAITABLE_STATE_CLOSED) { - PyErr_SetNone(PyExc_StopIteration); + PyErr_SetString( + PyExc_RuntimeError, + "cannot reuse already awaited aclose()/athrow()"); return NULL; } From 8d57a4182f0aa68e16d66dea31ba59e732612b4f Mon Sep 17 00:00:00 2001 From: Peter Bittner Date: Tue, 21 Jan 2020 00:22:56 +0100 Subject: [PATCH 161/380] bpo-39383: Mention Darwin as a potential value for platform.system() (GH-18054) --- Doc/library/platform.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 1d33afc7587..8e8e3775aaf 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -145,8 +145,8 @@ Cross Platform .. function:: system() - Returns the system/OS name, e.g. ``'Linux'``, ``'Windows'``, or ``'Java'``. An - empty string is returned if the value cannot be determined. + Returns the system/OS name, such as ``'Linux'``, ``'Darwin'``, ``'Java'``, + ``'Windows'``. An empty string is returned if the value cannot be determined. .. function:: system_alias(system, release, version) @@ -260,4 +260,3 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. - From 8698b34b68065b80bd9bd18b8decb425208fa386 Mon Sep 17 00:00:00 2001 From: Carl Friedrich Bolz-Tereick Date: Tue, 21 Jan 2020 01:41:17 +0100 Subject: [PATCH 162/380] improve the documentation of the LOAD_METHOD and CALL_METHOD (GH-18079) --- Doc/library/dis.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d3124f973f1..aef5c7e8bf2 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -1140,22 +1140,24 @@ All of the following opcodes use their arguments. .. opcode:: LOAD_METHOD (namei) - Loads a method named ``co_names[namei]`` from TOS object. TOS is popped and - method and TOS are pushed when interpreter can call unbound method directly. - TOS will be used as the first argument (``self``) by :opcode:`CALL_METHOD`. - Otherwise, ``NULL`` and method is pushed (method is bound method or - something else). + Loads a method named ``co_names[namei]`` from the TOS object. TOS is popped. + This bytecode distinguishes two cases: if TOS has a method with the correct + name, the bytecode pushes the unbound method and TOS. TOS will be used as + the first argument (``self``) by :opcode:`CALL_METHOD` when calling the + unbound method. Otherwise, ``NULL`` and the object return by the attribute + lookup are pushed. .. versionadded:: 3.7 .. opcode:: CALL_METHOD (argc) - Calls a method. *argc* is number of positional arguments. + Calls a method. *argc* is the number of positional arguments. Keyword arguments are not supported. This opcode is designed to be used with :opcode:`LOAD_METHOD`. Positional arguments are on top of the stack. - Below them, two items described in :opcode:`LOAD_METHOD` on the stack. - All of them are popped and return value is pushed. + Below them, the two items described in :opcode:`LOAD_METHOD` are on the + stack (either ``self`` and an unbound method object or ``NULL`` and an + arbitrary callable). All of them are popped and the return value is pushed. .. versionadded:: 3.7 From ec64640a2c5236d7a5d5470d759172a3d93eab0b Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Tue, 21 Jan 2020 05:11:26 -0500 Subject: [PATCH 163/380] bpo-32989: IDLE - fix bad editor call of pyparse method (GH-5968) Fix comments and add tests for editor newline_and_indent_event method. Remove unused None default for function parameter of pyparse find_good_parse_start method and code triggered by that default. Co-authored-by: Terry Jan Reedy --- Lib/idlelib/NEWS.txt | 3 + Lib/idlelib/editor.py | 55 +++++++---- Lib/idlelib/idle_test/test_editor.py | 99 +++++++++++++++++++ Lib/idlelib/idle_test/test_pyparse.py | 27 ++--- Lib/idlelib/pyparse.py | 7 +- .../2018-03-03-12-56-26.bpo-32989.FVhmhH.rst | 2 + 6 files changed, 154 insertions(+), 39 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index cbf55d9adef..9f8894e517b 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-32989: Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. + bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index 92dcf57c4ff..c9f1a1625ca 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -1342,38 +1342,51 @@ class EditorWindow(object): text.undo_block_stop() def newline_and_indent_event(self, event): + """Insert a newline and indentation after Enter keypress event. + + Properly position the cursor on the new line based on information + from the current line. This takes into account if the current line + is a shell prompt, is empty, has selected text, contains a block + opener, contains a block closer, is a continuation line, or + is inside a string. + """ text = self.text first, last = self.get_selection_indices() text.undo_block_start() - try: + try: # Close undo block and expose new line in finally clause. if first and last: text.delete(first, last) text.mark_set("insert", first) line = text.get("insert linestart", "insert") + + # Count leading whitespace for indent size. i, n = 0, len(line) while i < n and line[i] in " \t": - i = i+1 + i += 1 if i == n: - # the cursor is in or at leading indentation in a continuation - # line; just inject an empty line at the start + # The cursor is in or at leading indentation in a continuation + # line; just inject an empty line at the start. text.insert("insert linestart", '\n') return "break" indent = line[:i] - # strip whitespace before insert point unless it's in the prompt + + # Strip whitespace before insert point unless it's in the prompt. i = 0 while line and line[-1] in " \t" and line != self.prompt_last_line: line = line[:-1] - i = i+1 + i += 1 if i: text.delete("insert - %d chars" % i, "insert") - # strip whitespace after insert point + + # Strip whitespace after insert point. while text.get("insert") in " \t": text.delete("insert") - # start new line + + # Insert new line. text.insert("insert", '\n') - # adjust indentation for continuations and block - # open/close first need to find the last stmt + # Adjust indentation for continuations and block open/close. + # First need to find the last statement. lno = index2line(text.index('insert')) y = pyparse.Parser(self.indentwidth, self.tabwidth) if not self.prompt_last_line: @@ -1383,7 +1396,7 @@ class EditorWindow(object): rawtext = text.get(startatindex, "insert") y.set_code(rawtext) bod = y.find_good_parse_start( - self._build_char_in_string_func(startatindex)) + self._build_char_in_string_func(startatindex)) if bod is not None or startat == 1: break y.set_lo(bod or 0) @@ -1399,26 +1412,26 @@ class EditorWindow(object): c = y.get_continuation_type() if c != pyparse.C_NONE: - # The current stmt hasn't ended yet. + # The current statement hasn't ended yet. if c == pyparse.C_STRING_FIRST_LINE: - # after the first line of a string; do not indent at all + # After the first line of a string do not indent at all. pass elif c == pyparse.C_STRING_NEXT_LINES: - # inside a string which started before this line; - # just mimic the current indent + # Inside a string which started before this line; + # just mimic the current indent. text.insert("insert", indent) elif c == pyparse.C_BRACKET: - # line up with the first (if any) element of the + # Line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the - # last open bracket + # last open bracket. self.reindent_to(y.compute_bracket_indent()) elif c == pyparse.C_BACKSLASH: - # if more than one line in this stmt already, just + # If more than one line in this statement already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of - # non-whitespace on initial line + # non-whitespace on initial line. if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: @@ -1427,9 +1440,9 @@ class EditorWindow(object): assert 0, "bogus continuation type %r" % (c,) return "break" - # This line starts a brand new stmt; indent relative to + # This line starts a brand new statement; indent relative to # indentation of initial line of closest preceding - # interesting stmt. + # interesting statement. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py index 240db71747a..91e8ef89d1d 100644 --- a/Lib/idlelib/idle_test/test_editor.py +++ b/Lib/idlelib/idle_test/test_editor.py @@ -2,6 +2,7 @@ from idlelib import editor import unittest +from collections import namedtuple from test.support import requires from tkinter import Tk @@ -91,5 +92,103 @@ class TestGetLineIndent(unittest.TestCase): ) +class IndentAndNewlineTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.window = Editor(root=cls.root) + cls.window.indentwidth = 2 + cls.window.tabwidth = 2 + + @classmethod + def tearDownClass(cls): + cls.window._close() + del cls.window + cls.root.update_idletasks() + for id in cls.root.tk.call('after', 'info'): + cls.root.after_cancel(id) + cls.root.destroy() + del cls.root + + def insert(self, text): + t = self.window.text + t.delete('1.0', 'end') + t.insert('end', text) + # Force update for colorizer to finish. + t.update() + + def test_indent_and_newline_event(self): + eq = self.assertEqual + w = self.window + text = w.text + get = text.get + nl = w.newline_and_indent_event + + TestInfo = namedtuple('Tests', ['label', 'text', 'expected', 'mark']) + + tests = (TestInfo('Empty line inserts with no indent.', + ' \n def __init__(self):', + '\n \n def __init__(self):\n', + '1.end'), + TestInfo('Inside bracket before space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.14'), + TestInfo('Inside bracket after space, deletes space.', + ' def f1(self, a, b):', + ' def f1(self,\n a, b):\n', + '1.15'), + TestInfo('Inside string with one line - no indent.', + ' """Docstring."""', + ' """Docstring.\n"""\n', + '1.15'), + TestInfo('Inside string with more than one line.', + ' """Docstring.\n Docstring Line 2"""', + ' """Docstring.\n Docstring Line 2\n """\n', + '2.18'), + TestInfo('Backslash with one line.', + 'a =\\', + 'a =\\\n \n', + '1.end'), + TestInfo('Backslash with more than one line.', + 'a =\\\n multiline\\', + 'a =\\\n multiline\\\n \n', + '2.end'), + TestInfo('Block opener - indents +1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n \n pass\n', + '1.end'), + TestInfo('Block closer - dedents -1 level.', + ' def f1(self):\n pass', + ' def f1(self):\n pass\n \n', + '2.end'), + ) + + w.prompt_last_line = '' + for test in tests: + with self.subTest(label=test.label): + self.insert(test.text) + text.mark_set('insert', test.mark) + nl(event=None) + eq(get('1.0', 'end'), test.expected) + + # Selected text. + self.insert(' def f1(self, a, b):\n return a + b') + text.tag_add('sel', '1.17', '1.end') + nl(None) + # Deletes selected text before adding new line. + eq(get('1.0', 'end'), ' def f1(self, a,\n \n return a + b\n') + + # Preserves the whitespace in shell prompt. + w.prompt_last_line = '>>> ' + self.insert('>>> \t\ta =') + text.mark_set('insert', '1.5') + nl(None) + eq(get('1.0', 'end'), '>>> \na =\n') + + if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Lib/idlelib/idle_test/test_pyparse.py b/Lib/idlelib/idle_test/test_pyparse.py index f7154e6ded9..a2b13c38d80 100644 --- a/Lib/idlelib/idle_test/test_pyparse.py +++ b/Lib/idlelib/idle_test/test_pyparse.py @@ -18,7 +18,7 @@ class ParseMapTest(unittest.TestCase): # trans is the production instance of ParseMap, used in _study1 parser = pyparse.Parser(4, 4) self.assertEqual('\t a([{b}])b"c\'d\n'.translate(pyparse.trans), - 'xxx(((x)))x"x\'x\n') + 'xxx(((x)))x"x\'x\n') class PyParseTest(unittest.TestCase): @@ -61,14 +61,17 @@ class PyParseTest(unittest.TestCase): # Split def across lines. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a,\n' - ' b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a,\n' + ' b=True):\n' + ' pass\n' + ) - # No value sent for is_char_in_string(). - self.assertIsNone(start()) + # Passing no value or non-callable should fail (issue 32989). + with self.assertRaises(TypeError): + start() + with self.assertRaises(TypeError): + start(False) # Make text look like a string. This returns pos as the start # position, but it's set to None. @@ -91,10 +94,10 @@ class PyParseTest(unittest.TestCase): # Code without extra line break in def line - mostly returns the same # values. setcode('"""This is a module docstring"""\n' - 'class C():\n' - ' def __init__(self, a, b=True):\n' - ' pass\n' - ) + 'class C():\n' + ' def __init__(self, a, b=True):\n' + ' pass\n' + ) eq(start(is_char_in_string=lambda index: False), 44) eq(start(is_char_in_string=lambda index: index > 44), 44) eq(start(is_char_in_string=lambda index: index >= 44), 33) diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index feb57cbb740..9fa20108960 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,8 +133,7 @@ class Parser: self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string=None, - _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some @@ -149,10 +148,6 @@ class Parser: """ code, pos = self.code, None - if not is_char_in_string: - # no clue -- make the caller pass everything - return None - # Peek back from the end for a good place to start, # but don't try too often; pos will be left None, or # bumped to a legitimate synch point. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst new file mode 100644 index 00000000000..38f0fb6e104 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst @@ -0,0 +1,2 @@ +Add tests for editor newline_and_indent_event method. +Remove dead code from pyparse find_good_parse_start method. From 85ead4fc62829cb7ef2eb0af1a2933282f58c629 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 21 Jan 2020 11:14:10 +0100 Subject: [PATCH 164/380] bpo-39396: Fix math.nextafter(-0.0, +0.0) on AIX 7.1 (GH-18094) Move also math.nextafter() on math.ulp() tests from IsCloseTests to MathTests. --- Lib/test/test_math.py | 154 +++++++++--------- .../2020-01-21-09-00-42.bpo-39396.6UXQXE.rst | 1 + Modules/mathmodule.c | 10 +- 3 files changed, 86 insertions(+), 79 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 6d10227a0c1..e96fd745970 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1752,6 +1752,83 @@ class MathTests(unittest.TestCase): if not math.isnan(value): self.fail("Expected a NaN, got {!r}.".format(value)) + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign. + + Function useful to compare signed zeros. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + + @requires_IEEE_754 + def test_nextafter(self): + # around 2^52 and 2^63 + self.assertEqual(math.nextafter(4503599627370496.0, -INF), + 4503599627370495.5) + self.assertEqual(math.nextafter(4503599627370496.0, INF), + 4503599627370497.0) + self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), + 9223372036854774784.0) + self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), + -9223372036854774784.0) + + # around 1.0 + self.assertEqual(math.nextafter(1.0, -INF), + float.fromhex('0x1.fffffffffffffp-1')) + self.assertEqual(math.nextafter(1.0, INF), + float.fromhex('0x1.0000000000001p+0')) + + # x == y: y is returned + self.assertEqual(math.nextafter(2.0, 2.0), 2.0) + self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) + self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) + + # around 0.0 + smallest_subnormal = sys.float_info.min * sys.float_info.epsilon + self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) + self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) + self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) + + # around infinity + largest_normal = sys.float_info.max + self.assertEqual(math.nextafter(INF, 0.0), largest_normal) + self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) + self.assertEqual(math.nextafter(largest_normal, INF), INF) + self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) + + # NaN + self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) + self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) + self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) + + @requires_IEEE_754 + def test_ulp(self): + self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) + # use int ** int rather than float ** int to not rely on pow() accuracy + self.assertEqual(math.ulp(2 ** 52), 1.0) + self.assertEqual(math.ulp(2 ** 53), 2.0) + self.assertEqual(math.ulp(2 ** 64), 4096.0) + + # min and max + self.assertEqual(math.ulp(0.0), + sys.float_info.min * sys.float_info.epsilon) + self.assertEqual(math.ulp(FLOAT_MAX), + FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) + + # special cases + self.assertEqual(math.ulp(INF), INF) + self.assertTrue(math.isnan(math.ulp(math.nan))) + + # negative number: ulp(-x) == ulp(x) + for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): + with self.subTest(x=x): + self.assertEqual(math.ulp(-x), math.ulp(x)) + class IsCloseTests(unittest.TestCase): isclose = math.isclose # subclasses should override this @@ -2009,83 +2086,6 @@ class IsCloseTests(unittest.TestCase): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) - def assertEqualSign(self, x, y): - """Similar to assertEqual(), but compare also the sign. - - Function useful to compare signed zeros. - """ - self.assertEqual(x, y) - self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) - - @requires_IEEE_754 - def test_nextafter(self): - # around 2^52 and 2^63 - self.assertEqual(math.nextafter(4503599627370496.0, -INF), - 4503599627370495.5) - self.assertEqual(math.nextafter(4503599627370496.0, INF), - 4503599627370497.0) - self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), - 9223372036854774784.0) - self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), - -9223372036854774784.0) - - # around 1.0 - self.assertEqual(math.nextafter(1.0, -INF), - float.fromhex('0x1.fffffffffffffp-1')) - self.assertEqual(math.nextafter(1.0, INF), - float.fromhex('0x1.0000000000001p+0')) - - # x == y: y is returned - self.assertEqual(math.nextafter(2.0, 2.0), 2.0) - self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) - self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) - - # around 0.0 - smallest_subnormal = sys.float_info.min * sys.float_info.epsilon - self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) - self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) - self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) - - # around infinity - largest_normal = sys.float_info.max - self.assertEqual(math.nextafter(INF, 0.0), largest_normal) - self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) - self.assertEqual(math.nextafter(largest_normal, INF), INF) - self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) - - # NaN - self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) - self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) - self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) - - @requires_IEEE_754 - def test_ulp(self): - self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) - # use int ** int rather than float ** int to not rely on pow() accuracy - self.assertEqual(math.ulp(2 ** 52), 1.0) - self.assertEqual(math.ulp(2 ** 53), 2.0) - self.assertEqual(math.ulp(2 ** 64), 4096.0) - - # min and max - self.assertEqual(math.ulp(0.0), - sys.float_info.min * sys.float_info.epsilon) - self.assertEqual(math.ulp(FLOAT_MAX), - FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) - - # special cases - self.assertEqual(math.ulp(INF), INF) - self.assertTrue(math.isnan(math.ulp(math.nan))) - - # negative number: ulp(-x) == ulp(x) - for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): - with self.subTest(x=x): - self.assertEqual(math.ulp(-x), math.ulp(x)) - def test_main(): from doctest import DocFileSuite diff --git a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst new file mode 100644 index 00000000000..af7076854a5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst @@ -0,0 +1 @@ +Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 81d871786f1..f012b51d866 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -3287,8 +3287,14 @@ static PyObject * math_nextafter_impl(PyObject *module, double x, double y) /*[clinic end generated code: output=750c8266c1c540ce input=02b2d50cd1d9f9b6]*/ { - double f = nextafter(x, y); - return PyFloat_FromDouble(f); +#if defined(_AIX) + if (x == y) { + /* On AIX 7.1, libm nextafter(-0.0, +0.0) returns -0.0. + Bug fixed in bos.adt.libm 7.2.2.0 by APAR IV95512. */ + return PyFloat_FromDouble(y); + } +#endif + return PyFloat_FromDouble(nextafter(x, y)); } From eab3b3f1c60afecfb4db3c3619109684cb04bd60 Mon Sep 17 00:00:00 2001 From: William Chargin Date: Tue, 21 Jan 2020 03:25:24 -0800 Subject: [PATCH 165/380] bpo-39389: gzip: fix compression level metadata (GH-18077) As described in RFC 1952, section 2.3.1, the XFL (eXtra FLags) byte of a gzip member header should indicate whether the DEFLATE algorithm was tuned for speed or compression ratio. Prior to this patch, archives emitted by the `gzip` module always indicated maximum compression. --- Lib/gzip.py | 12 ++++++++--- Lib/test/test_gzip.py | 20 +++++++++++++++++++ .../2020-01-20-00-56-01.bpo-39389.fEirIS.rst | 2 ++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst diff --git a/Lib/gzip.py b/Lib/gzip.py index e60d8ad5995..e422773b3ed 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -209,7 +209,7 @@ class GzipFile(_compression.BaseStream): self.fileobj = fileobj if self.mode == WRITE: - self._write_gzip_header() + self._write_gzip_header(compresslevel) @property def filename(self): @@ -236,7 +236,7 @@ class GzipFile(_compression.BaseStream): self.bufsize = 0 self.offset = 0 # Current file offset for seek(), tell(), etc - def _write_gzip_header(self): + def _write_gzip_header(self, compresslevel): self.fileobj.write(b'\037\213') # magic header self.fileobj.write(b'\010') # compression method try: @@ -257,7 +257,13 @@ class GzipFile(_compression.BaseStream): if mtime is None: mtime = time.time() write32u(self.fileobj, int(mtime)) - self.fileobj.write(b'\002') + if compresslevel == _COMPRESS_LEVEL_BEST: + xfl = b'\002' + elif compresslevel == _COMPRESS_LEVEL_FAST: + xfl = b'\004' + else: + xfl = b'\000' + self.fileobj.write(xfl) self.fileobj.write(b'\377') if fname: self.fileobj.write(fname + b'\000') diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 57d851cf9cf..78334213f24 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -358,6 +358,26 @@ class TestGzip(BaseTest): isizeBytes = fRead.read(4) self.assertEqual(isizeBytes, struct.pack(' Date: Tue, 21 Jan 2020 12:47:29 +0100 Subject: [PATCH 166/380] bpo-33387: Fix compiler warning in frame_block_unwind() (GH-18099) Replace int with intptr_t to fix the warning: objects\frameobject.c(341): warning C4244: 'initializing': conversion from '__int64' to 'int', possible loss of data --- Objects/frameobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index d7acb41f7a3..4469e3c20cd 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -338,7 +338,7 @@ frame_block_unwind(PyFrameObject *f) assert(f->f_iblock > 0); f->f_iblock--; PyTryBlock *b = &f->f_blockstack[f->f_iblock]; - int delta = (f->f_stacktop - f->f_valuestack) - b->b_level; + intptr_t delta = (f->f_stacktop - f->f_valuestack) - b->b_level; while (delta > 0) { frame_stack_pop(f); delta--; From 59e2d26b258c12f18d8d2e789ef741703d6c52d5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 21 Jan 2020 12:48:16 +0100 Subject: [PATCH 167/380] Move test_math tests (GH-18098) testPerm() and testComb() belong to MathTests, not to IsCloseTests(). test_nextafter() and test_ulp() now use assertIsNaN(). --- Lib/test/test_math.py | 412 +++++++++++++++++++++--------------------- 1 file changed, 206 insertions(+), 206 deletions(-) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index e96fd745970..b3301f6a5cf 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -1746,212 +1746,6 @@ class MathTests(unittest.TestCase): self.assertEqual(type(prod([1, decimal.Decimal(2.0), 3, 4, 5, 6])), decimal.Decimal) - # Custom assertions. - - def assertIsNaN(self, value): - if not math.isnan(value): - self.fail("Expected a NaN, got {!r}.".format(value)) - - def assertEqualSign(self, x, y): - """Similar to assertEqual(), but compare also the sign. - - Function useful to compare signed zeros. - """ - self.assertEqual(x, y) - self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) - - @requires_IEEE_754 - def test_nextafter(self): - # around 2^52 and 2^63 - self.assertEqual(math.nextafter(4503599627370496.0, -INF), - 4503599627370495.5) - self.assertEqual(math.nextafter(4503599627370496.0, INF), - 4503599627370497.0) - self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), - 9223372036854774784.0) - self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), - -9223372036854774784.0) - - # around 1.0 - self.assertEqual(math.nextafter(1.0, -INF), - float.fromhex('0x1.fffffffffffffp-1')) - self.assertEqual(math.nextafter(1.0, INF), - float.fromhex('0x1.0000000000001p+0')) - - # x == y: y is returned - self.assertEqual(math.nextafter(2.0, 2.0), 2.0) - self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) - self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) - - # around 0.0 - smallest_subnormal = sys.float_info.min * sys.float_info.epsilon - self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) - self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) - self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) - self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) - self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) - self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) - - # around infinity - largest_normal = sys.float_info.max - self.assertEqual(math.nextafter(INF, 0.0), largest_normal) - self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) - self.assertEqual(math.nextafter(largest_normal, INF), INF) - self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) - - # NaN - self.assertTrue(math.isnan(math.nextafter(NAN, 1.0))) - self.assertTrue(math.isnan(math.nextafter(1.0, NAN))) - self.assertTrue(math.isnan(math.nextafter(NAN, NAN))) - - @requires_IEEE_754 - def test_ulp(self): - self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) - # use int ** int rather than float ** int to not rely on pow() accuracy - self.assertEqual(math.ulp(2 ** 52), 1.0) - self.assertEqual(math.ulp(2 ** 53), 2.0) - self.assertEqual(math.ulp(2 ** 64), 4096.0) - - # min and max - self.assertEqual(math.ulp(0.0), - sys.float_info.min * sys.float_info.epsilon) - self.assertEqual(math.ulp(FLOAT_MAX), - FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) - - # special cases - self.assertEqual(math.ulp(INF), INF) - self.assertTrue(math.isnan(math.ulp(math.nan))) - - # negative number: ulp(-x) == ulp(x) - for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): - with self.subTest(x=x): - self.assertEqual(math.ulp(-x), math.ulp(x)) - - -class IsCloseTests(unittest.TestCase): - isclose = math.isclose # subclasses should override this - - def assertIsClose(self, a, b, *args, **kwargs): - self.assertTrue(self.isclose(a, b, *args, **kwargs), - msg="%s and %s should be close!" % (a, b)) - - def assertIsNotClose(self, a, b, *args, **kwargs): - self.assertFalse(self.isclose(a, b, *args, **kwargs), - msg="%s and %s should not be close!" % (a, b)) - - def assertAllClose(self, examples, *args, **kwargs): - for a, b in examples: - self.assertIsClose(a, b, *args, **kwargs) - - def assertAllNotClose(self, examples, *args, **kwargs): - for a, b in examples: - self.assertIsNotClose(a, b, *args, **kwargs) - - def test_negative_tolerances(self): - # ValueError should be raised if either tolerance is less than zero - with self.assertRaises(ValueError): - self.assertIsClose(1, 1, rel_tol=-1e-100) - with self.assertRaises(ValueError): - self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10) - - def test_identical(self): - # identical values must test as close - identical_examples = [(2.0, 2.0), - (0.1e200, 0.1e200), - (1.123e-300, 1.123e-300), - (12345, 12345.0), - (0.0, -0.0), - (345678, 345678)] - self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0) - - def test_eight_decimal_places(self): - # examples that are close to 1e-8, but not 1e-9 - eight_decimal_places_examples = [(1e8, 1e8 + 1), - (-1e-8, -1.000000009e-8), - (1.12345678, 1.12345679)] - self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8) - self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9) - - def test_near_zero(self): - # values close to zero - near_zero_examples = [(1e-9, 0.0), - (-1e-9, 0.0), - (-1e-150, 0.0)] - # these should not be close to any rel_tol - self.assertAllNotClose(near_zero_examples, rel_tol=0.9) - # these should be close to abs_tol=1e-8 - self.assertAllClose(near_zero_examples, abs_tol=1e-8) - - def test_identical_infinite(self): - # these are close regardless of tolerance -- i.e. they are equal - self.assertIsClose(INF, INF) - self.assertIsClose(INF, INF, abs_tol=0.0) - self.assertIsClose(NINF, NINF) - self.assertIsClose(NINF, NINF, abs_tol=0.0) - - def test_inf_ninf_nan(self): - # these should never be close (following IEEE 754 rules for equality) - not_close_examples = [(NAN, NAN), - (NAN, 1e-100), - (1e-100, NAN), - (INF, NAN), - (NAN, INF), - (INF, NINF), - (INF, 1.0), - (1.0, INF), - (INF, 1e308), - (1e308, INF)] - # use largest reasonable tolerance - self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999) - - def test_zero_tolerance(self): - # test with zero tolerance - zero_tolerance_close_examples = [(1.0, 1.0), - (-3.4, -3.4), - (-1e-300, -1e-300)] - self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0) - - zero_tolerance_not_close_examples = [(1.0, 1.000000000000001), - (0.99999999999999, 1.0), - (1.0e200, .999999999999999e200)] - self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0) - - def test_asymmetry(self): - # test the asymmetry example from PEP 485 - self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1) - - def test_integers(self): - # test with integer values - integer_examples = [(100000001, 100000000), - (123456789, 123456788)] - - self.assertAllClose(integer_examples, rel_tol=1e-8) - self.assertAllNotClose(integer_examples, rel_tol=1e-9) - - def test_decimals(self): - # test with Decimal values - from decimal import Decimal - - decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')), - (Decimal('1.00000001e-20'), Decimal('1.0e-20')), - (Decimal('1.00000001e-100'), Decimal('1.0e-100')), - (Decimal('1.00000001e20'), Decimal('1.0e20'))] - self.assertAllClose(decimal_examples, rel_tol=1e-8) - self.assertAllNotClose(decimal_examples, rel_tol=1e-9) - - def test_fractions(self): - # test with Fraction values - from fractions import Fraction - - fraction_examples = [ - (Fraction(1, 100000000) + 1, Fraction(1)), - (Fraction(100000001), Fraction(100000000)), - (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))] - self.assertAllClose(fraction_examples, rel_tol=1e-8) - self.assertAllNotClose(fraction_examples, rel_tol=1e-9) - def testPerm(self): perm = math.perm factorial = math.factorial @@ -2086,6 +1880,212 @@ class IsCloseTests(unittest.TestCase): self.assertIs(type(comb(IntSubclass(5), IntSubclass(k))), int) self.assertIs(type(comb(MyIndexable(5), MyIndexable(k))), int) + @requires_IEEE_754 + def test_nextafter(self): + # around 2^52 and 2^63 + self.assertEqual(math.nextafter(4503599627370496.0, -INF), + 4503599627370495.5) + self.assertEqual(math.nextafter(4503599627370496.0, INF), + 4503599627370497.0) + self.assertEqual(math.nextafter(9223372036854775808.0, 0.0), + 9223372036854774784.0) + self.assertEqual(math.nextafter(-9223372036854775808.0, 0.0), + -9223372036854774784.0) + + # around 1.0 + self.assertEqual(math.nextafter(1.0, -INF), + float.fromhex('0x1.fffffffffffffp-1')) + self.assertEqual(math.nextafter(1.0, INF), + float.fromhex('0x1.0000000000001p+0')) + + # x == y: y is returned + self.assertEqual(math.nextafter(2.0, 2.0), 2.0) + self.assertEqualSign(math.nextafter(-0.0, +0.0), +0.0) + self.assertEqualSign(math.nextafter(+0.0, -0.0), -0.0) + + # around 0.0 + smallest_subnormal = sys.float_info.min * sys.float_info.epsilon + self.assertEqual(math.nextafter(+0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, INF), smallest_subnormal) + self.assertEqual(math.nextafter(+0.0, -INF), -smallest_subnormal) + self.assertEqual(math.nextafter(-0.0, -INF), -smallest_subnormal) + self.assertEqualSign(math.nextafter(smallest_subnormal, +0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, +0.0), -0.0) + self.assertEqualSign(math.nextafter(smallest_subnormal, -0.0), +0.0) + self.assertEqualSign(math.nextafter(-smallest_subnormal, -0.0), -0.0) + + # around infinity + largest_normal = sys.float_info.max + self.assertEqual(math.nextafter(INF, 0.0), largest_normal) + self.assertEqual(math.nextafter(-INF, 0.0), -largest_normal) + self.assertEqual(math.nextafter(largest_normal, INF), INF) + self.assertEqual(math.nextafter(-largest_normal, -INF), -INF) + + # NaN + self.assertIsNaN(math.nextafter(NAN, 1.0)) + self.assertIsNaN(math.nextafter(1.0, NAN)) + self.assertIsNaN(math.nextafter(NAN, NAN)) + + @requires_IEEE_754 + def test_ulp(self): + self.assertEqual(math.ulp(1.0), sys.float_info.epsilon) + # use int ** int rather than float ** int to not rely on pow() accuracy + self.assertEqual(math.ulp(2 ** 52), 1.0) + self.assertEqual(math.ulp(2 ** 53), 2.0) + self.assertEqual(math.ulp(2 ** 64), 4096.0) + + # min and max + self.assertEqual(math.ulp(0.0), + sys.float_info.min * sys.float_info.epsilon) + self.assertEqual(math.ulp(FLOAT_MAX), + FLOAT_MAX - math.nextafter(FLOAT_MAX, -INF)) + + # special cases + self.assertEqual(math.ulp(INF), INF) + self.assertIsNaN(math.ulp(math.nan)) + + # negative number: ulp(-x) == ulp(x) + for x in (0.0, 1.0, 2 ** 52, 2 ** 64, INF): + with self.subTest(x=x): + self.assertEqual(math.ulp(-x), math.ulp(x)) + + # Custom assertions. + + def assertIsNaN(self, value): + if not math.isnan(value): + self.fail("Expected a NaN, got {!r}.".format(value)) + + def assertEqualSign(self, x, y): + """Similar to assertEqual(), but compare also the sign with copysign(). + + Function useful to compare signed zeros. + """ + self.assertEqual(x, y) + self.assertEqual(math.copysign(1.0, x), math.copysign(1.0, y)) + + +class IsCloseTests(unittest.TestCase): + isclose = math.isclose # subclasses should override this + + def assertIsClose(self, a, b, *args, **kwargs): + self.assertTrue(self.isclose(a, b, *args, **kwargs), + msg="%s and %s should be close!" % (a, b)) + + def assertIsNotClose(self, a, b, *args, **kwargs): + self.assertFalse(self.isclose(a, b, *args, **kwargs), + msg="%s and %s should not be close!" % (a, b)) + + def assertAllClose(self, examples, *args, **kwargs): + for a, b in examples: + self.assertIsClose(a, b, *args, **kwargs) + + def assertAllNotClose(self, examples, *args, **kwargs): + for a, b in examples: + self.assertIsNotClose(a, b, *args, **kwargs) + + def test_negative_tolerances(self): + # ValueError should be raised if either tolerance is less than zero + with self.assertRaises(ValueError): + self.assertIsClose(1, 1, rel_tol=-1e-100) + with self.assertRaises(ValueError): + self.assertIsClose(1, 1, rel_tol=1e-100, abs_tol=-1e10) + + def test_identical(self): + # identical values must test as close + identical_examples = [(2.0, 2.0), + (0.1e200, 0.1e200), + (1.123e-300, 1.123e-300), + (12345, 12345.0), + (0.0, -0.0), + (345678, 345678)] + self.assertAllClose(identical_examples, rel_tol=0.0, abs_tol=0.0) + + def test_eight_decimal_places(self): + # examples that are close to 1e-8, but not 1e-9 + eight_decimal_places_examples = [(1e8, 1e8 + 1), + (-1e-8, -1.000000009e-8), + (1.12345678, 1.12345679)] + self.assertAllClose(eight_decimal_places_examples, rel_tol=1e-8) + self.assertAllNotClose(eight_decimal_places_examples, rel_tol=1e-9) + + def test_near_zero(self): + # values close to zero + near_zero_examples = [(1e-9, 0.0), + (-1e-9, 0.0), + (-1e-150, 0.0)] + # these should not be close to any rel_tol + self.assertAllNotClose(near_zero_examples, rel_tol=0.9) + # these should be close to abs_tol=1e-8 + self.assertAllClose(near_zero_examples, abs_tol=1e-8) + + def test_identical_infinite(self): + # these are close regardless of tolerance -- i.e. they are equal + self.assertIsClose(INF, INF) + self.assertIsClose(INF, INF, abs_tol=0.0) + self.assertIsClose(NINF, NINF) + self.assertIsClose(NINF, NINF, abs_tol=0.0) + + def test_inf_ninf_nan(self): + # these should never be close (following IEEE 754 rules for equality) + not_close_examples = [(NAN, NAN), + (NAN, 1e-100), + (1e-100, NAN), + (INF, NAN), + (NAN, INF), + (INF, NINF), + (INF, 1.0), + (1.0, INF), + (INF, 1e308), + (1e308, INF)] + # use largest reasonable tolerance + self.assertAllNotClose(not_close_examples, abs_tol=0.999999999999999) + + def test_zero_tolerance(self): + # test with zero tolerance + zero_tolerance_close_examples = [(1.0, 1.0), + (-3.4, -3.4), + (-1e-300, -1e-300)] + self.assertAllClose(zero_tolerance_close_examples, rel_tol=0.0) + + zero_tolerance_not_close_examples = [(1.0, 1.000000000000001), + (0.99999999999999, 1.0), + (1.0e200, .999999999999999e200)] + self.assertAllNotClose(zero_tolerance_not_close_examples, rel_tol=0.0) + + def test_asymmetry(self): + # test the asymmetry example from PEP 485 + self.assertAllClose([(9, 10), (10, 9)], rel_tol=0.1) + + def test_integers(self): + # test with integer values + integer_examples = [(100000001, 100000000), + (123456789, 123456788)] + + self.assertAllClose(integer_examples, rel_tol=1e-8) + self.assertAllNotClose(integer_examples, rel_tol=1e-9) + + def test_decimals(self): + # test with Decimal values + from decimal import Decimal + + decimal_examples = [(Decimal('1.00000001'), Decimal('1.0')), + (Decimal('1.00000001e-20'), Decimal('1.0e-20')), + (Decimal('1.00000001e-100'), Decimal('1.0e-100')), + (Decimal('1.00000001e20'), Decimal('1.0e20'))] + self.assertAllClose(decimal_examples, rel_tol=1e-8) + self.assertAllNotClose(decimal_examples, rel_tol=1e-9) + + def test_fractions(self): + # test with Fraction values + from fractions import Fraction + + fraction_examples = [ + (Fraction(1, 100000000) + 1, Fraction(1)), + (Fraction(100000001), Fraction(100000000)), + (Fraction(10**8 + 1, 10**28), Fraction(1, 10**20))] + self.assertAllClose(fraction_examples, rel_tol=1e-8) + self.assertAllNotClose(fraction_examples, rel_tol=1e-9) + def test_main(): from doctest import DocFileSuite From 56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 21 Jan 2020 16:13:09 +0100 Subject: [PATCH 168/380] bpo-39413: Implement os.unsetenv() on Windows (GH-18104) The os.unsetenv() function is now also available on Windows. It is implemented with SetEnvironmentVariableW(name, NULL). --- Doc/library/os.rst | 3 ++ Doc/whatsnew/3.9.rst | 3 ++ Lib/test/test_os.py | 11 ++--- .../2020-01-21-15-48-35.bpo-39413.7XYDM8.rst | 1 + Modules/clinic/posixmodule.c.h | 42 ++++++++++++++++-- Modules/posixmodule.c | 44 ++++++++++++++++++- 6 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4fec647828e..de3e5603e10 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,6 +645,9 @@ process and user. .. availability:: most flavors of Unix, Windows. + .. versionchanged:: 3.9 + The function is now also available on Windows. + .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f40685c9327..ab27c488ea3 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -216,6 +216,9 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 82c441c2048..50535da0a2b 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -956,14 +956,9 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) def test_unset_error(self): - if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # "=" is not allowed in a variable name + key = 'key=' + self.assertRaises(OSError, os.environ.__delitem__, key) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst new file mode 100644 index 00000000000..a185ab5efe2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst @@ -0,0 +1 @@ +The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index aa4756a620a..661d91afb7e 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,7 +6125,43 @@ exit: #endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6157,7 +6193,7 @@ exit: return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8773,4 +8809,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 322c2159812..d2047d9c2ac 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10163,7 +10163,49 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* HAVE_PUTENV */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL); + if (name_str == NULL) { + return NULL; + } + + BOOL ok = SetEnvironmentVariableW(name_str, NULL); + PyMem_Free(name_str); + + if (!ok) { + return PyErr_SetFromWindowsErr(0); + } + + /* Remove the key from posix_putenv_garbage; + * this will cause it to be collected. This has to + * happen after the real unsetenv() call because the + * old value was still accessible until then. + */ + if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + /* really not much we can do; just leak */ + if (!PyErr_ExceptionMatches(PyExc_KeyError)) { + return NULL; + } + PyErr_Clear(); + } + + Py_RETURN_NONE; +} +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) /*[clinic input] os.unsetenv name: FSConverter From 623ed6171eae35af7fd2e804dfd9c832c05c5d48 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 21 Jan 2020 19:25:32 +0100 Subject: [PATCH 169/380] bpo-39406: Add PY_PUTENV_DICT macro to posixmodule.c (GH-18106) Rename posix_putenv_garbage to putenv_dict. --- Modules/posixmodule.c | 52 ++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index d2047d9c2ac..5a0c8a311a7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,9 +819,19 @@ dir_fd_converter(PyObject *o, void *p) } } +#ifdef HAVE_PUTENV +# define PY_PUTENV_DICT +#endif + typedef struct { PyObject *billion; - PyObject *posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* putenv() and _wputenv() requires that the caller manages the environment + variable memory. Use a Python dictionary for that: name => env, where + env is a string like "name=value". On Windows, dict keys and values are + Unicode strings. On Unix, they are bytes strings. */ + PyObject *putenv_dict; +#endif PyObject *DirEntryType; PyObject *ScandirIteratorType; #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2105,7 +2115,9 @@ static int _posix_clear(PyObject *module) { Py_CLEAR(_posixstate(module)->billion); - Py_CLEAR(_posixstate(module)->posix_putenv_garbage); +#ifdef PY_PUTENV_DICT + Py_CLEAR(_posixstate(module)->putenv_dict); +#endif Py_CLEAR(_posixstate(module)->DirEntryType); Py_CLEAR(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2130,7 +2142,9 @@ static int _posix_traverse(PyObject *module, visitproc visit, void *arg) { Py_VISIT(_posixstate(module)->billion); - Py_VISIT(_posixstate(module)->posix_putenv_garbage); +#ifdef PY_PUTENV_DICT + Py_VISIT(_posixstate(module)->putenv_dict); +#endif Py_VISIT(_posixstate(module)->DirEntryType); Py_VISIT(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -10047,23 +10061,26 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, } #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef HAVE_PUTENV +#ifdef PY_PUTENV_DICT static void -posix_putenv_garbage_setitem(PyObject *name, PyObject *value) +posix_putenv_dict_setitem(PyObject *name, PyObject *value) { - /* Install the first arg and newstr in posix_putenv_garbage; + /* Install the first arg and newstr in putenv_dict; * this will cause previous value to be collected. This has to * happen after the real putenv() call because the old value * was still accessible until then. */ - if (PyDict_SetItem(_posixstate_global->posix_putenv_garbage, name, value)) + if (PyDict_SetItem(_posixstate_global->putenv_dict, name, value)) /* really not much we can do; just leak */ PyErr_Clear(); else Py_DECREF(value); } +#endif /* PY_PUTENV_DICT */ +#ifdef HAVE_PUTENV + #ifdef MS_WINDOWS /*[clinic input] os.putenv @@ -10114,7 +10131,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) goto error; } - posix_putenv_garbage_setitem(name, unicode); + posix_putenv_dict_setitem(name, unicode); Py_RETURN_NONE; error: @@ -10156,7 +10173,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) return posix_error(); } - posix_putenv_garbage_setitem(name, bytes); + posix_putenv_dict_setitem(name, bytes); Py_RETURN_NONE; } #endif /* MS_WINDOWS */ @@ -10189,18 +10206,20 @@ os_unsetenv_impl(PyObject *module, PyObject *name) return PyErr_SetFromWindowsErr(0); } - /* Remove the key from posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* Remove the key from putenv_dict; * this will cause it to be collected. This has to * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { /* really not much we can do; just leak */ if (!PyErr_ExceptionMatches(PyExc_KeyError)) { return NULL; } PyErr_Clear(); } +#endif Py_RETURN_NONE; } @@ -10230,18 +10249,21 @@ os_unsetenv_impl(PyObject *module, PyObject *name) return posix_error(); #endif - /* Remove the key from posix_putenv_garbage; +#ifdef PY_PUTENV_DICT + /* Remove the key from putenv_dict; * this will cause it to be collected. This has to * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(_posixstate(module)->posix_putenv_garbage, name)) { + if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { /* really not much we can do; just leak */ if (!PyErr_ExceptionMatches(PyExc_KeyError)) { return NULL; } PyErr_Clear(); } +#endif + Py_RETURN_NONE; } #endif /* HAVE_UNSETENV */ @@ -14538,10 +14560,10 @@ INITFUNC(void) Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef HAVE_PUTENV +#ifdef PY_PUTENV_DICT /* Save putenv() parameters as values here, so we can collect them when they * get re-set with another call for the same key. */ - _posixstate(m)->posix_putenv_garbage = PyDict_New(); + _posixstate(m)->putenv_dict = PyDict_New(); #endif #if defined(HAVE_WAITID) && !defined(__APPLE__) From 47be7d0108b4021ede111dbd15a095c725be46b7 Mon Sep 17 00:00:00 2001 From: Keith Erskine Date: Tue, 21 Jan 2020 13:14:13 -0600 Subject: [PATCH 170/380] PyLong_AsLongLong() docs should say 'long long' (#18082) --- Doc/c-api/long.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index c3601045920..c5c2aa60dcc 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -177,7 +177,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :c:type:`PyLongObject`. Raise :exc:`OverflowError` if the value of *obj* is out of range for a - :c:type:`long`. + :c:type:`long long`. Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. From 0d5eac8c327251f8edde5261cee43975d81311f6 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 22 Jan 2020 11:49:30 +0900 Subject: [PATCH 171/380] closes bpo-39415: Remove unused codes from longobject.c complexobject.c floatobject.c. (GH-18105) --- Objects/complexobject.c | 20 -------------------- Objects/floatobject.c | 37 ------------------------------------- Objects/longobject.c | 11 ----------- 3 files changed, 68 deletions(-) diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 367752db78f..f1b76673efd 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -731,29 +731,9 @@ complex__format__(PyObject* self, PyObject* args) return _PyUnicodeWriter_Finish(&writer); } -#if 0 -static PyObject * -complex_is_finite(PyObject *self) -{ - Py_complex c; - c = ((PyComplexObject *)self)->cval; - return PyBool_FromLong((long)(Py_IS_FINITE(c.real) && - Py_IS_FINITE(c.imag))); -} - -PyDoc_STRVAR(complex_is_finite_doc, -"complex.is_finite() -> bool\n" -"\n" -"Returns True if the real and the imaginary part is finite."); -#endif - static PyMethodDef complex_methods[] = { {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS, complex_conjugate_doc}, -#if 0 - {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS, - complex_is_finite_doc}, -#endif {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS}, {"__format__", (PyCFunction)complex__format__, METH_VARARGS, complex__format__doc}, diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 4fc412b43f7..d67f17abb5c 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -843,35 +843,6 @@ float_is_integer_impl(PyObject *self) return o; } -#if 0 -static PyObject * -float_is_inf(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_INFINITY(x)); -} - -static PyObject * -float_is_nan(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_NAN(x)); -} - -static PyObject * -float_is_finite(PyObject *v) -{ - double x = PyFloat_AsDouble(v); - if (x == -1.0 && PyErr_Occurred()) - return NULL; - return PyBool_FromLong((long)Py_IS_FINITE(x)); -} -#endif - /*[clinic input] float.__trunc__ @@ -1863,14 +1834,6 @@ static PyMethodDef float_methods[] = { FLOAT_FROMHEX_METHODDEF FLOAT_HEX_METHODDEF FLOAT_IS_INTEGER_METHODDEF -#if 0 - {"is_inf", (PyCFunction)float_is_inf, METH_NOARGS, - "Return True if the float is positive or negative infinite."}, - {"is_finite", (PyCFunction)float_is_finite, METH_NOARGS, - "Return True if the float is finite, neither infinite nor NaN."}, - {"is_nan", (PyCFunction)float_is_nan, METH_NOARGS, - "Return True if the float is not a number (NaN)."}, -#endif FLOAT___GETNEWARGS___METHODDEF FLOAT___GETFORMAT___METHODDEF FLOAT___SET_FORMAT___METHODDEF diff --git a/Objects/longobject.c b/Objects/longobject.c index b672ae42018..124b837d008 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5411,13 +5411,6 @@ int_bit_length_impl(PyObject *self) return NULL; } -#if 0 -static PyObject * -long_is_finite(PyObject *v) -{ - Py_RETURN_TRUE; -} -#endif /*[clinic input] int.as_integer_ratio @@ -5574,10 +5567,6 @@ static PyMethodDef long_methods[] = { {"conjugate", long_long_meth, METH_NOARGS, "Returns self, the complex conjugate of any int."}, INT_BIT_LENGTH_METHODDEF -#if 0 - {"is_finite", (PyCFunction)long_is_finite, METH_NOARGS, - "Returns always True."}, -#endif INT_TO_BYTES_METHODDEF INT_FROM_BYTES_METHODDEF INT_AS_INTEGER_RATIO_METHODDEF From 5bbac8cbdf140ebce446ea4e7db2b20a5d7b8402 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 22 Jan 2020 19:01:24 +0900 Subject: [PATCH 172/380] bpo-39377: json: Update doc about the encoding option. (GH-18076) Co-authored-by: Kyle Stanley --- Doc/library/json.rst | 9 ++++----- Doc/whatsnew/3.9.rst | 10 +++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index cfe68c9dd91..b923c8e1670 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -283,19 +283,18 @@ Basic Usage instance containing a JSON document) to a Python object using this :ref:`conversion table `. - The other arguments have the same meaning as in :func:`load`, except - *encoding* which is ignored and deprecated since Python 3.1. + The other arguments have the same meaning as in :func:`load`. If the data being deserialized is not a valid JSON document, a :exc:`JSONDecodeError` will be raised. - .. deprecated-removed:: 3.1 3.9 - *encoding* keyword argument. - .. versionchanged:: 3.6 *s* can now be of type :class:`bytes` or :class:`bytearray`. The input encoding should be UTF-8, UTF-16 or UTF-32. + .. versionchanged:: 3.9 + The keyword argument *encoding* has been removed. + Encoders and Decoders --------------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ab27c488ea3..00341ef8019 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -424,11 +424,15 @@ Removed (Contributed by Victor Stinner in :issue:`39350`.) * The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since - Python 3.0, it was ignored and using it was emitting - :exc:`DeprecationWarning`. Pass an open file object to control how the file - is opened. + Python 3.0, it was ignored and using it emitted a :exc:`DeprecationWarning`. + Pass an open file object to control how the file is opened. (Contributed by Victor Stinner in :issue:`39357`.) +* The *encoding* parameter of :func:`json.loads` has been removed. + As of Python 3.1, it was deprecated and ignored; using it has emitted a + :exc:`DeprecationWarning` since Python 3.8. + (Contributed by Inada Naoki in :issue:`39377`) + Porting to Python 3.9 ===================== From 14d80d0b605d8b148e14458e4c1853a940071462 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 23 Jan 2020 02:36:54 +0900 Subject: [PATCH 173/380] bpo-39425: Fix list.count performance regression (GH-18119) https://bugs.python.org/issue39425 Automerge-Triggered-By: @pablogsal --- Objects/listobject.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Objects/listobject.c b/Objects/listobject.c index bc8425cae63..a4e90dbf90c 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2584,6 +2584,10 @@ list_count(PyListObject *self, PyObject *value) for (i = 0; i < Py_SIZE(self); i++) { PyObject *obj = self->ob_item[i]; + if (obj == value) { + count++; + continue; + } Py_INCREF(obj); int cmp = PyObject_RichCompareBool(obj, value, Py_EQ); Py_DECREF(obj); From beea26b57e8c80f1eff0f967a0f9d083a7dc3d66 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 22 Jan 2020 20:44:22 +0100 Subject: [PATCH 174/380] bpo-39353: Deprecate the binhex module (GH-18025) Deprecate binhex4 and hexbin4 standards. Deprecate the binhex module and the following binascii functions: * b2a_hqx(), a2b_hqx() * rlecode_hqx(), rledecode_hqx() * crc_hqx() --- Doc/library/binascii.rst | 10 ++++ Doc/library/binhex.rst | 2 + Doc/whatsnew/3.9.rst | 10 ++++ Lib/binhex.py | 49 ++++++++++++++----- Lib/test/test_binascii.py | 22 +++++++++ Lib/test/test_binhex.py | 4 +- .../2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst | 4 ++ Modules/binascii.c | 33 +++++++++++-- Modules/clinic/binascii.c.h | 11 ++--- 9 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 98d8679fa3d..aa2a27084c3 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -92,6 +92,8 @@ The :mod:`binascii` module defines the following functions: The string should contain a complete number of binary bytes, or (in case of the last portion of the binhex4 data) have the remaining bits zero. + .. deprecated:: 3.9 + .. function:: rledecode_hqx(data) @@ -104,11 +106,15 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.2 Accept only bytestring or bytearray objects as input. + .. deprecated:: 3.9 + .. function:: rlecode_hqx(data) Perform binhex4 style RLE-compression on *data* and return the result. + .. deprecated:: 3.9 + .. function:: b2a_hqx(data) @@ -116,6 +122,8 @@ The :mod:`binascii` module defines the following functions: argument should already be RLE-coded, and have a length divisible by 3 (except possibly the last fragment). + .. deprecated:: 3.9 + .. function:: crc_hqx(data, value) @@ -124,6 +132,8 @@ The :mod:`binascii` module defines the following functions: *x*:sup:`16` + *x*:sup:`12` + *x*:sup:`5` + 1, often represented as 0x1021. This CRC is used in the binhex4 format. + .. deprecated:: 3.9 + .. function:: crc32(data[, value]) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 2966e0dbfbc..7de6a663762 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -6,6 +6,8 @@ **Source code:** :source:`Lib/binhex.py` +.. deprecated:: 3.9 + -------------- This module encodes and decodes files in binhex4 format, a format allowing diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 00341ef8019..0e82ff0695d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -353,6 +353,16 @@ Deprecated deprecated and will be removed in version 3.11. (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.) +* binhex4 and hexbin4 standards are now deprecated. The :`binhex` module + and the following :mod:`binascii` functions are now deprecated: + + * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` + * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` + * :func:`~binascii.crc_hqx` + + (Contributed by Victor Stinner in :issue:`39353`.) + + Removed ======= diff --git a/Lib/binhex.py b/Lib/binhex.py index 56b5f852c00..6ff38dd8229 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -21,10 +21,16 @@ hexbin(inputfilename, outputfilename) # input. The resulting code (xx 90 90) would appear to be interpreted as an # escaped *value* of 0x90. All coders I've seen appear to ignore this nicety... # +import binascii +import contextlib import io import os import struct -import binascii +import warnings + +warnings.warn('the binhex module is deprecated', DeprecationWarning, + stacklevel=2) + __all__ = ["binhex","hexbin","Error"] @@ -76,6 +82,16 @@ class openrsrc: def close(self): pass + +# DeprecationWarning is already emitted on "import binhex". There is no need +# to repeat the warning at each call to deprecated binascii functions. +@contextlib.contextmanager +def _ignore_deprecation_warning(): + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', '', DeprecationWarning) + yield + + class _Hqxcoderengine: """Write data to the coder in 3-byte chunks""" @@ -93,7 +109,8 @@ class _Hqxcoderengine: self.data = self.data[todo:] if not data: return - self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(data) self._flush(0) def _flush(self, force): @@ -109,7 +126,8 @@ class _Hqxcoderengine: def close(self): if self.data: - self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) + with _ignore_deprecation_warning(): + self.hqxdata = self.hqxdata + binascii.b2a_hqx(self.data) self._flush(1) self.ofp.close() del self.ofp @@ -125,13 +143,15 @@ class _Rlecoderengine: self.data = self.data + data if len(self.data) < REASONABLY_LARGE: return - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.data = b'' def close(self): if self.data: - rledata = binascii.rlecode_hqx(self.data) + with _ignore_deprecation_warning(): + rledata = binascii.rlecode_hqx(self.data) self.ofp.write(rledata) self.ofp.close() del self.ofp @@ -180,7 +200,8 @@ class BinHex: self._writecrc() def _write(self, data): - self.crc = binascii.crc_hqx(data, self.crc) + with _ignore_deprecation_warning(): + self.crc = binascii.crc_hqx(data, self.crc) self.ofp.write(data) def _writecrc(self): @@ -276,7 +297,8 @@ class _Hqxdecoderengine: # while True: try: - decdatacur, self.eof = binascii.a2b_hqx(data) + with _ignore_deprecation_warning(): + decdatacur, self.eof = binascii.a2b_hqx(data) break except binascii.Incomplete: pass @@ -312,8 +334,9 @@ class _Rledecoderengine: def _fill(self, wtd): self.pre_buffer = self.pre_buffer + self.ifp.read(wtd + 4) if self.ifp.eof: - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer) self.pre_buffer = b'' return @@ -340,8 +363,9 @@ class _Rledecoderengine: else: mark = mark - 1 - self.post_buffer = self.post_buffer + \ - binascii.rledecode_hqx(self.pre_buffer[:mark]) + with _ignore_deprecation_warning(): + self.post_buffer = self.post_buffer + \ + binascii.rledecode_hqx(self.pre_buffer[:mark]) self.pre_buffer = self.pre_buffer[mark:] def close(self): @@ -372,7 +396,8 @@ class HexBin: def _read(self, len): data = self.ifp.read(len) - self.crc = binascii.crc_hqx(data, self.crc) + with _ignore_deprecation_warning(): + self.crc = binascii.crc_hqx(data, self.crc) return data def _checkcrc(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 08de5c9fc7c..649edbe2954 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -4,6 +4,7 @@ import unittest import binascii import array import re +from test import support # Note: "*_hex" functions are aliases for "(un)hexlify" b2a_functions = ['b2a_base64', 'b2a_hex', 'b2a_hqx', 'b2a_qp', 'b2a_uu', @@ -36,6 +37,7 @@ class BinASCIITest(unittest.TestCase): self.assertTrue(hasattr(getattr(binascii, name), '__call__')) self.assertRaises(TypeError, getattr(binascii, name)) + @support.ignore_warnings(category=DeprecationWarning) def test_returned_value(self): # Limit to the minimum of all limits (b2a_uu) MAX_ALL = 45 @@ -179,6 +181,7 @@ class BinASCIITest(unittest.TestCase): with self.assertRaises(TypeError): binascii.b2a_uu(b"", True) + @support.ignore_warnings(category=DeprecationWarning) def test_crc_hqx(self): crc = binascii.crc_hqx(self.type2test(b"Test the CRC-32 of"), 0) crc = binascii.crc_hqx(self.type2test(b" this string."), crc) @@ -198,6 +201,7 @@ class BinASCIITest(unittest.TestCase): self.assertRaises(TypeError, binascii.crc32) + @support.ignore_warnings(category=DeprecationWarning) def test_hqx(self): # Perform binhex4 style RLE-compression # Then calculate the hexbin4 binary-to-ASCII translation @@ -208,6 +212,7 @@ class BinASCIITest(unittest.TestCase): res = binascii.rledecode_hqx(b) self.assertEqual(res, self.rawdata) + @support.ignore_warnings(category=DeprecationWarning) def test_rle(self): # test repetition with a repetition longer than the limit of 255 data = (b'a' * 100 + b'b' + b'c' * 300) @@ -354,6 +359,7 @@ class BinASCIITest(unittest.TestCase): self.assertEqual(b2a_qp(type2test(b'a.\n')), b'a.\n') self.assertEqual(b2a_qp(type2test(b'.a')[:-1]), b'=2E') + @support.ignore_warnings(category=DeprecationWarning) def test_empty_string(self): # A test for SF bug #1022953. Make sure SystemError is not raised. empty = self.type2test(b'') @@ -378,6 +384,7 @@ class BinASCIITest(unittest.TestCase): # crc_hqx needs 2 arguments self.assertRaises(TypeError, binascii.crc_hqx, "test", 0) + @support.ignore_warnings(category=DeprecationWarning) def test_unicode_a2b(self): # Unicode strings are accepted by a2b_* functions. MAX_ALL = 45 @@ -416,6 +423,21 @@ class BinASCIITest(unittest.TestCase): self.assertEqual(binascii.b2a_base64(b, newline=False), b'aGVsbG8=') + def test_deprecated_warnings(self): + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.b2a_hqx(b'abc'), b'B@*M') + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.a2b_hqx(b'B@*M'), (b'abc', 0)) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rlecode_hqx(b'a' * 10), b'a\x90\n') + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) + + with self.assertWarns(DeprecationWarning): + self.assertEqual(binascii.crc_hqx(b'abc', 0), 40406) + class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index 2f3d53afbd1..86ca37ce1b9 100644 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -3,10 +3,12 @@ Uses the mechanism of the python binhex module Based on an original test by Roger E. Masse. """ -import binhex import unittest from test import support +with support.check_warnings(('', DeprecationWarning)): + import binhex + class BinHexTestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst new file mode 100644 index 00000000000..c0d4583ca7f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst @@ -0,0 +1,4 @@ +Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module and +the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, +:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, +:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. diff --git a/Modules/binascii.c b/Modules/binascii.c index 94b0732c12c..c6da3e0a635 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -613,6 +613,11 @@ static PyObject * binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=4d6d8c54d54ea1c1 input=0d914c680e0eed55]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.a2b_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *ascii_data; unsigned char *bin_data; int leftbits = 0; @@ -701,6 +706,11 @@ static PyObject * binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=393d79338f5f5629 input=e1f1712447a82b09]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rlecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char ch; @@ -763,6 +773,11 @@ static PyObject * binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=d0aa5a704bc9f7de input=9596ebe019fe12ba]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.b2a_hqx() is deprecated", 1) < 0) { + return NULL; + } + unsigned char *ascii_data; const unsigned char *bin_data; int leftbits = 0; @@ -818,6 +833,11 @@ static PyObject * binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data) /*[clinic end generated code: output=9826619565de1c6c input=54cdd49fc014402c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.rledecode_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *in_data; unsigned char *out_data; unsigned char in_byte, in_repeat; @@ -932,7 +952,7 @@ error: /*[clinic input] -binascii.crc_hqx -> unsigned_int +binascii.crc_hqx data: Py_buffer crc: unsigned_int(bitwise=True) @@ -941,10 +961,15 @@ binascii.crc_hqx -> unsigned_int Compute CRC-CCITT incrementally. [clinic start generated code]*/ -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) -/*[clinic end generated code: output=8ec2a78590d19170 input=f18240ff8c705b79]*/ +/*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "binascii.crc_hqx() is deprecated", 1) < 0) { + return NULL; + } + const unsigned char *bin_data; Py_ssize_t len; @@ -956,7 +981,7 @@ binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) crc = ((crc<<8)&0xff00) ^ crctab_hqx[(crc>>8)^*bin_data++]; } - return crc; + return PyLong_FromUnsignedLong(crc); } #ifndef USE_ZLIB_CRC32 diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h index 82942f08a68..4d02c72c472 100644 --- a/Modules/clinic/binascii.c.h +++ b/Modules/clinic/binascii.c.h @@ -328,7 +328,7 @@ PyDoc_STRVAR(binascii_crc_hqx__doc__, #define BINASCII_CRC_HQX_METHODDEF \ {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__}, -static unsigned int +static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc); static PyObject * @@ -337,7 +337,6 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) PyObject *return_value = NULL; Py_buffer data = {NULL, NULL}; unsigned int crc; - unsigned int _return_value; if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) { goto exit; @@ -358,11 +357,7 @@ binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs) if (crc == (unsigned int)-1 && PyErr_Occurred()) { goto exit; } - _return_value = binascii_crc_hqx_impl(module, &data, crc); - if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromUnsignedLong((unsigned long)_return_value); + return_value = binascii_crc_hqx_impl(module, &data, crc); exit: /* Cleanup for data */ @@ -801,4 +796,4 @@ exit: return return_value; } -/*[clinic end generated code: output=ec26d03c2007eaac input=a9049054013a1b77]*/ +/*[clinic end generated code: output=a1e878d3963b615e input=a9049054013a1b77]*/ From b73dd02ea744288831f71363a7467552c09875ea Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 22 Jan 2020 21:11:17 +0100 Subject: [PATCH 175/380] Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124) This reverts commit 56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8. --- Doc/library/os.rst | 3 -- Doc/whatsnew/3.9.rst | 3 -- Lib/test/test_os.py | 11 +++-- .../2020-01-21-15-48-35.bpo-39413.7XYDM8.rst | 1 - Modules/clinic/posixmodule.c.h | 42 ++--------------- Modules/posixmodule.c | 46 +------------------ 6 files changed, 12 insertions(+), 94 deletions(-) delete mode 100644 Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index de3e5603e10..4fec647828e 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,9 +645,6 @@ process and user. .. availability:: most flavors of Unix, Windows. - .. versionchanged:: 3.9 - The function is now also available on Windows. - .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 0e82ff0695d..f5835d68515 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -216,9 +216,6 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. -The :func:`os.unsetenv` function is now also available on Windows. -(Contributed by Victor Stinner in :issue:`39413`.) - poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 50535da0a2b..82c441c2048 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -956,9 +956,14 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) def test_unset_error(self): - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + if sys.platform == "win32": + # an environment variable is limited to 32,767 characters + key = 'x' * 50000 + self.assertRaises(ValueError, os.environ.__delitem__, key) + else: + # "=" is not allowed in a variable name + key = 'key=' + self.assertRaises(OSError, os.environ.__delitem__, key) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst deleted file mode 100644 index a185ab5efe2..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst +++ /dev/null @@ -1 +0,0 @@ -The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 661d91afb7e..aa4756a620a 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,43 +6125,7 @@ exit: #endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ -#if defined(MS_WINDOWS) - -PyDoc_STRVAR(os_unsetenv__doc__, -"unsetenv($module, name, /)\n" -"--\n" -"\n" -"Delete an environment variable."); - -#define OS_UNSETENV_METHODDEF \ - {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, - -static PyObject * -os_unsetenv_impl(PyObject *module, PyObject *name); - -static PyObject * -os_unsetenv(PyObject *module, PyObject *arg) -{ - PyObject *return_value = NULL; - PyObject *name; - - if (!PyUnicode_Check(arg)) { - _PyArg_BadArgument("unsetenv", "argument", "str", arg); - goto exit; - } - if (PyUnicode_READY(arg) == -1) { - goto exit; - } - name = arg; - return_value = os_unsetenv_impl(module, name); - -exit: - return return_value; -} - -#endif /* defined(MS_WINDOWS) */ - -#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) +#if defined(HAVE_UNSETENV) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6193,7 +6157,7 @@ exit: return return_value; } -#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ +#endif /* defined(HAVE_UNSETENV) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8809,4 +8773,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 5a0c8a311a7..e0eecfa6d11 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10180,51 +10180,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* HAVE_PUTENV */ -#ifdef MS_WINDOWS -/*[clinic input] -os.unsetenv - name: unicode - / - -Delete an environment variable. -[clinic start generated code]*/ - -static PyObject * -os_unsetenv_impl(PyObject *module, PyObject *name) -/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ -{ - /* PyUnicode_AsWideCharString() rejects embedded null characters */ - wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL); - if (name_str == NULL) { - return NULL; - } - - BOOL ok = SetEnvironmentVariableW(name_str, NULL); - PyMem_Free(name_str); - - if (!ok) { - return PyErr_SetFromWindowsErr(0); - } - -#ifdef PY_PUTENV_DICT - /* Remove the key from putenv_dict; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } -#endif - - Py_RETURN_NONE; -} -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) +#ifdef HAVE_UNSETENV /*[clinic input] os.unsetenv name: FSConverter From 0852c7dd52ac42e7843ddfef44571494e4c86070 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 22 Jan 2020 21:53:26 +0100 Subject: [PATCH 176/380] bpo-39406: os.putenv() avoids putenv_dict on Windows (GH-18126) Windows: _wputenv(env) copies the *env* string and doesn't require the caller to manage the variable memory. --- Modules/posixmodule.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e0eecfa6d11..71b99fd836f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,7 +819,9 @@ dir_fd_converter(PyObject *o, void *p) } } -#ifdef HAVE_PUTENV +/* Windows: _wputenv(env) copies the *env* string and doesn't require the + caller to manage the variable memory. */ +#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) # define PY_PUTENV_DICT #endif @@ -10130,8 +10132,10 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) posix_error(); goto error; } + /* _wputenv(env) copies the *env* string and doesn't require the caller + to manage the variable memory. */ + Py_DECREF(unicode); - posix_putenv_dict_setitem(name, unicode); Py_RETURN_NONE; error: From b477d19a6b7751b0c933b239dae4fc96dbcde9c4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 22 Jan 2020 22:48:16 +0100 Subject: [PATCH 177/380] bpo-39406: Implement os.putenv() with setenv() if available (GH-18128) If setenv() C function is available, os.putenv() is now implemented with setenv() instead of putenv(), so Python doesn't have to handle the environment variable memory. --- .../2020-01-22-21-18-58.bpo-39406.HMpe8x.rst | 3 ++ Modules/clinic/posixmodule.c.h | 10 ++--- Modules/posixmodule.c | 38 ++++++++++--------- configure | 17 ++------- configure.ac | 2 +- pyconfig.h.in | 3 ++ 6 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst diff --git a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst new file mode 100644 index 00000000000..56a53160432 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst @@ -0,0 +1,3 @@ +If ``setenv()`` C function is available, :func:`os.putenv` is now +implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't +have to handle the environment variable memory. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index aa4756a620a..13a69cd5f0e 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6034,7 +6034,7 @@ exit: #endif /* (defined(HAVE_POSIX_FADVISE) && !defined(POSIX_FADVISE_AIX_BUG)) */ -#if defined(HAVE_PUTENV) && defined(MS_WINDOWS) +#if defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6080,9 +6080,9 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && defined(MS_WINDOWS) */ +#endif /* defined(MS_WINDOWS) */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +#if ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6123,7 +6123,7 @@ exit: return return_value; } -#endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */ +#endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ #if defined(HAVE_UNSETENV) @@ -8773,4 +8773,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=6f42d8be634f5942 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 71b99fd836f..6a687529df0 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,19 +819,20 @@ dir_fd_converter(PyObject *o, void *p) } } -/* Windows: _wputenv(env) copies the *env* string and doesn't require the - caller to manage the variable memory. */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) +/* Windows _wputenv() and setenv() copy the arguments and so don't require + the caller to manage the variable memory. Only Unix putenv() requires + putenv_dict. */ +#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) && !defined(HAVE_SETENV) # define PY_PUTENV_DICT #endif typedef struct { PyObject *billion; #ifdef PY_PUTENV_DICT - /* putenv() and _wputenv() requires that the caller manages the environment - variable memory. Use a Python dictionary for that: name => env, where - env is a string like "name=value". On Windows, dict keys and values are - Unicode strings. On Unix, they are bytes strings. */ + /* putenv() requires that the caller manages the environment variable + memory. Use a Python dictionary for that: name => env, where env is a + string like "name=value". On Windows, dict keys and values are Unicode + strings. On Unix, they are bytes strings. */ PyObject *putenv_dict; #endif PyObject *DirEntryType; @@ -10081,8 +10082,6 @@ posix_putenv_dict_setitem(PyObject *name, PyObject *value) #endif /* PY_PUTENV_DICT */ -#ifdef HAVE_PUTENV - #ifdef MS_WINDOWS /*[clinic input] os.putenv @@ -10132,8 +10131,6 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) posix_error(); goto error; } - /* _wputenv(env) copies the *env* string and doesn't require the caller - to manage the variable memory. */ Py_DECREF(unicode); Py_RETURN_NONE; @@ -10142,7 +10139,8 @@ error: Py_DECREF(unicode); return NULL; } -#else /* MS_WINDOWS */ +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) /*[clinic input] os.putenv @@ -10157,8 +10155,6 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=a97bc6152f688d31]*/ { - PyObject *bytes = NULL; - char *env; const char *name_string = PyBytes_AS_STRING(name); const char *value_string = PyBytes_AS_STRING(value); @@ -10166,22 +10162,28 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); return NULL; } - bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); + +#ifdef HAVE_SETENV + if (setenv(name_string, value_string, 1)) { + return posix_error(); + } +#else + PyObject *bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); if (bytes == NULL) { return NULL; } - env = PyBytes_AS_STRING(bytes); + char *env = PyBytes_AS_STRING(bytes); if (putenv(env)) { Py_DECREF(bytes); return posix_error(); } posix_putenv_dict_setitem(name, bytes); +#endif Py_RETURN_NONE; } -#endif /* MS_WINDOWS */ -#endif /* HAVE_PUTENV */ +#endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ #ifdef HAVE_UNSETENV diff --git a/configure b/configure index c8253b1455f..e96683622b3 100755 --- a/configure +++ b/configure @@ -782,7 +782,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -896,7 +895,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1149,15 +1147,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1295,7 +1284,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1448,7 +1437,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -10303,6 +10291,7 @@ fi + if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. @@ -11561,7 +11550,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ diff --git a/configure.ac b/configure.ac index bcef99c4962..36c165b2f2e 100644 --- a/configure.ac +++ b/configure.ac @@ -3600,7 +3600,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ diff --git a/pyconfig.h.in b/pyconfig.h.in index e053be15a11..1918fab8bdb 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -895,6 +895,9 @@ /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID From 1f0f102dec506fd06f912b74dd2be64a7fba0d3f Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 23 Jan 2020 06:59:43 +0900 Subject: [PATCH 178/380] bpo-39366: Remove xpath() and xgtitle() methods of NNTP (GH-18035) --- Doc/library/nntplib.rst | 27 ------------- Doc/whatsnew/3.9.rst | 7 ++++ Lib/nntplib.py | 39 ------------------- .../2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst | 2 + 4 files changed, 9 insertions(+), 66 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 76973651526..e7ec9047e01 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -542,33 +542,6 @@ them have been superseded by newer commands in :rfc:`3977`. if available. -.. method:: NNTP.xpath(id) - - Return a pair ``(resp, path)``, where *path* is the directory path to the - article with message ID *id*. Most of the time, this extension is not - enabled by NNTP server administrators. - - .. deprecated:: 3.3 - The XPATH extension is not actively used. - - -.. XXX deprecated: - - .. method:: NNTP.xgtitle(name, *, file=None) - - Process an ``XGTITLE`` command, returning a pair ``(response, list)``, where - *list* is a list of tuples containing ``(name, title)``. If the *file* parameter - is supplied, then the output of the ``XGTITLE`` command is stored in a file. - If *file* is a string, then the method will open a file with that name, write - to it then close it. If *file* is a :term:`file object`, then it will start - calling :meth:`write` on it to store the lines of the command output. If *file* - is supplied, then the returned *list* is an empty list. This is an optional NNTP - extension, and may not be supported by all servers. - - :rfc:`2980` says "It is suggested that this extension be deprecated". Use - :meth:`descriptions` or :meth:`description` instead. - - Utility functions ----------------- diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f5835d68515..d9c545adc43 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -363,6 +363,13 @@ Deprecated Removed ======= +* :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. + These methods are deprecated since Python 3.3. Generally, these extensions + are not supported or not enabled by NNTP server administrators. + For ``xgtitle()``, please use :meth:`nntplib.NNTP.descriptions` or + :meth:`nntplib.NNTP.description` instead. + (Contributed by Dong-hee Na in :issue:`39366`.) + * :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated since Python 3.2. diff --git a/Lib/nntplib.py b/Lib/nntplib.py index 8951203f325..aa9b46a8aaa 100644 --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -67,7 +67,6 @@ import re import socket import collections import datetime -import warnings import sys try: @@ -834,44 +833,6 @@ class _NNTPBase: fmt = self._getoverviewfmt() return resp, _parse_overview(lines, fmt) - def xgtitle(self, group, *, file=None): - """Process an XGTITLE command (optional server extension) Arguments: - - group: group name wildcard (i.e. news.*) - Returns: - - resp: server response if successful - - list: list of (name,title) strings""" - warnings.warn("The XGTITLE extension is not actively used, " - "use descriptions() instead", - DeprecationWarning, 2) - line_pat = re.compile('^([^ \t]+)[ \t]+(.*)$') - resp, raw_lines = self._longcmdstring('XGTITLE ' + group, file) - lines = [] - for raw_line in raw_lines: - match = line_pat.search(raw_line.strip()) - if match: - lines.append(match.group(1, 2)) - return resp, lines - - def xpath(self, id): - """Process an XPATH command (optional server extension) Arguments: - - id: Message id of article - Returns: - resp: server response if successful - path: directory path to article - """ - warnings.warn("The XPATH extension is not actively used", - DeprecationWarning, 2) - - resp = self._shortcmd('XPATH {0}'.format(id)) - if not resp.startswith('223'): - raise NNTPReplyError(resp) - try: - [resp_num, path] = resp.split() - except ValueError: - raise NNTPReplyError(resp) from None - else: - return resp, path - def date(self): """Process the DATE command. Returns: diff --git a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst new file mode 100644 index 00000000000..00d98a7f183 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst @@ -0,0 +1,2 @@ +The previously deprecated ``xpath()`` and ``xgtitle()`` methods of +:class:`nntplib.NNTP` have been removed. From d3ae95e1e945ed20297e1c38ba43a18b7a868ab6 Mon Sep 17 00:00:00 2001 From: Alex Rebert Date: Wed, 22 Jan 2020 18:28:31 -0500 Subject: [PATCH 179/380] bpo-35182: fix communicate() crash after child closes its pipes (GH-17020) (GH-18117) When communicate() is called in a loop, it crashes when the child process has already closed any piped standard stream, but still continues to be running Co-authored-by: Andriy Maletsky --- Lib/subprocess.py | 4 ++-- Lib/test/test_subprocess.py | 11 +++++++++++ .../Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 79dffd349a3..26a1e69bd38 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1983,9 +1983,9 @@ class Popen(object): with _PopenSelector() as selector: if self.stdin and input: selector.register(self.stdin, selectors.EVENT_WRITE) - if self.stdout: + if self.stdout and not self.stdout.closed: selector.register(self.stdout, selectors.EVENT_READ) - if self.stderr: + if self.stderr and not self.stderr.closed: selector.register(self.stderr, selectors.EVENT_READ) while selector.get_map(): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index f1fb93455dd..2bbdbaef84e 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -3145,6 +3145,17 @@ class POSIXProcessTestCase(BaseTestCase): # so Popen failed to read it and uses a default returncode instead. self.assertIsNotNone(proc.returncode) + def test_communicate_repeated_call_after_stdout_close(self): + proc = subprocess.Popen([sys.executable, '-c', + 'import os, time; os.close(1), time.sleep(2)'], + stdout=subprocess.PIPE) + while True: + try: + proc.communicate(timeout=0.1) + return + except subprocess.TimeoutExpired: + pass + @unittest.skipUnless(mswindows, "Windows specific tests") class Win32ProcessTestCase(BaseTestCase): diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst new file mode 100644 index 00000000000..9438cd8f9fd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst @@ -0,0 +1,3 @@ +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. From 9b6fec46513006d7b06fcb645cca6e4f5bf7c7b8 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Wed, 22 Jan 2020 16:42:38 -0800 Subject: [PATCH 180/380] bpo-39336: Allow packages to not let their child modules be set on them (#18006) * bpo-39336: Allow setattr to fail on modules which aren't assignable When attaching a child module to a package if the object in sys.modules raises an AttributeError (e.g. because it is immutable) it causes the whole import to fail. This now allows immutable packages to exist and an ImportWarning is reported and the AttributeError exception is ignored. --- Lib/importlib/_bootstrap.py | 7 +- Lib/test/test_import/__init__.py | 14 + .../test_import/data/unwritable/__init__.py | 12 + Lib/test/test_import/data/unwritable/x.py | 0 .../2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst | 1 + Python/importlib.h | 683 +++++++++--------- 6 files changed, 379 insertions(+), 338 deletions(-) create mode 100644 Lib/test/test_import/data/unwritable/__init__.py create mode 100644 Lib/test/test_import/data/unwritable/x.py create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 8de0e9ee79f..7b74e88820d 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -978,7 +978,12 @@ def _find_and_load_unlocked(name, import_): if parent: # Set the module as an attribute on its parent. parent_module = sys.modules[parent] - setattr(parent_module, name.rpartition('.')[2], module) + child = name.rpartition('.')[2] + try: + setattr(parent_module, child, module) + except AttributeError: + msg = f"Cannot set an attribute on {parent!r} for child module {child!r}" + _warnings.warn(msg, ImportWarning) return module diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 13d04815da7..482fe6a9216 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -26,6 +26,7 @@ from test.support import ( temp_dir, DirsOnSysPath) from test.support import script_helper from test.test_importlib.util import uncache +from types import ModuleType skip_if_dont_write_bytecode = unittest.skipIf( @@ -1339,6 +1340,19 @@ class CircularImportTests(unittest.TestCase): str(cm.exception), ) + def test_unwritable_module(self): + self.addCleanup(unload, "test.test_import.data.unwritable") + self.addCleanup(unload, "test.test_import.data.unwritable.x") + + import test.test_import.data.unwritable as unwritable + with self.assertWarns(ImportWarning): + from test.test_import.data.unwritable import x + + self.assertNotEqual(type(unwritable), ModuleType) + self.assertEqual(type(x), ModuleType) + with self.assertRaises(AttributeError): + unwritable.x = 42 + if __name__ == '__main__': # Test needs to be a package, so we can do relative imports. diff --git a/Lib/test/test_import/data/unwritable/__init__.py b/Lib/test/test_import/data/unwritable/__init__.py new file mode 100644 index 00000000000..da4ddb3d027 --- /dev/null +++ b/Lib/test/test_import/data/unwritable/__init__.py @@ -0,0 +1,12 @@ +import sys + +class MyMod(object): + __slots__ = ['__builtins__', '__cached__', '__doc__', + '__file__', '__loader__', '__name__', + '__package__', '__path__', '__spec__'] + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, globals()[attr]) + + +sys.modules[__name__] = MyMod() diff --git a/Lib/test/test_import/data/unwritable/x.py b/Lib/test/test_import/data/unwritable/x.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst new file mode 100644 index 00000000000..55b6bbbcac0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst @@ -0,0 +1 @@ +Import loaders which publish immutable module objects can now publish immutable packages in addition to individual modules. diff --git a/Python/importlib.h b/Python/importlib.h index 63e2064889b..3a84e9bb1d8 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1448,8 +1448,8 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 8,1,8,1,8,1,10,1,10,1,4,1,8,2,12,1, 114,200,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,8,0,0,0,8,0, - 0,0,67,0,0,0,115,218,0,0,0,100,0,125,2,124, + 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, @@ -1460,341 +1460,350 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 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,114, - 214,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, - 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, - 0,124,7,83,0,41,6,78,114,127,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,41,12,114,128,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,66,0,0,0,114,140,0,0,0, - 114,105,0,0,0,218,8,95,69,82,82,95,77,83,71,114, - 44,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,194,0,0,0,114,158, - 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, - 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,190,3,0,0,115,42,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,4,2,10,1,22,1,114,205,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,49,0, + 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,127,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,128,0,0,0,114,15,0,0,0,114,91, + 0,0,0,114,66,0,0,0,114,140,0,0,0,114,105,0, + 0,0,218,8,95,69,82,82,95,77,83,71,114,44,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,194,0,0,0,114,158,0,0,0, + 114,5,0,0,0,114,191,0,0,0,114,192,0,0,0,114, + 193,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, + 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, + 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, + 0,0,114,94,0,0,0,114,95,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,190,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,205,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,49,0,0,0,114, + 15,0,0,0,114,91,0,0,0,114,34,0,0,0,218,14, + 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,205, + 0,0,0,114,44,0,0,0,114,203,0,0,0,114,64,0, + 0,0,41,4,114,17,0,0,0,114,204,0,0,0,114,95, + 0,0,0,114,74,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,225,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,207,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,200,0,0,0,114,187,0, + 0,0,114,207,0,0,0,218,11,95,103,99,100,95,105,109, + 112,111,114,116,114,199,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,208,0,0,0,241,3,0, + 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,208, + 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,209,0,0, + 0,114,182,0,0,0,78,41,16,114,195,0,0,0,114,196, + 0,0,0,114,1,0,0,0,114,197,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,212,0,0,0,114,44, + 0,0,0,114,66,0,0,0,114,203,0,0,0,114,17,0, 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,218,14,95,78,69,69,68,83,95,76,79,65,68,73,78, - 71,114,205,0,0,0,114,44,0,0,0,114,203,0,0,0, - 114,64,0,0,0,41,4,114,17,0,0,0,114,204,0,0, - 0,114,95,0,0,0,114,74,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,220,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,207,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,200,0,0,0, - 114,187,0,0,0,114,207,0,0,0,218,11,95,103,99,100, - 95,105,109,112,111,114,116,114,199,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,208,0,0,0, - 236,3,0,0,115,8,0,0,0,0,9,12,1,8,1,12, - 1,114,208,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, - 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, - 0,114,196,0,0,0,114,1,0,0,0,114,197,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,212,0,0, - 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, - 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, - 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, - 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, - 210,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,213,0, - 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, - 1,4,1,12,2,4,1,28,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,213,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,144,0,0,0,114,104,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,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, - 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, - 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, - 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, - 94,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,32,4,0,0,115,38,0,0,0,0, - 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, - 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, - 1,8,1,14,1,114,219,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,180,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,150,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,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, - 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41, - 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, - 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, - 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, - 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, - 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, - 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, - 95,114,185,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,59,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,32,1,10,1,12, - 2,114,222,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,159,0,0,0,114, - 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, - 114,17,0,0,0,114,94,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,96,4,0, - 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, + 0,114,206,0,0,0,41,8,114,95,0,0,0,218,8,102, + 114,111,109,108,105,115,116,114,204,0,0,0,114,210,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,213,0,0,0,0, + 4,0,0,115,44,0,0,0,0,10,8,1,10,1,4,1, + 12,2,4,1,28,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,213,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,144,0,0,0,114,104,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,140,0, + 0,0,114,127,0,0,0,114,22,0,0,0,41,6,114,34, + 0,0,0,114,129,0,0,0,114,191,0,0,0,114,192,0, + 0,0,114,193,0,0,0,114,128,0,0,0,41,3,218,7, + 103,108,111,98,97,108,115,114,185,0,0,0,114,94,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,37,4,0,0,115,38,0,0,0,0,7,10,1, + 10,1,8,1,18,1,22,2,2,0,2,254,6,3,4,1, + 8,1,6,2,6,2,2,0,2,254,6,3,8,1,8,1, + 14,1,114,219,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,180,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,150,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,110,26, + 116,7,124,5,100,4,131,2,114,172,116,8,124,5,124,3, + 116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41,9,114,208, + 0,0,0,114,219,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,184,0,0,0,114,15,0,0,0,114,91,0, + 0,0,114,1,0,0,0,114,4,0,0,0,114,213,0,0, + 0,41,9,114,17,0,0,0,114,218,0,0,0,218,6,108, + 111,99,97,108,115,114,214,0,0,0,114,186,0,0,0,114, + 95,0,0,0,90,8,103,108,111,98,97,108,115,95,114,185, + 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,64,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,32,1,10,1,12,2,114,222, + 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,159,0,0,0,114,166,0,0, + 0,114,78,0,0,0,114,158,0,0,0,41,2,114,17,0, + 0,0,114,94,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,101,4,0,0,115,8, + 0,0,0,0,1,10,1,8,1,12,1,114,223,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,191,0,0,0,114,63, + 0,0,0,78,41,15,114,56,0,0,0,114,15,0,0,0, + 114,14,0,0,0,114,91,0,0,0,218,5,105,116,101,109, + 115,114,195,0,0,0,114,77,0,0,0,114,159,0,0,0, + 114,87,0,0,0,114,173,0,0,0,114,141,0,0,0,114, + 147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,108,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,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,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,191,0,0, - 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, - 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, - 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, - 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, - 0,0,114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,103,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,227,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,227,0,0,0,114,15,0,0,0,114,190,0,0,0, - 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, - 2,114,225,0,0,0,114,226,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,138,4,0,0,115,6,0,0,0,0,2,10, - 2,12,1,114,228,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,125,0,0,0,114,228,0,0, - 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, - 41,1,114,229,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,146,4,0,0,115,6,0,0,0,0,3,8,1, - 4,1,114,230,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,125,0,0,0, - 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, - 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, - 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, - 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, - 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, - 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, - 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, - 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, - 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, - 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, - 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, - 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, - 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, - 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, - 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, - 114,227,0,0,0,114,228,0,0,0,114,230,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,68,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,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, - 8,35,8,8, + 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,227, + 0,0,0,114,15,0,0,0,114,190,0,0,0,114,118,0, + 0,0,114,159,0,0,0,114,173,0,0,0,41,2,114,225, + 0,0,0,114,226,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,143,4,0,0,115,6,0,0,0,0,2,10,2,12,1, + 114,228,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,125,0,0,0,114,228,0,0,0,114,15, + 0,0,0,114,91,0,0,0,114,1,0,0,0,41,1,114, + 229,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, + 151,4,0,0,115,6,0,0,0,0,3,8,1,4,1,114, + 230,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,125,0,0,0,114,12,0, + 0,0,114,18,0,0,0,114,58,0,0,0,114,33,0,0, + 0,114,42,0,0,0,114,19,0,0,0,114,20,0,0,0, + 114,48,0,0,0,114,49,0,0,0,114,52,0,0,0,114, + 64,0,0,0,114,66,0,0,0,114,75,0,0,0,114,85, + 0,0,0,114,89,0,0,0,114,96,0,0,0,114,110,0, + 0,0,114,111,0,0,0,114,90,0,0,0,114,141,0,0, + 0,114,147,0,0,0,114,151,0,0,0,114,106,0,0,0, + 114,92,0,0,0,114,157,0,0,0,114,158,0,0,0,114, + 93,0,0,0,114,159,0,0,0,114,173,0,0,0,114,178, + 0,0,0,114,187,0,0,0,114,189,0,0,0,114,194,0, + 0,0,114,200,0,0,0,90,15,95,69,82,82,95,77,83, + 71,95,80,82,69,70,73,88,114,202,0,0,0,114,205,0, + 0,0,218,6,111,98,106,101,99,116,114,206,0,0,0,114, + 207,0,0,0,114,208,0,0,0,114,213,0,0,0,114,219, + 0,0,0,114,222,0,0,0,114,223,0,0,0,114,227,0, + 0,0,114,228,0,0,0,114,230,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,68,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, }; From 41f0ef6abbd304409c55612a08788cdd59fbc8a3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 23 Jan 2020 01:03:04 +0000 Subject: [PATCH 181/380] bpo-39427: Document -X opt options in the CLI --help and the man page (GH-18131) https://bugs.python.org/issue39427 Automerge-Triggered-By: @pablogsal --- .../2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst | 2 + Misc/python.man | 40 ++++++++++++++++++- Python/initconfig.c | 33 ++++++++++++++- 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst new file mode 100644 index 00000000000..a3915a4d81c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst @@ -0,0 +1,2 @@ +Document all possibilities for the ``-X`` options in the command line help +section. Patch by Pablo Galindo. diff --git a/Misc/python.man b/Misc/python.man index 3aa9f1f9c7e..3645b0206eb 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -273,7 +273,45 @@ field matches the line number, where zero matches all line numbers and is thus equivalent to an omitted line number. .TP .BI "\-X " option -Set implementation specific option. +Set implementation specific option. The following options are available: + + -X faulthandler: enable faulthandler + + -X showrefcount: output the total reference count and number of used + memory blocks when the program finishes or after each statement in the + interactive interpreter. This only works on debug builds + + -X tracemalloc: start tracing Python memory allocations using the + tracemalloc module. By default, only the most recent frame is stored in a + traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a + traceback limit of NFRAME frames + + -X showalloccount: output the total count of allocated objects for each + type when the program finishes. This only works when Python was built with + COUNT_ALLOCS defined + + -X importtime: show how long each import takes. It shows module name, + cumulative time (including nested imports) and self time (excluding + 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 + 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: + * Add default warning filter, as -W default + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function + * Enable the faulthandler module to dump the Python traceback on a crash + * Enable asyncio debug mode + * Set the dev_mode attribute of sys.flags to True + * io.IOBase destructor logs close() exceptions + + -X utf8: enable 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 PYTHONUTF8 for more details + + -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the + given directory instead of to the code tree. .TP .B \-x Skip the first line of the source. This is intended for a DOS diff --git a/Python/initconfig.c b/Python/initconfig.c index 2e46999932f..9a784c75116 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -63,7 +63,38 @@ static const char usage_3[] = "\ -W arg : warning control; arg is action:message:category:module:lineno\n\ also PYTHONWARNINGS=arg\n\ -x : skip first line of source, allowing use of non-Unix forms of #!cmd\n\ --X opt : set implementation-specific option\n\ +-X opt : set implementation-specific option. The following options are available:\n\ +\n\ + -X faulthandler: enable faulthandler\n\ + -X showrefcount: output the total reference count and number of used\n\ + memory blocks when the program finishes or after each statement in the\n\ + interactive interpreter. This only works on debug builds\n\ + -X tracemalloc: start tracing Python memory allocations using the\n\ + tracemalloc module. By default, only the most recent frame is stored in a\n\ + traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a\n\ + traceback limit of NFRAME frames\n\ + -X showalloccount: output the total count of allocated objects for each\n\ + type when the program finishes. This only works when Python was built with\n\ + COUNT_ALLOCS defined\n\ + -X importtime: show how long each import takes. It shows module name,\n\ + 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\ + 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\ + * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function\n\ + * Enable the faulthandler module to dump the Python traceback on a crash\n\ + * Enable asyncio debug mode\n\ + * Set the dev_mode attribute of sys.flags to True\n\ + * io.IOBase destructor logs close() exceptions\n\ + -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default\n\ + locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would\n\ + otherwise activate automatically)\n\ + -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the\n\ + given directory instead of to the code tree\n\ +\n\ --check-hash-based-pycs always|default|never:\n\ control how Python invalidates hash-based .pyc files\n\ "; From dd754caf144009f0569dda5053465ba2accb7b4d Mon Sep 17 00:00:00 2001 From: William Woodruff Date: Wed, 22 Jan 2020 21:24:16 -0500 Subject: [PATCH 182/380] bpo-29435: Allow is_tarfile to take a filelike obj (GH-18090) `is_tarfile()` now supports `name` being a file or file-like object. --- Doc/library/tarfile.rst | 5 ++- Lib/tarfile.py | 7 +++- Lib/test/test_tarfile.py | 32 +++++++++++++++++++ Misc/ACKS | 1 + .../2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst | 2 ++ 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index c34f2c4a570..459e4ad991d 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -159,7 +159,10 @@ Some facts and figures: .. function:: is_tarfile(name) Return :const:`True` if *name* is a tar archive file, that the :mod:`tarfile` - module can read. + module can read. *name* may be a :class:`str`, file, or file-like object. + + .. versionchanged:: 3.9 + Support for file and file-like objects. The :mod:`tarfile` module defines the following exceptions: diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 2c06f9160c6..d0b748cea17 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -2461,9 +2461,14 @@ class TarFile(object): def is_tarfile(name): """Return True if name points to a tar archive that we are able to handle, else return False. + + 'name' should be a string, file, or file-like object. """ try: - t = open(name) + if hasattr(name, "read"): + t = open(fileobj=name) + else: + t = open(name) t.close() return True except TarError: diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 15324a4e488..6a901089611 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -319,6 +319,38 @@ class LzmaListTest(LzmaTest, ListTest): class CommonReadTest(ReadTest): + def test_is_tarfile_erroneous(self): + with open(tmpname, "wb"): + pass + + # is_tarfile works on filenames + self.assertFalse(tarfile.is_tarfile(tmpname)) + + # is_tarfile works on path-like objects + self.assertFalse(tarfile.is_tarfile(pathlib.Path(tmpname))) + + # is_tarfile works on file objects + with open(tmpname, "rb") as fobj: + self.assertFalse(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + self.assertFalse(tarfile.is_tarfile(io.BytesIO(b"invalid"))) + + def test_is_tarfile_valid(self): + # is_tarfile works on filenames + self.assertTrue(tarfile.is_tarfile(self.tarname)) + + # is_tarfile works on path-like objects + self.assertTrue(tarfile.is_tarfile(pathlib.Path(self.tarname))) + + # is_tarfile works on file objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(fobj)) + + # is_tarfile works on file-like objects + with open(self.tarname, "rb") as fobj: + self.assertTrue(tarfile.is_tarfile(io.BytesIO(fobj.read()))) + def test_empty_tarfile(self): # Test for issue6123: Allow opening empty archives. # This test checks if tarfile.open() is able to open an empty tar diff --git a/Misc/ACKS b/Misc/ACKS index 3e45d5d0f7f..7e4b81bfdee 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1856,6 +1856,7 @@ Klaus-Juergen Wolf Dan Wolfe Richard Wolff Adam Woodbeck +William Woodruff Steven Work Gordon Worley Darren Worrall diff --git a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst new file mode 100644 index 00000000000..eabc94242c8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst @@ -0,0 +1,2 @@ +Allow :func:`tarfile.is_tarfile` to be used with file and file-like +objects, like :func:`zipfile.is_zipfile`. Patch by William Woodruff. From 2e43b64c94e49f7133b9c26e84c9519935c49063 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Wed, 22 Jan 2020 20:54:30 -0700 Subject: [PATCH 183/380] bpo-39050: The Help button in IDLE's config menu works again (GH-17611) Co-authored-by: Terry Jan Reedy --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/configdialog.py | 2 +- Lib/idlelib/idle_test/test_configdialog.py | 11 +++++++++++ .../IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 9f8894e517b..69bf5603068 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2020-10-05? ====================================== +bpo-39050: Make Settings dialog Help button work again. + bpo-32989: Add tests for editor newline_and_indent_event method. Remove dead code from pyparse find_good_parse_start method. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index aaf319bbe1b..0e007b516ea 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -210,7 +210,7 @@ class ConfigDialog(Toplevel): """ page = self.note.tab(self.note.select(), option='text').strip() view_text(self, title='Help for IDLE preferences', - text=help_common+help_pages.get(page, '')) + contents=help_common+help_pages.get(page, '')) def deactivate_current_config(self): """Remove current key bindings. diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 1f14ed1f264..7c575d0e599 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,6 +47,17 @@ def tearDownModule(): root.destroy() root = dialog = None +class ConfigDialogTest(unittest.TestCase): + + def test_help(self): + dialog.note.select(dialog.keyspage) + saved = configdialog.view_text + view = configdialog.view_text = Func() + dialog.help() + s = view.kwds['contents'] + self.assertTrue(s.startswith('When you click')) + self.assertTrue(s.endswith('a different name.\n')) + configdialog.view_text = saved class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst new file mode 100644 index 00000000000..e71265cdf10 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst @@ -0,0 +1 @@ +Make IDLE Settings dialog Help button work again. From f9e07e116c32b6dc4561d0bdeb452ccde13b0e7c Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 22 Jan 2020 23:55:07 -0500 Subject: [PATCH 184/380] bpo-32989: IDLE - remove unneeded parameter (GH-18138) IDLE does not pass a non-default _synchre in any of its calls to pyparse.find_good_parse_start. --- Lib/idlelib/NEWS.txt | 3 ++- Lib/idlelib/pyparse.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 69bf5603068..708292ebee9 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -6,7 +6,8 @@ Released on 2020-10-05? bpo-39050: Make Settings dialog Help button work again. bpo-32989: Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. +Remove unneeded arguments and dead code from pyparse +find_good_parse_start method. bpo-38943: Fix autocomplete windows not always appearing on some systems. Patch by Johnny Najera. diff --git a/Lib/idlelib/pyparse.py b/Lib/idlelib/pyparse.py index 9fa20108960..d34872b4396 100644 --- a/Lib/idlelib/pyparse.py +++ b/Lib/idlelib/pyparse.py @@ -133,7 +133,7 @@ class Parser: self.code = s self.study_level = 0 - def find_good_parse_start(self, is_char_in_string, _synchre=_synchre): + def find_good_parse_start(self, is_char_in_string): """ Return index of a good place to begin parsing, as close to the end of the string as possible. This will be the start of some From 13bc13960cc83dbd1cb5701d9a59ac9b9144b205 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 23 Jan 2020 09:25:17 +0000 Subject: [PATCH 185/380] bpo-39320: Handle unpacking of *values in compiler (GH-17984) * Add three new bytecodes: LIST_TO_TUPLE, LIST_EXTEND, SET_UPDATE. Use them to implement star unpacking expressions. * Remove four bytecodes BUILD_LIST_UNPACK, BUILD_TUPLE_UNPACK, BUILD_SET_UNPACK and BUILD_TUPLE_UNPACK_WITH_CALL opcodes as they are now unused. * Update magic number and dis.rst for new bytecodes. --- Doc/library/dis.rst | 37 +- Include/opcode.h | 7 +- Lib/importlib/_bootstrap_external.py | 4 +- Lib/opcode.py | 8 +- Lib/test/test_extcall.py | 4 +- .../2020-01-15-15-33-44.bpo-39320.b4hnJW.rst | 15 + Python/ceval.c | 87 +- Python/compile.c | 211 +- Python/importlib_external.h | 4322 ++++++++--------- Python/opcode_targets.h | 14 +- 10 files changed, 2349 insertions(+), 2360 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index aef5c7e8bf2..d5d30a03aea 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -859,40 +859,25 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 -.. opcode:: BUILD_TUPLE_UNPACK (count) +.. opcode:: LIST_TO_TUPLE - Pops *count* iterables from the stack, joins them in a single tuple, - and pushes the result. Implements iterable unpacking in tuple - displays ``(*x, *y, *z)``. + Pops a list from the stack and pushes a tuple containing the same values. - .. versionadded:: 3.5 + .. versionadded:: 3.9 -.. opcode:: BUILD_TUPLE_UNPACK_WITH_CALL (count) +.. opcode:: LIST_EXTEND (i) - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, - but is used for ``f(*x, *y, *z)`` call syntax. The stack item at position - ``count + 1`` should be the corresponding callable ``f``. + Calls ``list.extend(TOS1[-i], TOS)``. Used to build lists. - .. versionadded:: 3.6 + .. versionadded:: 3.9 -.. opcode:: BUILD_LIST_UNPACK (count) +.. opcode:: SET_UPDATE - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list - instead of tuple. Implements iterable unpacking in list - displays ``[*x, *y, *z]``. + Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. - .. versionadded:: 3.5 - - -.. opcode:: BUILD_SET_UNPACK (count) - - This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a set - instead of tuple. Implements iterable unpacking in set - displays ``{*x, *y, *z}``. - - .. versionadded:: 3.5 + .. versionadded:: 3.9 .. opcode:: BUILD_MAP_UNPACK (count) @@ -1124,10 +1109,6 @@ All of the following opcodes use their arguments. Calls a callable object with variable set of positional and keyword arguments. If the lowest bit of *flags* is set, the top of the stack contains a mapping object containing additional keyword arguments. - Below that is an iterable object containing positional arguments and - a callable object to call. :opcode:`BUILD_MAP_UNPACK_WITH_CALL` and - :opcode:`BUILD_TUPLE_UNPACK_WITH_CALL` can be used for merging multiple - mapping objects and iterables containing arguments. Before the callable is called, the mapping object and iterable object are each "unpacked" and their contents passed in as keyword and positional arguments respectively. diff --git a/Include/opcode.h b/Include/opcode.h index 05354847958..1c5cd335f36 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -60,6 +60,7 @@ extern "C" { #define INPLACE_AND 77 #define INPLACE_XOR 78 #define INPLACE_OR 79 +#define LIST_TO_TUPLE 82 #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 @@ -116,18 +117,16 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_LIST_UNPACK 149 #define BUILD_MAP_UNPACK 150 #define BUILD_MAP_UNPACK_WITH_CALL 151 -#define BUILD_TUPLE_UNPACK 152 -#define BUILD_SET_UNPACK 153 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 #define BUILD_STRING 157 -#define BUILD_TUPLE_UNPACK_WITH_CALL 158 #define LOAD_METHOD 160 #define CALL_METHOD 161 +#define LIST_EXTEND 162 +#define SET_UPDATE 163 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index b86612beac8..6c703fa3f75 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -275,6 +275,8 @@ _code_type = type(_write_atomic.__code__) # Python 3.9a0 3421 (simplified bytecode for with blocks #32949) # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) # 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) + # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -283,7 +285,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3423).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3424).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 e31563bfbcb..5bc2ddc3571 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -117,6 +117,7 @@ def_op('INPLACE_AND', 77) def_op('INPLACE_XOR', 78) def_op('INPLACE_OR', 79) +def_op('LIST_TO_TUPLE', 82) def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) @@ -199,20 +200,19 @@ hasfree.append(148) def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_LIST_UNPACK', 149) def_op('BUILD_MAP_UNPACK', 150) def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) -def_op('BUILD_TUPLE_UNPACK', 152) -def_op('BUILD_SET_UNPACK', 153) jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) def_op('BUILD_CONST_KEY_MAP', 156) def_op('BUILD_STRING', 157) -def_op('BUILD_TUPLE_UNPACK_WITH_CALL', 158) name_op('LOAD_METHOD', 160) def_op('CALL_METHOD', 161) +def_op('LIST_EXTEND', 162) +def_op('SET_UPDATE', 163) + del def_op, name_op, jrel_op, jabs_op diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 4edb6680e0f..1faf29e01d3 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -252,12 +252,12 @@ What about willful misconduct? >>> h(1, *h) Traceback (most recent call last): ... - TypeError: test.test_extcall.h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> h(*[1], *h) Traceback (most recent call last): ... - TypeError: test.test_extcall.h() argument after * must be an iterable, not function + TypeError: Value after * must be an iterable, not function >>> dir(*h) Traceback (most recent call last): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst new file mode 100644 index 00000000000..1e7235b7e6f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst @@ -0,0 +1,15 @@ +Replace four complex bytecodes for building sequences with three simpler ones. + + +The following four bytecodes have been removed: + +* BUILD_LIST_UNPACK +* BUILD_TUPLE_UNPACK +* BUILD_SET_UNPACK +* BUILD_TUPLE_UNPACK_WITH_CALL + +The following three bytecodes have been added: + +* LIST_TO_TUPLE +* LIST_EXTEND +* SET_UPDATE diff --git a/Python/ceval.c b/Python/ceval.c index 5e586589e96..528ad7fdd1e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2621,46 +2621,46 @@ main_loop: DISPATCH(); } - case TARGET(BUILD_TUPLE_UNPACK_WITH_CALL): - case TARGET(BUILD_TUPLE_UNPACK): - case TARGET(BUILD_LIST_UNPACK): { - int convert_to_tuple = opcode != BUILD_LIST_UNPACK; - Py_ssize_t i; - PyObject *sum = PyList_New(0); - PyObject *return_value; - - if (sum == NULL) + case TARGET(LIST_TO_TUPLE): { + PyObject *list = POP(); + PyObject *tuple = PyList_AsTuple(list); + Py_DECREF(list); + if (tuple == NULL) { goto error; + } + PUSH(tuple); + DISPATCH(); + } - for (i = oparg; i > 0; i--) { - PyObject *none_val; - - none_val = _PyList_Extend((PyListObject *)sum, PEEK(i)); - if (none_val == NULL) { - if (opcode == BUILD_TUPLE_UNPACK_WITH_CALL && - _PyErr_ExceptionMatches(tstate, PyExc_TypeError)) - { - check_args_iterable(tstate, PEEK(1 + oparg), PEEK(i)); - } - Py_DECREF(sum); - goto error; + case TARGET(LIST_EXTEND): { + PyObject *iterable = POP(); + PyObject *list = PEEK(oparg); + PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); + if (none_val == NULL) { + if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && + (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable))) + { + PyErr_Clear(); + _PyErr_Format(tstate, PyExc_TypeError, + "Value after * must be an iterable, not %.200s", + Py_TYPE(iterable)->tp_name); } - Py_DECREF(none_val); + Py_DECREF(iterable); + goto error; } + Py_DECREF(none_val); + Py_DECREF(iterable); + DISPATCH(); + } - if (convert_to_tuple) { - return_value = PyList_AsTuple(sum); - Py_DECREF(sum); - if (return_value == NULL) - goto error; + case TARGET(SET_UPDATE): { + PyObject *iterable = POP(); + PyObject *set = PEEK(oparg); + int err = _PySet_Update(set, iterable); + Py_DECREF(iterable); + if (err < 0) { + goto error; } - else { - return_value = sum; - } - - while (oparg--) - Py_DECREF(POP()); - PUSH(return_value); DISPATCH(); } @@ -2685,25 +2685,6 @@ main_loop: DISPATCH(); } - case TARGET(BUILD_SET_UNPACK): { - Py_ssize_t i; - PyObject *sum = PySet_New(NULL); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - if (_PySet_Update(sum, PEEK(i)) < 0) { - Py_DECREF(sum); - goto error; - } - } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); - DISPATCH(); - } - case TARGET(BUILD_MAP): { Py_ssize_t i; PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); diff --git a/Python/compile.c b/Python/compile.c index 1d16e69a085..9ed29f4a1f9 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1007,10 +1007,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_LIST_UNPACK: - case BUILD_TUPLE_UNPACK: - case BUILD_TUPLE_UNPACK_WITH_CALL: - case BUILD_SET_UNPACK: case BUILD_MAP_UNPACK: case BUILD_MAP_UNPACK_WITH_CALL: return 1 - oparg; @@ -1125,6 +1121,11 @@ stack_effect(int opcode, int oparg, int jump) return 1; case LOAD_ASSERTION_ERROR: return 1; + case LIST_TO_TUPLE: + return 0; + case LIST_EXTEND: + case SET_UPDATE: + return -1; default: return PY_INVALID_STACK_EFFECT; } @@ -1705,7 +1706,7 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, compiler_pop_fblock(c, POP_VALUE, NULL); } return 1; - + case FINALLY_END: if (preserve_tos) { ADDOP(c, ROT_FOUR); @@ -3675,11 +3676,11 @@ compiler_boolop(struct compiler *c, expr_ty e) } static int -starunpack_helper(struct compiler *c, asdl_seq *elts, - int single_op, int inner_op, int outer_op) +starunpack_helper(struct compiler *c, asdl_seq *elts, int pushed, + int build, int add, int extend, int tuple) { Py_ssize_t n = asdl_seq_LEN(elts); - Py_ssize_t i, nsubitems = 0, nseen = 0; + Py_ssize_t i, seen_star = 0; if (n > 2 && are_all_items_const(elts, 0, n)) { PyObject *folded = PyTuple_New(n); if (folded == NULL) { @@ -3691,41 +3692,63 @@ starunpack_helper(struct compiler *c, asdl_seq *elts, Py_INCREF(val); PyTuple_SET_ITEM(folded, i, val); } - if (outer_op == BUILD_SET_UNPACK) { - Py_SETREF(folded, PyFrozenSet_New(folded)); - if (folded == NULL) { - return 0; + if (tuple) { + ADDOP_LOAD_CONST_NEW(c, folded); + } else { + if (add == SET_ADD) { + Py_SETREF(folded, PyFrozenSet_New(folded)); + if (folded == NULL) { + return 0; + } } + ADDOP_I(c, build, pushed); + ADDOP_LOAD_CONST_NEW(c, folded); + ADDOP_I(c, extend, 1); } - ADDOP_LOAD_CONST_NEW(c, folded); - ADDOP_I(c, outer_op, 1); return 1; } + for (i = 0; i < n; i++) { expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nseen = 0; - nsubitems++; + seen_star = 1; + } + } + if (seen_star) { + seen_star = 0; + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); + if (elt->kind == Starred_kind) { + if (seen_star == 0) { + ADDOP_I(c, build, i+pushed); + seen_star = 1; + } + VISIT(c, expr, elt->v.Starred.value); + ADDOP_I(c, extend, 1); + } + else { + VISIT(c, expr, elt); + if (seen_star) { + ADDOP_I(c, add, 1); + } } - VISIT(c, expr, elt->v.Starred.value); - nsubitems++; } - else { + assert(seen_star); + if (tuple) { + ADDOP(c, LIST_TO_TUPLE); + } + } + else { + for (i = 0; i < n; i++) { + expr_ty elt = asdl_seq_GET(elts, i); VISIT(c, expr, elt); - nseen++; + } + if (tuple) { + ADDOP_I(c, BUILD_TUPLE, n+pushed); + } else { + ADDOP_I(c, build, n+pushed); } } - if (nsubitems) { - if (nseen) { - ADDOP_I(c, inner_op, nseen); - nsubitems++; - } - ADDOP_I(c, outer_op, nsubitems); - } - else - ADDOP_I(c, single_op, nseen); return 1; } @@ -3767,8 +3790,8 @@ compiler_list(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.List.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_LIST, BUILD_TUPLE, BUILD_LIST_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 0); } else VISIT_SEQ(c, expr, elts); @@ -3783,8 +3806,8 @@ compiler_tuple(struct compiler *c, expr_ty e) return assignment_helper(c, elts); } else if (e->v.Tuple.ctx == Load) { - return starunpack_helper(c, elts, - BUILD_TUPLE, BUILD_TUPLE, BUILD_TUPLE_UNPACK); + return starunpack_helper(c, elts, 0, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1); } else VISIT_SEQ(c, expr, elts); @@ -3794,8 +3817,8 @@ compiler_tuple(struct compiler *c, expr_ty e) static int compiler_set(struct compiler *c, expr_ty e) { - return starunpack_helper(c, e->v.Set.elts, BUILD_SET, - BUILD_SET, BUILD_SET_UNPACK); + return starunpack_helper(c, e->v.Set.elts, 0, BUILD_SET, + SET_ADD, SET_UPDATE, 0); } static int @@ -4184,57 +4207,65 @@ compiler_call_helper(struct compiler *c, asdl_seq *keywords) { Py_ssize_t i, nseen, nelts, nkwelts; - int mustdictunpack = 0; - - /* the number of tuples and dictionaries on the stack */ - Py_ssize_t nsubargs = 0, nsubkwargs = 0; nelts = asdl_seq_LEN(args); nkwelts = asdl_seq_LEN(keywords); - for (i = 0; i < nkwelts; i++) { - keyword_ty kw = asdl_seq_GET(keywords, i); - if (kw->arg == NULL) { - mustdictunpack = 1; - break; - } - } - - nseen = n; /* the number of positional arguments on the stack */ for (i = 0; i < nelts; i++) { expr_ty elt = asdl_seq_GET(args, i); if (elt->kind == Starred_kind) { - /* A star-arg. If we've seen positional arguments, - pack the positional arguments into a tuple. */ - if (nseen) { - ADDOP_I(c, BUILD_TUPLE, nseen); - nseen = 0; - nsubargs++; - } - VISIT(c, expr, elt->v.Starred.value); - nsubargs++; + goto ex_call; } - else { - VISIT(c, expr, elt); - nseen++; + } + for (i = 0; i < nkwelts; i++) { + keyword_ty kw = asdl_seq_GET(keywords, i); + if (kw->arg == NULL) { + goto ex_call; } } - /* Same dance again for keyword arguments */ - if (nsubargs || mustdictunpack) { - if (nseen) { - /* Pack up any trailing positional arguments. */ - ADDOP_I(c, BUILD_TUPLE, nseen); - nsubargs++; + /* No * or ** args, so can use faster calling sequence */ + for (i = 0; i < nelts; i++) { + expr_ty elt = asdl_seq_GET(args, i); + assert(elt->kind != Starred_kind); + VISIT(c, expr, elt); + } + if (nkwelts) { + PyObject *names; + VISIT_SEQ(c, keyword, keywords); + names = PyTuple_New(nkwelts); + if (names == NULL) { + return 0; } - if (nsubargs > 1) { - /* If we ended up with more than one stararg, we need - to concatenate them into a single sequence. */ - ADDOP_I(c, BUILD_TUPLE_UNPACK_WITH_CALL, nsubargs); - } - else if (nsubargs == 0) { - ADDOP_I(c, BUILD_TUPLE, 0); + for (i = 0; i < nkwelts; i++) { + keyword_ty kw = asdl_seq_GET(keywords, i); + Py_INCREF(kw->arg); + PyTuple_SET_ITEM(names, i, kw->arg); } + ADDOP_LOAD_CONST_NEW(c, names); + ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); + return 1; + } + else { + ADDOP_I(c, CALL_FUNCTION, n + nelts); + return 1; + } + +ex_call: + + /* Do positional arguments. */ + if (n ==0 && nelts == 1 && ((expr_ty)asdl_seq_GET(args, 0))->kind == Starred_kind) { + VISIT(c, expr, ((expr_ty)asdl_seq_GET(args, 0))->v.Starred.value); + } + else if (starunpack_helper(c, args, n, BUILD_LIST, + LIST_APPEND, LIST_EXTEND, 1) == 0) { + return 0; + } + /* Then keyword arguments */ + if (nkwelts) { + /* the number of dictionaries on the stack */ + Py_ssize_t nsubkwargs = 0; + nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { keyword_ty kw = asdl_seq_GET(keywords, i); @@ -4263,29 +4294,9 @@ compiler_call_helper(struct compiler *c, /* Pack it all up */ ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); } - ADDOP_I(c, CALL_FUNCTION_EX, nsubkwargs > 0); - return 1; - } - else if (nkwelts) { - PyObject *names; - VISIT_SEQ(c, keyword, keywords); - names = PyTuple_New(nkwelts); - if (names == NULL) { - return 0; - } - for (i = 0; i < nkwelts; i++) { - keyword_ty kw = asdl_seq_GET(keywords, i); - Py_INCREF(kw->arg); - PyTuple_SET_ITEM(names, i, kw->arg); - } - ADDOP_LOAD_CONST_NEW(c, names); - ADDOP_I(c, CALL_FUNCTION_KW, n + nelts + nkwelts); - return 1; - } - else { - ADDOP_I(c, CALL_FUNCTION, n + nelts); - return 1; } + ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); + return 1; } @@ -4860,9 +4871,9 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) ADDOP(c, POP_BLOCK); compiler_pop_fblock(c, WITH, block); - + /* End of body; start the cleanup. */ - + /* For successful outcome: * call __exit__(None, None, None) */ @@ -5984,7 +5995,7 @@ makecode(struct compiler *c, struct assembler *a) goto error; } co = PyCode_NewWithPosOnlyArgs(posonlyargcount+posorkeywordargcount, - posonlyargcount, kwonlyargcount, nlocals_int, + posonlyargcount, kwonlyargcount, nlocals_int, maxdepth, flags, bytecode, consts, names, varnames, freevars, cellvars, c->c_filename, c->u->u_name, c->u->u_firstlineno, a->a_lnotab); diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 52783fc6213..e8e99da093d 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -278,7 +278,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, - 0,105,95,13,0,0,114,27,0,0,0,114,16,0,0,0, + 0,105,96,13,0,0,114,27,0,0,0,114,16,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, @@ -392,7 +392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101, 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, - 115,111,117,114,99,101,42,1,0,0,115,72,0,0,0,0, + 115,111,117,114,99,101,44,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, @@ -473,7 +473,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,108, 101,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, - 109,95,99,97,99,104,101,113,1,0,0,115,52,0,0,0, + 109,95,99,97,99,104,101,115,1,0,0,115,52,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,18,2,10,1, 8,1,16,1,10,1,16,1,10,1,14,2,16,1,10,1, @@ -508,7 +508,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,116,101,110,115,105,111,110,218,11,115,111,117,114,99, 101,95,112,97,116,104,114,3,0,0,0,114,3,0,0,0, 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, - 99,101,102,105,108,101,153,1,0,0,115,20,0,0,0,0, + 99,101,102,105,108,101,155,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, @@ -521,7 +521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,112,108,101,114,101,0,0,0,114,97,0,0,0,114,81, 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, - 95,103,101,116,95,99,97,99,104,101,100,172,1,0,0,115, + 95,103,101,116,95,99,97,99,104,101,100,174,1,0,0,115, 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,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, @@ -536,7 +536,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,184,1,0,0,115,12,0,0,0,0,2,2,1,14, + 100,101,186,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, @@ -561,2173 +561,2173 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,66,0,0,0,124,1,100,0,117, + 0,0,31,0,0,0,115,68,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,102,2,124,2,158,2,124,3,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,3,0,0,0,114,6,0,0,0,218,19,95,99,104, - 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, - 204,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,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,66,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,5,95,119, - 114,97,112,215,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,3,0,0,0,114,121,0,0,0,114,6,0,0, - 0,218,11,95,99,104,101,99,107,95,110,97,109,101,196,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,72,0,0,0,41,6,218,11,102,105,110,100,95, - 108,111,97,100,101,114,114,22,0,0,0,114,74,0,0,0, - 114,75,0,0,0,114,61,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,102,105,110,100,95,109,111,100,117,108,101,95,115, - 104,105,109,224,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,158,0,0,0,124,0,100,1,100,2,133, - 2,25,0,125,3,124,3,116,0,107,3,114,60,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,124, - 2,142,1,130,1,116,4,124,0,131,1,100,6,107,0,114, - 102,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,154,100,10,124,5,155,2,100,11,124, - 1,155,2,157,4,125,4,116,3,124,4,102,1,124,2,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, + 1,103,2,124,2,162,1,82,0,124,3,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,3,0,0,0,114,6,0,0,0,218,19,95, + 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, + 101,114,206,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,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,66,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,5, + 95,119,114,97,112,217,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,3,0,0,0,114,121,0,0,0,114,6, + 0,0,0,218,11,95,99,104,101,99,107,95,110,97,109,101, + 198,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,72,0,0,0,41,6,218,11,102,105,110, + 100,95,108,111,97,100,101,114,114,22,0,0,0,114,74,0, + 0,0,114,75,0,0,0,114,61,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,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,17,95,102,105,110,100,95,109,111,100,117,108,101, + 95,115,104,105,109,226,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,158,0,0,0,124,0,100,1,100, + 2,133,2,25,0,125,3,124,3,116,0,107,3,114,60,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,124,2,142,1,130,1,116,4,124,0,131,1,100,6,107, + 0,114,102,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,154,100,10,124,5,155,2,100, + 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,124, + 2,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, - 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,15,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,22,0,0,0,218,8,69,79,70,69,114,114,111,114, - 114,26,0,0,0,41,6,114,25,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,82,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 95,99,108,97,115,115,105,102,121,95,112,121,99,241,1,0, - 0,115,28,0,0,0,0,16,12,1,8,1,16,1,12,1, - 12,1,12,1,10,1,12,1,8,1,16,2,8,1,16,1, - 12,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,112,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,58,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,124,4,142,1,130,1,124, - 2,100,6,117,1,114,108,116,0,124,0,100,2,100,7,133, - 2,25,0,131,1,124,2,100,3,64,0,107,3,114,108,116, - 3,100,4,124,3,155,2,157,2,102,1,124,4,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,14,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,26,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,117,0,0,0,41,6,114,25,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,3,0,0, - 0,114,3,0,0,0,114,6,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,18,2,0,0,115,16,0,0,0,0,19,24, - 1,10,1,12,1,12,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,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,100,1,100,2,133,2,25,0,124,1,107,3,114,34, - 116,0,100,3,124,2,155,2,157,2,102,1,124,3,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,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 18,95,118,97,108,105,100,97,116,101,95,104,97,115,104,95, - 112,121,99,46,2,0,0,115,12,0,0,0,0,17,16,1, - 2,1,8,255,2,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,43,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,61,0,0,0,41,5,114,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,17,95,99,111,109,112,105,108,101,95,98,121,116,101,99, - 111,100,101,70,2,0,0,115,20,0,0,0,0,2,10,1, - 10,1,12,1,8,1,12,1,4,2,10,1,2,0,2,255, - 114,165,0,0,0,114,72,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,72,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,20,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,25,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,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,83,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, - 38,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,20,0,0,0,114, - 22,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,25,0,0,0,114,82,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,17,95,99, - 111,100,101,95,116,111,95,104,97,115,104,95,112,121,99,93, - 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,72,0,0,0,78,84,41,7,218,8,116, - 111,107,101,110,105,122,101,114,63,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,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,13,100,101,99,111,100, - 101,95,115,111,117,114,99,101,104,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,12,1,0, - 0,124,1,100,1,117,0,114,58,100,2,125,1,116,0,124, - 2,100,3,131,2,114,68,122,14,124,2,160,1,124,0,161, - 1,125,1,87,0,113,68,4,0,116,2,121,54,1,0,1, - 0,1,0,89,0,113,68,48,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,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,104,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,222,122,14,124,2,160, - 13,124,0,161,1,125,7,87,0,110,18,4,0,116,2,121, - 202,1,0,1,0,1,0,89,0,113,222,48,0,124,7,114, - 222,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,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,72,0,0,0,41,17,114,128,0,0,0,114,179, - 0,0,0,114,117,0,0,0,114,2,0,0,0,114,78,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,46,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,3,0,0,0,114,3,0,0, - 0,114,6,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,121, - 2,0,0,115,62,0,0,0,0,12,8,4,4,1,10,2, - 2,1,14,1,12,1,8,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,54,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,100,0,83,0,114,109,0,0,0,41,5,218,7, - 95,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,49,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,5,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,14,95,111,112,101,110,95,114, - 101,103,105,115,116,114,121,201,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,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,27,0,0,0,41, - 2,114,139,0,0,0,90,11,115,121,115,95,118,101,114,115, - 105,111,110,114,39,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,61,0,0,0,114,8, - 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,49,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,5,0,0,0,90,4,104,107,101, - 121,218,8,102,105,108,101,112,97,116,104,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,16,95,115,101,97, - 114,99,104,95,114,101,103,105,115,116,114,121,208,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, - 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,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,52,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,113,62,100,0,83,0,41,2,78,114, - 180,0,0,0,41,8,114,200,0,0,0,114,48,0,0,0, - 114,49,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,43,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,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,223,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,34,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,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,43,0,0,0,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,239,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,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,191,0,0, - 0,189,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,38, - 0,0,0,114,70,0,0,0,114,72,0,0,0,114,27,0, - 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,46, - 0,0,0,114,179,0,0,0,114,42,0,0,0,114,40,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,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,2,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,3,0, - 0,0,169,2,114,118,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,10,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,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,61, - 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, + 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,15,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,22,0,0,0,218,8,69,79,70,69,114,114, + 111,114,114,26,0,0,0,41,6,114,25,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,82,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,243, + 1,0,0,115,28,0,0,0,0,16,12,1,8,1,16,1, + 12,1,12,1,12,1,10,1,12,1,8,1,16,2,8,1, + 16,1,12,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,112,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,58,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,124,4,142,1,130, + 1,124,2,100,6,117,1,114,108,116,0,124,0,100,2,100, + 7,133,2,25,0,131,1,124,2,100,3,64,0,107,3,114, + 108,116,3,100,4,124,3,155,2,157,2,102,1,124,4,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, + 14,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,26,0,0,0,114,134, + 0,0,0,114,149,0,0,0,114,117,0,0,0,41,6,114, + 25,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,3, + 0,0,0,114,3,0,0,0,114,6,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,20,2,0,0,115,16,0,0,0,0, + 19,24,1,10,1,12,1,12,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,3,0,0,0,67,0,0,0,115,38,0, + 0,0,124,0,100,1,100,2,133,2,25,0,124,1,107,3, + 114,34,116,0,100,3,124,2,155,2,157,2,102,1,124,3, + 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,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,101,120,101,99,95,109,111,100,117,108,101,13,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,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,108,111,97, - 100,95,109,111,100,117,108,101,21,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,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,208,0, - 0,0,253,2,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,49,0,0,0,169,2,114,118,0,0,0, - 114,43,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 28,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,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,112,97,116,104,95,115,116,97,116, - 115,36,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,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,25,0,0,0, + 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115, + 104,95,112,121,99,48,2,0,0,115,12,0,0,0,0,17, + 16,1,2,1,8,255,2,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,43,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,61,0,0,0,41,5,114,25,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,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,116, + 101,99,111,100,101,72,2,0,0,115,20,0,0,0,0,2, + 10,1,10,1,12,1,8,1,12,1,4,2,10,1,2,0, + 2,255,114,165,0,0,0,114,72,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, + 72,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,20, + 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,25,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,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,85,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,38,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,20,0,0, + 0,114,22,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,25,0,0,0,114,82,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, + 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, + 99,95,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,72,0,0,0,78,84,41,7,218, + 8,116,111,107,101,110,105,122,101,114,63,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,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,13,100,101,99, + 111,100,101,95,115,111,117,114,99,101,106,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,12, + 1,0,0,124,1,100,1,117,0,114,58,100,2,125,1,116, + 0,124,2,100,3,131,2,114,68,122,14,124,2,160,1,124, + 0,161,1,125,1,87,0,113,68,4,0,116,2,121,54,1, + 0,1,0,1,0,89,0,113,68,48,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,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, + 104,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,222,122,14,124, + 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, + 2,121,202,1,0,1,0,1,0,89,0,113,222,48,0,124, + 7,114,222,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,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,72,0,0,0,41,17,114,128,0,0,0, + 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, + 78,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,46,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,3,0,0,0,114,3, + 0,0,0,114,6,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,123,2,0,0,115,62,0,0,0,0,12,8,4,4,1, + 10,2,2,1,14,1,12,1,8,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,54, + 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,100,0,83,0,114,109,0,0,0,41,5, + 218,7,95,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,49,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,5,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,14,95,111,112,101,110, + 95,114,101,103,105,115,116,114,121,203,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,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,27,0,0, + 0,41,2,114,139,0,0,0,90,11,115,121,115,95,118,101, + 114,115,105,111,110,114,39,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,61,0,0,0, + 114,8,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,49,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,5,0,0,0,90,4,104, + 107,101,121,218,8,102,105,108,101,112,97,116,104,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,115, + 101,97,114,99,104,95,114,101,103,105,115,116,114,121,210,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,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,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,52,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,113,62,100,0,83,0,41,2, + 78,114,180,0,0,0,41,8,114,200,0,0,0,114,48,0, + 0,0,114,49,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,43,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,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,9,102,105,110,100,95, + 115,112,101,99,225,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,34,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,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,43,0,0,0,114,187,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,11,102,105, + 110,100,95,109,111,100,117,108,101,241,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,3,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,191, + 0,0,0,191,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,38,0,0,0,114,70,0,0,0,114,72,0,0,0,114, + 27,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, + 114,46,0,0,0,114,179,0,0,0,114,42,0,0,0,114, + 40,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, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,182, + 0,0,0,4,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, + 3,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 15,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, - 50,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,3,0,0,0,41,3,114,118,0, - 0,0,114,43,0,0,0,114,25,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,0, - 60,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,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,49,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,43,0,0,0,114,174,0,0, - 0,218,3,101,120,99,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,67,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,25,0,0,0,114, - 43,0,0,0,114,230,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,14,115,111,117,114,99,101, - 95,116,111,95,99,111,100,101,77,3,0,0,115,8,0,0, - 0,0,5,12,1,2,0,2,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,38,0,0,0,114,72,0,0,0,114,27,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,81,0,0,0,114,224,0,0,0,114, - 49,0,0,0,114,17,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,8,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, - 22,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,25,0,0, - 0,114,151,0,0,0,114,82,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,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,213,0,0,0,85,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,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,221,0,0,0,26,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,124,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,100,16,100,17, - 132,0,90,12,100,18,100,19,132,0,90,13,100,20,100,21, - 132,0,90,14,100,22,100,23,132,0,90,15,135,0,4,0, - 90,16,83,0,41,24,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,43,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,209, - 0,0,0,175,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 6,95,95,101,113,95,95,181,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,43,0, - 0,0,169,1,114,118,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,104,97,115,104, - 95,95,185,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,3,0,0,0,114,6,0,0, - 0,114,220,0,0,0,188,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,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,47,0,0,0, - 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,179,0,0,0,200,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,63,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,64,0,0,0,41,3,114,118,0,0,0, - 114,43,0,0,0,114,67,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,227,0,0,0,205,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,2,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,160,0,124,1,161,1,114,14,124,0, - 83,0,100,0,83,0,114,109,0,0,0,41,1,114,182,0, - 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,19,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,216,3,0,0,115,6,0,0,0,0,2,10,1,4, - 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,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,32,0,0,0,116, - 0,116,1,124,0,106,2,131,1,100,1,25,0,124,1,131, - 2,125,2,116,3,160,4,124,2,100,2,161,2,83,0,41, - 3,78,114,72,0,0,0,114,251,0,0,0,41,5,114,37, - 0,0,0,114,46,0,0,0,114,43,0,0,0,114,63,0, - 0,0,114,64,0,0,0,169,3,114,118,0,0,0,90,8, - 114,101,115,111,117,114,99,101,114,43,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,111,112, - 101,110,95,114,101,115,111,117,114,99,101,222,3,0,0,115, - 4,0,0,0,0,1,20,1,122,24,70,105,108,101,76,111, - 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, - 99,101,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,38,0,0,0, - 124,0,160,0,124,1,161,1,115,14,116,1,130,1,116,2, - 116,3,124,0,106,4,131,1,100,1,25,0,124,1,131,2, - 125,2,124,2,83,0,169,2,78,114,72,0,0,0,41,5, - 218,11,105,115,95,114,101,115,111,117,114,99,101,218,17,70, - 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, - 255,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, - 116,104,226,3,0,0,115,8,0,0,0,0,1,10,1,4, - 1,20,1,122,24,70,105,108,101,76,111,97,100,101,114,46, - 114,101,115,111,117,114,99,101,95,112,97,116,104,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,40,0,0,0,116,0,124,1,118, - 0,114,12,100,1,83,0,116,1,116,2,124,0,106,3,131, - 1,100,2,25,0,124,1,131,2,125,2,116,4,124,2,131, - 1,83,0,41,3,78,70,114,72,0,0,0,41,5,114,34, - 0,0,0,114,37,0,0,0,114,46,0,0,0,114,43,0, - 0,0,114,53,0,0,0,169,3,114,118,0,0,0,114,116, - 0,0,0,114,43,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,2,1,0,0,232,3,0,0, - 115,8,0,0,0,0,1,8,1,4,1,20,1,122,22,70, - 105,108,101,76,111,97,100,101,114,46,105,115,95,114,101,115, - 111,117,114,99,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,24, - 0,0,0,116,0,116,1,160,2,116,3,124,0,106,4,131, - 1,100,1,25,0,161,1,131,1,83,0,114,1,1,0,0, - 41,5,218,4,105,116,101,114,114,2,0,0,0,218,7,108, - 105,115,116,100,105,114,114,46,0,0,0,114,43,0,0,0, - 114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,99,111,110,116,101,110,116,115,238,3, - 0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,76, - 111,97,100,101,114,46,99,111,110,116,101,110,116,115,41,17, - 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,114,0,1,0, - 0,114,4,1,0,0,114,2,1,0,0,114,8,1,0,0, - 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, - 3,0,0,0,114,3,0,0,0,114,249,0,0,0,114,6, - 0,0,0,114,239,0,0,0,170,3,0,0,115,30,0,0, - 0,8,2,4,3,8,6,8,4,8,3,2,1,14,11,2, - 1,10,4,8,11,2,1,10,5,8,4,8,6,8,6,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,48,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,43,0,0,0,114, - 238,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,224,0,0,0,246,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,25,0,0,0,114,51,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,226,0,0,0,251, - 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,59, - 0,0,0,114,11,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,252,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,104,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,113,60,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,52,4,0,116,8,144,0, - 121,246,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, - 46,0,0,0,114,55,0,0,0,114,186,0,0,0,114,41, - 0,0,0,114,37,0,0,0,114,2,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,49,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,68,0,0,0,41,9,114,118,0,0,0, - 114,43,0,0,0,114,25,0,0,0,114,12,1,0,0,218, - 6,112,97,114,101,110,116,114,96,0,0,0,114,36,0,0, - 0,114,32,0,0,0,114,228,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,225,0,0,0,0, - 4,0,0,115,48,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,2,0,2,255,4,2,28,1,2,1,12,1, - 16,1,16,2,8,1,2,255,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,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,9,1, - 0,0,242,3,0,0,115,8,0,0,0,8,2,4,2,8, - 5,8,5,114,9,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,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, - 43,0,0,0,114,25,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, - 0,0,35,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, + 13,99,114,101,97,116,101,95,109,111,100,117,108,101,12,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,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,61,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,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101, + 15,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,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,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,229,0,0,0,51,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,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,15,1, - 0,0,31,4,0,0,115,6,0,0,0,8,2,4,2,8, - 16,114,15,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,114,5, - 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,68,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,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,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,243,0,0,0,72,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,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,247,0,0,0,76,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,43,0,0,0,41,3,114,118,0,0,0,114, - 187,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,212,0,0,0,79,4,0, - 0,115,18,0,0,0,0,2,4,1,4,0,2,255,4,2, - 6,1,4,0,4,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,43,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,87,4,0,0,115,10,0,0,0,0,2,14,1,6,1, - 4,0,4,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,38,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,3,0,0,0,169,2,114,31,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,3,0,0,0,114,6,0,0,0,218,9,60,103, - 101,110,101,120,112,114,62,96,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,120,112,114,62,41,4,114,46,0,0,0,114,43, - 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,3,0,0,0,114,18,1,0,0,114,6,0,0,0, - 114,182,0,0,0,93,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,3,0,0, - 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,213,0,0,0,99,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, - 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,229,0,0,0,103,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,47,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,107, - 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,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,252,0,0,0,60,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,43,0,0,0,90,11,112,97,116,104,95,102,105,110,100, - 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,209,0,0,0,120,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,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,70,0,0,0,114,39,0,0,0, - 41,2,114,8,0,0,0,114,43,0,0,0,90,8,95,95, - 112,97,116,104,95,95,41,2,114,23,1,0,0,114,40,0, - 0,0,41,4,114,118,0,0,0,114,14,1,0,0,218,3, - 100,111,116,90,2,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,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,126, - 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,30,1,0,0,114,130, - 0,0,0,114,8,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,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,25,1,0,0, - 136,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,25,1,0,0,114,26,1, - 0,0,114,27,1,0,0,114,23,1,0,0,114,140,0,0, - 0,114,178,0,0,0,114,24,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,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, - 101,140,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,114,6,1,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,95,95,105,116,101,114,95,95, - 153,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,32,1,0,0,41,2,114,118,0,0, - 0,218,5,105,110,100,101,120,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,95,95,103,101,116,105,116, - 101,109,95,95,156,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,24, - 1,0,0,41,3,114,118,0,0,0,114,35,1,0,0,114, - 43,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, - 159,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,22,0,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,7,95,95,108,101,110,95,95,162, - 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,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,61,0,0,0,114,24,1,0, - 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,114,101,112,114,95,95,165, - 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,34,1,0,0,169,2,114,118,0,0,0,218,4, - 105,116,101,109,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,168,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,24, - 1,0,0,114,186,0,0,0,114,40,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,186,0,0, - 0,171,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, - 30,1,0,0,114,25,1,0,0,114,32,1,0,0,114,33, - 1,0,0,114,36,1,0,0,114,37,1,0,0,114,38,1, - 0,0,114,39,1,0,0,114,42,1,0,0,114,186,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,22,1,0,0,113,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,22,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,22,1,0,0,114,24, - 1,0,0,114,28,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,209,0,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,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,61,0,0,0,114,125,0,0,0,41,2,114,193,0,0, - 0,114,216,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, - 112,114,180,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,189, - 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,39,0,0, - 0,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,192, - 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,39,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,195,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,3,0,0,0,114,211,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,198, - 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,3,0,0,0,114,253,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,217,0,0,0,201, - 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,24,1,0,0,114, - 218,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,220,0,0,0,204,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,0,0,114,124,0,0,0,114,126,0,0,0,114,209, - 0,0,0,114,207,0,0,0,114,44,1,0,0,114,182,0, - 0,0,114,229,0,0,0,114,213,0,0,0,114,212,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,108, + 111,97,100,95,109,111,100,117,108,101,23,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,3,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 43,1,0,0,176,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, - 43,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,8,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,46,1,0,0,41,3,114,193, - 0,0,0,114,116,0,0,0,218,6,102,105,110,100,101,114, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 46,1,0,0,222,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,82, - 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,42,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,113, - 34,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,8,0,0,0,218,10,112,97,116,104,95,104, - 111,111,107,115,114,74,0,0,0,114,75,0,0,0,114,138, - 0,0,0,114,117,0,0,0,41,3,114,193,0,0,0,114, - 43,0,0,0,90,4,104,111,111,107,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,112,97,116,104, - 95,104,111,111,107,115,232,4,0,0,115,16,0,0,0,0, - 3,16,1,12,1,10,1,2,1,14,1,12,1,12,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, - 39,0,0,0,78,41,7,114,2,0,0,0,114,54,0,0, - 0,114,3,1,0,0,114,8,0,0,0,114,48,1,0,0, - 218,8,75,101,121,69,114,114,111,114,114,52,1,0,0,41, - 3,114,193,0,0,0,114,43,0,0,0,114,50,1,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,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,245,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,50, - 1,0,0,114,140,0,0,0,114,141,0,0,0,114,187,0, + 208,0,0,0,255,2,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,49,0,0,0,169,2,114,118,0, + 0,0,114,43,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,10,112,97,116,104,95,109,116,105, + 109,101,30,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,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,10,112,97,116,104,95,115,116, + 97,116,115,38,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,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,25,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,16,95,108,101,103,97,99,121,95,103,101,116,95,115, - 112,101,99,11,5,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,54,1,0,0,114,128,0,0,0,114,203,0,0,0, - 114,55,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, - 43,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,50,1,0,0,114,187,0,0,0,114,141,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 95,103,101,116,95,115,112,101,99,26,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,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,100,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,92, - 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,110,4,124,4,83,0,100,1, - 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,8,0,0,0,114,43,0,0,0, - 114,58,1,0,0,114,140,0,0,0,114,178,0,0,0,114, - 181,0,0,0,114,22,1,0,0,41,6,114,193,0,0,0, - 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,114, - 187,0,0,0,114,57,1,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,203,0,0,0,58,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,6,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,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,82, - 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,3,0,0,0,79,0,0, - 0,115,24,0,0,0,100,1,100,2,108,0,109,1,125,3, - 1,0,124,3,106,2,124,1,124,2,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,72,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,59,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,59,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,60,1,0,0,95,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,46,1,0,0,114, - 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, - 1,0,0,114,203,0,0,0,114,206,0,0,0,114,60,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,45,1,0,0,218,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,45,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,3,0,0,0,114,16,1, - 0,0,169,1,114,140,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,19,1,0,0,124,5,0,0,115,4,0,0, - 0,4,0,2,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,70,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,43,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,43,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,3,0,0, - 0,114,62,1,0,0,114,6,0,0,0,114,209,0,0,0, - 118,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,64,1,0,0,114,246,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,132, - 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,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,137,0,0,0, - 138,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,43,0,0,0,90,4,115,109,115,108,114,202,0,0, - 0,114,140,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,58,1,0,0,150,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,96,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,216,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,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,113,148, - 116,17,124,8,131,1,125,3,124,0,106,14,68,0,93,82, - 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,222,116,15,124,12,131,1,114,222,124,0,160,16,124,10, - 124,1,124,12,100,8,124,2,161,5,2,0,1,0,83,0, - 113,222,124,3,144,1,114,92,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,70,0,0,0,114,27,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,40, - 0,0,0,114,48,0,0,0,114,43,0,0,0,114,2,0, - 0,0,114,54,0,0,0,114,10,1,0,0,114,49,0,0, - 0,114,64,1,0,0,218,11,95,102,105,108,108,95,99,97, - 99,104,101,114,7,0,0,0,114,67,1,0,0,114,105,0, - 0,0,114,66,1,0,0,114,37,0,0,0,114,63,1,0, - 0,114,53,0,0,0,114,58,1,0,0,114,55,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,17,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,203,0, - 0,0,155,5,0,0,115,74,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,26,4,8,2,14,1,16,1,16,1,12, - 1,8,1,10,1,2,0,2,255,10,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,70,0,0,0,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,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,3, - 0,0,0,41,1,114,105,0,0,0,41,2,114,31,0,0, - 0,90,2,102,110,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,9,60,115,101,116,99,111,109,112,62,232, - 5,0,0,115,4,0,0,0,6,0,2,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,43,0,0,0,114, - 2,0,0,0,114,7,1,0,0,114,54,0,0,0,114,3, - 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,8,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,65,1,0,0,114,66,1,0, - 0,114,100,0,0,0,114,61,0,0,0,114,105,0,0,0, - 218,3,97,100,100,114,11,0,0,0,114,67,1,0,0,41, - 9,114,118,0,0,0,114,43,0,0,0,114,8,1,0,0, - 90,21,108,111,119,101,114,95,115,117,102,102,105,120,95,99, - 111,110,116,101,110,116,115,114,41,1,0,0,114,116,0,0, - 0,114,29,1,0,0,114,17,1,0,0,90,8,110,101,119, - 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,69,1,0,0,203,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,34,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,102,1,136, - 1,158,2,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,47,0,0,0,41,2,114, - 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, - 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, - 6,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,244,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,3,0,0,0,41,3,114,193,0,0, - 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, - 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, - 95,104,111,111,107,234,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,61,0,0,0,114,43, - 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,39,1,0,0,252,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,46,1,0,0,114, - 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, - 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, - 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, + 0,218,15,95,99,97,99,104,101,95,98,121,116,101,99,111, + 100,101,52,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,3,0,0,0,41,3,114, + 118,0,0,0,114,43,0,0,0,114,25,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0, + 0,0,62,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,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,49, + 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,43,0,0,0,114,174, + 0,0,0,218,3,101,120,99,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, + 114,99,101,69,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,25,0,0, + 0,114,43,0,0,0,114,230,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,115,111,117,114, + 99,101,95,116,111,95,99,111,100,101,79,3,0,0,115,8, + 0,0,0,0,5,12,1,2,0,2,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,38,0,0,0,114,72,0,0,0,114,27,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,81,0,0,0,114,224,0,0, + 0,114,49,0,0,0,114,17,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,8,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,22,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,25, + 0,0,0,114,151,0,0,0,114,82,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,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,213,0,0,0,87,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,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,221,0,0,0, + 28,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,124,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,100,16, + 100,17,132,0,90,12,100,18,100,19,132,0,90,13,100,20, + 100,21,132,0,90,14,100,22,100,23,132,0,90,15,135,0, + 4,0,90,16,83,0,41,24,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,43,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,61,1,0,0,109,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,61,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,62,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,15,1,0,0,114,9,1,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,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, - 95,117,112,95,109,111,100,117,108,101,2,6,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,81,1,0,0,99,0,0,0,0,0, + 114,209,0,0,0,177,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,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,6,95,95,101,113,95,95,183,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, + 43,0,0,0,169,1,114,118,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,8,95,95,104,97, + 115,104,95,95,187,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,3,0,0,0,114,6, + 0,0,0,114,220,0,0,0,190,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,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,47,0, + 0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,179,0,0,0,202,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,63,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,64,0,0,0,41,3,114,118,0, + 0,0,114,43,0,0,0,114,67,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,227,0,0,0, + 207,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,2,0,0,0,3,0,0,0,67,0,0, + 0,115,18,0,0,0,124,0,160,0,124,1,161,1,114,14, + 124,0,83,0,100,0,83,0,114,109,0,0,0,41,1,114, + 182,0,0,0,169,2,114,118,0,0,0,114,216,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,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,0,2,10, + 1,4,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,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,32,0,0, + 0,116,0,116,1,124,0,106,2,131,1,100,1,25,0,124, + 1,131,2,125,2,116,3,160,4,124,2,100,2,161,2,83, + 0,41,3,78,114,72,0,0,0,114,251,0,0,0,41,5, + 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, + 63,0,0,0,114,64,0,0,0,169,3,114,118,0,0,0, + 90,8,114,101,115,111,117,114,99,101,114,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, + 111,112,101,110,95,114,101,115,111,117,114,99,101,224,3,0, + 0,115,4,0,0,0,0,1,20,1,122,24,70,105,108,101, + 76,111,97,100,101,114,46,111,112,101,110,95,114,101,115,111, + 117,114,99,101,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,38,0, + 0,0,124,0,160,0,124,1,161,1,115,14,116,1,130,1, + 116,2,116,3,124,0,106,4,131,1,100,1,25,0,124,1, + 131,2,125,2,124,2,83,0,169,2,78,114,72,0,0,0, + 41,5,218,11,105,115,95,114,101,115,111,117,114,99,101,218, + 17,70,105,108,101,78,111,116,70,111,117,110,100,69,114,114, + 111,114,114,37,0,0,0,114,46,0,0,0,114,43,0,0, + 0,114,255,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,13,114,101,115,111,117,114,99,101,95, + 112,97,116,104,228,3,0,0,115,8,0,0,0,0,1,10, + 1,4,1,20,1,122,24,70,105,108,101,76,111,97,100,101, + 114,46,114,101,115,111,117,114,99,101,95,112,97,116,104,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,40,0,0,0,116,0,124, + 1,118,0,114,12,100,1,83,0,116,1,116,2,124,0,106, + 3,131,1,100,2,25,0,124,1,131,2,125,2,116,4,124, + 2,131,1,83,0,41,3,78,70,114,72,0,0,0,41,5, + 114,34,0,0,0,114,37,0,0,0,114,46,0,0,0,114, + 43,0,0,0,114,53,0,0,0,169,3,114,118,0,0,0, + 114,116,0,0,0,114,43,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,2,1,0,0,234,3, + 0,0,115,8,0,0,0,0,1,8,1,4,1,20,1,122, + 22,70,105,108,101,76,111,97,100,101,114,46,105,115,95,114, + 101,115,111,117,114,99,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,24,0,0,0,116,0,116,1,160,2,116,3,124,0,106, + 4,131,1,100,1,25,0,161,1,131,1,83,0,114,1,1, + 0,0,41,5,218,4,105,116,101,114,114,2,0,0,0,218, + 7,108,105,115,116,100,105,114,114,46,0,0,0,114,43,0, + 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,8,99,111,110,116,101,110,116,115, + 240,3,0,0,115,2,0,0,0,0,1,122,19,70,105,108, + 101,76,111,97,100,101,114,46,99,111,110,116,101,110,116,115, + 41,17,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,114,0, + 1,0,0,114,4,1,0,0,114,2,1,0,0,114,8,1, + 0,0,90,13,95,95,99,108,97,115,115,99,101,108,108,95, + 95,114,3,0,0,0,114,3,0,0,0,114,249,0,0,0, + 114,6,0,0,0,114,239,0,0,0,172,3,0,0,115,30, + 0,0,0,8,2,4,3,8,6,8,4,8,3,2,1,14, + 11,2,1,10,4,8,11,2,1,10,5,8,4,8,6,8, + 6,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,48,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,43,0,0, + 0,114,238,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,224,0,0,0,248,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,25,0,0,0,114,51,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,226,0,0, + 0,253,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,59,0,0,0,114,11,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,252,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,104,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,113,60,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,52,4,0,116,8, + 144,0,121,246,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,46,0,0,0,114,55,0,0,0,114,186,0,0,0, + 114,41,0,0,0,114,37,0,0,0,114,2,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,49,0,0,0,114,134,0,0, + 0,114,149,0,0,0,114,68,0,0,0,41,9,114,118,0, + 0,0,114,43,0,0,0,114,25,0,0,0,114,12,1,0, + 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,36, + 0,0,0,114,32,0,0,0,114,228,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, + 0,2,4,0,0,115,48,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,2,0,2,255,4,2,28,1,2,1, + 12,1,16,1,16,2,8,1,2,255,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,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 9,1,0,0,244,3,0,0,115,8,0,0,0,8,2,4, + 2,8,5,8,5,114,9,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,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,43,0,0,0,114,25,0,0,0,114,151,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,37,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,229,0,0,0,53,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,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 15,1,0,0,33,4,0,0,115,6,0,0,0,8,2,4, + 2,8,16,114,15,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, + 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,209,0,0,0,70,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,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,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,243,0,0,0,74,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,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,247,0,0,0,78,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,43,0,0,0,41,3,114,118,0,0, + 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,81, + 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, + 4,2,6,1,4,0,4,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,43,0,0,0,114,253,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, + 0,0,0,89,4,0,0,115,10,0,0,0,0,2,14,1, + 6,1,4,0,4,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,38, + 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,3,0,0,0,169,2,114,31,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,3,0,0,0,114,6,0,0,0,218,9, + 60,103,101,110,101,120,112,114,62,98,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,120,112,114,62,41,4,114,46,0,0,0, + 114,43,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,3,0,0,0,114,18,1,0,0,114,6,0, + 0,0,114,182,0,0,0,95,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,3, + 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,101,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,105, + 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,47,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, + 0,109,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,3,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, + 62,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,43,0,0,0,90,11,112,97,116,104,95,102,105, + 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,209,0,0,0,122,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,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,70,0,0,0,114,39,0, + 0,0,41,2,114,8,0,0,0,114,43,0,0,0,90,8, + 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, + 40,0,0,0,41,4,114,118,0,0,0,114,14,1,0,0, + 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,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,128,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,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,9,1,0,0,114,101,0,0,0,114,15,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,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,184,0,0,0,25,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,12,0,0,0, - 9,0,0,0,67,0,0,0,115,176,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,68,0,93,48,125,2,124, - 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, - 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, - 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, - 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, - 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, - 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, - 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, - 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, - 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, - 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, - 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, - 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, - 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, - 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, - 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, - 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, - 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, - 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, - 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, - 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, - 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, - 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, - 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, - 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, - 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,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,41,4, - 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, - 116,105,110,115,114,160,0,0,0,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,38,0,0,0,78,41,1,114,22,0,0, - 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, - 0,61,6,0,0,115,4,0,0,0,4,0,2,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,72,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,2, - 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, - 0,0,114,57,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,73,0, - 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, - 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,70,1,0,0,77,6,0,0,115,4,0,0,0,6,0, + 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,30,1,0,0, + 114,130,0,0,0,114,8,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, + 0,0,138,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,25,1,0,0,114, + 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, + 0,0,0,114,178,0,0,0,114,24,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,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, + 97,116,101,142,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,114,6,1,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, + 95,95,155,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,32,1,0,0,41,2,114,118, + 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, + 105,116,101,109,95,95,158,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,24,1,0,0,41,3,114,118,0,0,0,114,35,1,0, + 0,114,43,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, + 95,95,161,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,22,0,0,0,114, + 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, + 95,164,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,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,61,0,0,0,114,24, + 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, + 95,167,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,34,1,0,0,169,2,114,118,0,0,0, + 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, + 115,95,95,170,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,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, + 0,0,0,173,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,30,1,0,0,114,25,1,0,0,114,32,1,0,0, + 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, + 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,22,1,0,0,115,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,22,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,22,1,0,0, + 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,209,0,0,0,179,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,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,61,0,0,0,114,125,0,0,0,41,2,114,193, + 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, + 114,101,112,114,182,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,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, + 0,191,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,39, + 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, + 0,194,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,39,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,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,213,0,0,0,197,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,3,0,0,0,114,211,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, + 0,200,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,3,0,0,0,114,253,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, + 0,203,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,24,1,0, + 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,206, + 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,0,0,114,124,0,0,0,114,126,0,0,0, + 114,209,0,0,0,114,207,0,0,0,114,44,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,3,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,43,1,0,0,178,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,43,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,8,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,46,1,0,0,41,3, + 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, + 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,46,1,0,0,224,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,82,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,42,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,113,34,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,8,0,0,0,218,10,112,97,116,104, + 95,104,111,111,107,115,114,74,0,0,0,114,75,0,0,0, + 114,138,0,0,0,114,117,0,0,0,41,3,114,193,0,0, + 0,114,43,0,0,0,90,4,104,111,111,107,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, + 116,104,95,104,111,111,107,115,234,4,0,0,115,16,0,0, + 0,0,3,16,1,12,1,10,1,2,1,14,1,12,1,12, + 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,39,0,0,0,78,41,7,114,2,0,0,0,114,54, + 0,0,0,114,3,1,0,0,114,8,0,0,0,114,48,1, + 0,0,218,8,75,101,121,69,114,114,111,114,114,52,1,0, + 0,41,3,114,193,0,0,0,114,43,0,0,0,114,50,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,247,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,50,1,0,0,114,140,0,0,0,114,141,0,0,0,114, + 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116, + 95,115,112,101,99,13,5,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,54,1,0,0,114,128,0,0,0,114,203,0, + 0,0,114,55,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,43,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,50,1,0,0,114,187,0,0,0,114,141,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,9,95,103,101,116,95,115,112,101,99,28,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,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,100,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,92,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,110,4,124,4,83,0, + 100,1,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,8,0,0,0,114,43,0, + 0,0,114,58,1,0,0,114,140,0,0,0,114,178,0,0, + 0,114,181,0,0,0,114,22,1,0,0,41,6,114,193,0, + 0,0,114,139,0,0,0,114,43,0,0,0,114,202,0,0, + 0,114,187,0,0,0,114,57,1,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,60, + 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, + 6,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,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,206,0,0, + 0,84,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,3,0,0,0,79, + 0,0,0,115,24,0,0,0,100,1,100,2,108,0,109,1, + 125,3,1,0,124,3,106,2,124,1,124,2,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,72,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,59,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,59,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,60,1,0,0,97,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,46,1,0, + 0,114,52,1,0,0,114,54,1,0,0,114,55,1,0,0, + 114,58,1,0,0,114,203,0,0,0,114,206,0,0,0,114, + 60,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,45,1,0,0,220,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,45,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,3,0,0,0,114, + 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,19,1,0,0,126,5,0,0,115,4, + 0,0,0,4,0,2,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, + 70,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,43,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,43,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,3, + 0,0,0,114,62,1,0,0,114,6,0,0,0,114,209,0, + 0,0,120,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,64,1,0,0,114,246,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, + 0,134,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, + 0,0,140,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,43,0,0,0,90,4,115,109,115,108,114,202, + 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,58,1,0,0,152,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,96,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,216,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,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, + 113,148,116,17,124,8,131,1,125,3,124,0,106,14,68,0, + 93,82,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,222,116,15,124,12,131,1,114,222,124,0,160,16, + 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, + 83,0,113,222,124,3,144,1,114,92,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,70,0,0,0,114,27,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,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, + 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, + 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, + 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, + 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, + 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,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,17,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 203,0,0,0,157,5,0,0,115,74,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,26,4,8,2,14,1,16,1,16, + 1,12,1,8,1,10,1,2,0,2,255,10,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,70,0,0,0,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,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,3,0,0,0,41,1,114,105,0,0,0,41,2,114,31, + 0,0,0,90,2,102,110,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,9,60,115,101,116,99,111,109,112, + 62,234,5,0,0,115,4,0,0,0,6,0,2,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,43,0,0, + 0,114,2,0,0,0,114,7,1,0,0,114,54,0,0,0, + 114,3,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,8,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,65,1,0,0,114,66, + 1,0,0,114,100,0,0,0,114,61,0,0,0,114,105,0, + 0,0,218,3,97,100,100,114,11,0,0,0,114,67,1,0, + 0,41,9,114,118,0,0,0,114,43,0,0,0,114,8,1, + 0,0,90,21,108,111,119,101,114,95,115,117,102,102,105,120, + 95,99,111,110,116,101,110,116,115,114,41,1,0,0,114,116, + 0,0,0,114,29,1,0,0,114,17,1,0,0,90,8,110, + 101,119,95,110,97,109,101,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,69,1,0,0,205,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,47,0,0, + 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, + 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, + 0,0,0,114,6,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,246,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,3,0,0,0,41,3, + 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, + 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, + 112,97,116,104,95,104,111,111,107,236,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,61,0, + 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, + 254,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,46, + 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, + 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, + 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,61,1,0,0,111,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,61,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,62,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,15,1,0,0, + 114,9,1,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, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,14, + 95,102,105,120,95,117,112,95,109,111,100,117,108,101,4,6, + 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,81,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,9,1,0,0,114,101,0,0,0,114, + 15,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,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,184,0,0,0,27,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, + 12,0,0,0,9,0,0,0,67,0,0,0,115,176,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,68,0,93, + 48,125,2,124,2,116,1,106,3,118,1,114,56,116,0,160, + 5,124,2,161,1,125,3,110,10,116,1,106,3,124,2,25, + 0,125,3,116,6,124,1,124,2,124,3,131,3,1,0,113, + 30,100,2,100,3,103,1,102,2,100,4,100,5,100,3,103, + 2,102,2,102,2,125,4,124,4,68,0,93,108,92,2,125, + 5,125,6,116,7,100,6,100,7,132,0,124,6,68,0,131, + 1,131,1,115,136,74,0,130,1,124,6,100,8,25,0,125, + 7,124,5,116,1,106,3,118,0,114,170,116,1,106,3,124, + 5,25,0,125,8,1,0,113,224,113,106,122,20,116,0,160, + 5,124,5,161,1,125,8,87,0,1,0,113,224,87,0,113, + 106,4,0,116,8,121,212,1,0,1,0,1,0,89,0,113, + 106,89,0,113,106,48,0,113,106,116,8,100,9,131,1,130, + 1,116,6,124,1,100,10,124,8,131,3,1,0,116,6,124, + 1,100,11,124,7,131,3,1,0,116,6,124,1,100,12,100, + 13,160,9,124,6,161,1,131,3,1,0,116,6,124,1,100, + 14,100,15,100,16,132,0,124,6,68,0,131,1,131,3,1, + 0,116,0,160,5,100,17,161,1,125,9,116,6,124,1,100, + 17,124,9,131,3,1,0,116,0,160,5,100,18,161,1,125, + 10,116,6,124,1,100,18,124,10,131,3,1,0,124,5,100, + 4,107,2,144,1,114,108,116,0,160,5,100,19,161,1,125, + 11,116,6,124,1,100,20,124,11,131,3,1,0,116,6,124, + 1,100,21,116,10,131,0,131,3,1,0,116,11,160,12,116, + 2,160,13,161,0,161,1,1,0,124,5,100,4,107,2,144, + 1,114,172,116,14,160,15,100,22,161,1,1,0,100,23,116, + 11,118,0,144,1,114,172,100,24,116,16,95,17,100,25,83, + 0,41,26,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,41,4,114,63,0,0,0,114,74,0,0,0,218,8, + 98,117,105,108,116,105,110,115,114,160,0,0,0,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,38,0,0,0,78,41,1, + 114,22,0,0,0,41,2,114,31,0,0,0,114,94,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,19,1,0,0,63,6,0,0,115,4,0,0,0,4,0, 2,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,90,7,95, - 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, - 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,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,8,0,0,0,114,163, - 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, - 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, - 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, - 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,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, - 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,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,30,0,0,0,114,34,0,0,0,90, - 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, - 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, - 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, - 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,36, - 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, - 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, - 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, - 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, - 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, - 10,1,10,1,10,1,114,89,1,0,0,99,1,0,0,0, + 108,115,62,46,60,103,101,110,101,120,112,114,62,114,72,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,2,0,0,0,114,34,0,0,0,114,30,0,0, + 0,114,39,0,0,0,114,57,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,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,89,1,0,0, - 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, - 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, - 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, - 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, - 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, - 110,115,116,97,108,108,101,6,0,0,115,8,0,0,0,0, - 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, - 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, - 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, - 41,63,114,127,0,0,0,114,12,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,11,0,0,0,114,13,0,0,0,114,20,0, - 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, - 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, - 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, - 68,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,18,0,0,0,114,148, - 0,0,0,114,17,0,0,0,114,23,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,9,1,0,0,114,15,1, - 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, - 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, - 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, - 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,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,17,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,72,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,65, + 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,73,0,0,0,114,3,0,0,0,41,2,114,31,0, + 0,0,218,1,115,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,70,1,0,0,79,6,0,0,115,4,0, + 0,0,6,0,2,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,90,7,95,116,104,114,101,97,100,90,8,95,119,101,97, + 107,114,101,102,90,6,119,105,110,114,101,103,114,192,0,0, + 0,114,7,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,8,0, + 0,0,114,163,0,0,0,114,31,1,0,0,114,125,0,0, + 0,90,18,95,98,117,105,108,116,105,110,95,102,114,111,109, + 95,110,97,109,101,114,129,0,0,0,218,3,97,108,108,114, + 117,0,0,0,114,35,0,0,0,114,13,0,0,0,114,21, + 1,0,0,114,167,0,0,0,114,82,1,0,0,114,101,0, + 0,0,114,186,0,0,0,114,191,0,0,0,114,195,0,0, + 0,41,12,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,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,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,30,0,0,0,114,34, + 0,0,0,90,9,111,115,95,109,111,100,117,108,101,90,13, + 116,104,114,101,97,100,95,109,111,100,117,108,101,90,14,119, + 101,97,107,114,101,102,95,109,111,100,117,108,101,90,13,119, + 105,110,114,101,103,95,109,111,100,117,108,101,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,6,95,115,101, + 116,117,112,38,6,0,0,115,78,0,0,0,0,8,4,1, + 6,1,6,3,10,1,8,1,10,1,12,2,10,1,14,3, + 22,1,12,2,22,1,8,1,10,1,10,1,6,2,2,1, + 10,1,10,1,12,1,12,2,8,1,12,1,12,1,18,1, + 22,3,10,1,12,3,10,1,12,3,10,1,10,1,12,3, + 14,1,14,1,10,1,10,1,10,1,114,89,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, + 89,1,0,0,114,184,0,0,0,114,8,0,0,0,114,51, + 1,0,0,114,167,0,0,0,114,61,1,0,0,114,76,1, + 0,0,218,9,109,101,116,97,95,112,97,116,104,114,186,0, + 0,0,114,45,1,0,0,41,2,114,88,1,0,0,90,17, + 115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114, + 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,8,95,105,110,115,116,97,108,108,103,6,0,0,115,8, + 0,0,0,0,2,8,1,6,1,20,1,114,91,1,0,0, + 41,1,114,59,0,0,0,41,1,78,41,3,78,78,78,41, + 2,114,72,0,0,0,114,72,0,0,0,41,1,84,41,1, + 78,41,1,78,41,63,114,127,0,0,0,114,12,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,11,0,0,0,114,13,0,0, + 0,114,20,0,0,0,114,26,0,0,0,114,28,0,0,0, + 114,37,0,0,0,114,46,0,0,0,114,48,0,0,0,114, + 52,0,0,0,114,53,0,0,0,114,55,0,0,0,114,58, + 0,0,0,114,68,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,18,0, + 0,0,114,148,0,0,0,114,17,0,0,0,114,23,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,9,1,0, + 0,114,15,1,0,0,114,21,1,0,0,114,252,0,0,0, + 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, + 61,1,0,0,114,81,1,0,0,114,184,0,0,0,114,89, + 1,0,0,114,91,1,0,0,114,3,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,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,19,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,72,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,65, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index c0a0bf51de3..d413bab0de4 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -81,7 +81,7 @@ static void *opcode_targets[256] = { &&TARGET_INPLACE_OR, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_TO_TUPLE, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, @@ -148,21 +148,21 @@ static void *opcode_targets[256] = { &&TARGET_SET_ADD, &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, - &&TARGET_BUILD_LIST_UNPACK, + &&_unknown_opcode, &&TARGET_BUILD_MAP_UNPACK, &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, - &&TARGET_BUILD_TUPLE_UNPACK, - &&TARGET_BUILD_SET_UNPACK, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, &&TARGET_FORMAT_VALUE, &&TARGET_BUILD_CONST_KEY_MAP, &&TARGET_BUILD_STRING, - &&TARGET_BUILD_TUPLE_UNPACK_WITH_CALL, + &&_unknown_opcode, &&_unknown_opcode, &&TARGET_LOAD_METHOD, &&TARGET_CALL_METHOD, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_LIST_EXTEND, + &&TARGET_SET_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, From 79f89e6e5a659846d1068e8b1bd8e491ccdef861 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 23 Jan 2020 14:07:05 +0000 Subject: [PATCH 186/380] bpo-39421: Fix posible crash in heapq with custom comparison operators (GH-18118) * bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators * fixup! fixup! bpo-39421: Fix posible crash in heapq with custom comparison operators --- Lib/test/test_heapq.py | 31 ++++++++++++++++ .../2020-01-22-15-53-37.bpo-39421.O3nG7u.rst | 2 ++ Modules/_heapqmodule.c | 35 ++++++++++++++----- 3 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py index 861ba7540df..6902573e8fa 100644 --- a/Lib/test/test_heapq.py +++ b/Lib/test/test_heapq.py @@ -432,6 +432,37 @@ class TestErrorHandling: with self.assertRaises((IndexError, RuntimeError)): self.module.heappop(heap) + def test_comparison_operator_modifiying_heap(self): + # See bpo-39421: Strong references need to be taken + # when comparing objects as they can alter the heap + class EvilClass(int): + def __lt__(self, o): + heap.clear() + return NotImplemented + + heap = [] + self.module.heappush(heap, EvilClass(0)) + self.assertRaises(IndexError, self.module.heappushpop, heap, 1) + + def test_comparison_operator_modifiying_heap_two_heaps(self): + + class h(int): + def __lt__(self, o): + list2.clear() + return NotImplemented + + class g(int): + def __lt__(self, o): + list1.clear() + return NotImplemented + + list1, list2 = [], [] + + self.module.heappush(list1, h(0)) + self.module.heappush(list2, g(0)) + + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list1, g(1)) + self.assertRaises((IndexError, RuntimeError), self.module.heappush, list2, h(1)) class TestErrorHandlingPython(TestErrorHandling, TestCase): module = py_heapq diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst new file mode 100644 index 00000000000..bae008150ee --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst @@ -0,0 +1,2 @@ +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. diff --git a/Modules/_heapqmodule.c b/Modules/_heapqmodule.c index a84cade3aaa..6bc18b5f82f 100644 --- a/Modules/_heapqmodule.c +++ b/Modules/_heapqmodule.c @@ -36,7 +36,11 @@ siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(newitem); + Py_INCREF(parent); cmp = PyObject_RichCompareBool(newitem, parent, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -78,10 +82,13 @@ siftup(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos], - arr[childpos + 1], - Py_LT); + PyObject* a = arr[childpos]; + PyObject* b = arr[childpos + 1]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ @@ -264,7 +271,10 @@ _heapq_heappushpop_impl(PyObject *module, PyObject *heap, PyObject *item) return item; } - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(heap, 0), item, Py_LT); + PyObject* top = PyList_GET_ITEM(heap, 0); + Py_INCREF(top); + cmp = PyObject_RichCompareBool(top, item, Py_LT); + Py_DECREF(top); if (cmp < 0) return NULL; if (cmp == 0) { @@ -420,7 +430,11 @@ siftdown_max(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) while (pos > startpos) { parentpos = (pos - 1) >> 1; parent = arr[parentpos]; + Py_INCREF(parent); + Py_INCREF(newitem); cmp = PyObject_RichCompareBool(parent, newitem, Py_LT); + Py_DECREF(parent); + Py_DECREF(newitem); if (cmp < 0) return -1; if (size != PyList_GET_SIZE(heap)) { @@ -462,10 +476,13 @@ siftup_max(PyListObject *heap, Py_ssize_t pos) /* Set childpos to index of smaller child. */ childpos = 2*pos + 1; /* leftmost child position */ if (childpos + 1 < endpos) { - cmp = PyObject_RichCompareBool( - arr[childpos + 1], - arr[childpos], - Py_LT); + PyObject* a = arr[childpos + 1]; + PyObject* b = arr[childpos]; + Py_INCREF(a); + Py_INCREF(b); + cmp = PyObject_RichCompareBool(a, b, Py_LT); + Py_DECREF(a); + Py_DECREF(b); if (cmp < 0) return -1; childpos += ((unsigned)cmp ^ 1); /* increment when cmp==0 */ From 99e6c260d60655f3d2885af545cbc220b808d492 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 23 Jan 2020 15:29:52 +0000 Subject: [PATCH 187/380] bpo-17005: Add a class to perform topological sorting to the standard library (GH-11583) Co-Authored-By: Tim Peters --- Doc/library/functools.rst | 208 +++++++++++++ Doc/myfile.bz2 | Bin 0 -> 331 bytes Doc/whatsnew/3.9.rst | 7 + Lib/functools.py | 249 +++++++++++++++- Lib/test/test_functools.py | 274 +++++++++++++++++- .../2020-01-17-00-00-58.bpo-17005.nTSxsy.rst | 3 + 6 files changed, 738 insertions(+), 3 deletions(-) create mode 100644 Doc/myfile.bz2 create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index bb7aac42dac..8c408923b70 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -8,10 +8,16 @@ .. moduleauthor:: Raymond Hettinger .. moduleauthor:: Nick Coghlan .. moduleauthor:: Łukasz Langa +.. moduleauthor:: Pablo Galindo .. sectionauthor:: Peter Harris **Source code:** :source:`Lib/functools.py` +.. testsetup:: default + + import functools + from functools import * + -------------- The :mod:`functools` module is for higher-order functions: functions that act on @@ -512,6 +518,192 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.8 +.. class:: TopologicalSorter(graph=None) + + Provides functionality to topologically sort a graph of hashable nodes. + + A topological order is a linear ordering of the vertices in a graph such that for + every directed edge u -> v from vertex u to vertex v, vertex u comes before vertex + v in the ordering. For instance, the vertices of the graph may represent tasks to + be performed, and the edges may represent constraints that one task must be + performed before another; in this example, a topological ordering is just a valid + sequence for the tasks. A complete topological ordering is possible if and only if + the graph has no directed cycles, that is, if it is a directed acyclic graph. + + If the optional *graph* argument is provided it must be a dictionary representing + a directed acyclic graph where the keys are nodes and the values are iterables of + all predecessors of that node in the graph (the nodes that have edges that point + to the value in the key). Additional nodes can be added to the graph using the + :meth:`~TopologicalSorter.add` method. + + In the general case, the steps required to perform the sorting of a given graph + are as follows: + + * Create an instance of the :class:`TopologicalSorter` with an optional initial graph. + * Add additional nodes to the graph. + * Call :meth:`~TopologicalSorter.prepare` on the graph. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over the + nodes returned by :meth:`~TopologicalSorter.get_ready` and process them. + Call :meth:`~TopologicalSorter.done` on each node as it finishes processing. + + In case just an immediate sorting of the nodes in the graph is required and + no parallelism is involved, the convenience method :meth:`TopologicalSorter.static_order` + can be used directly. For example, this method can be used to implement a simple + version of the C3 linearization algorithm used by Python to calculate the Method + Resolution Order (MRO) of a derived class: + + .. doctest:: + + >>> class A: pass + >>> class B(A): pass + >>> class C(A): pass + >>> class D(B, C): pass + + >>> D.__mro__ + (, , , , ) + + >>> graph = {D: {B, C}, C: {A}, B: {A}, A:{object}} + >>> ts = TopologicalSorter(graph) + >>> topological_order = tuple(ts.static_order()) + >>> tuple(reversed(topological_order)) + (, , , , ) + + The class is designed to easily support parallel processing of the nodes as they + become ready. For instance:: + + topological_sorter = TopologicalSorter() + + # Add nodes to 'topological_sorter'... + + topological_sorter.prepare() + while topological_sorter.is_active(): + for node in topological_sorter.get_ready(): + # Worker threads or processes take nodes to work on off the + # 'task_queue' queue. + task_queue.put(node) + + # When the work for a node is done, workers put the node in + # 'finalized_tasks_queue' so we can get more nodes to work on. + # The definition of 'is_active()' guarantees that, at this point, at + # least one node has been placed on 'task_queue' that hasn't yet + # been passed to 'done()', so this blocking 'get()' must (eventually) + # succeed. After calling 'done()', we loop back to call 'get_ready()' + # again, so put newly freed nodes on 'task_queue' as soon as + # logically possible. + node = finalized_tasks_queue.get() + topological_sorter.done(node) + + .. method:: add(node, *predecessors) + + Add a new node and its predecessors to the graph. Both the *node* and + all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not + provided) or to provide a dependency twice. If a node that has not been + provided before is included among *predecessors* it will be automatically added + to the graph with no predecessors of its own. + + Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. + + .. method:: prepare() + + Mark the graph as finished and check for cycles in the graph. If any cycle is + detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many nodes + as possible until cycles block more progress. After a call to this function, + the graph cannot be modified, and therefore no more nodes can be added using + :meth:`~TopologicalSorter.add`. + + .. method:: is_active() + + Returns ``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 + :meth:`TopologicalSorter.get_ready` or the number of nodes marked + :meth:`TopologicalSorter.done` is less than the number that have been returned + by :meth:`TopologicalSorter.get_ready`. + + The :meth:`~TopologicalSorter.__bool__` method of this class defers to this + function, so instead of:: + + if ts.is_active(): + ... + + if possible to simply do:: + + if ts: + ... + + Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` + previously. + + .. method:: done(*nodes) + + Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as + processed, unblocking any successor of each node in *nodes* for being returned + in the future by a call to :meth:`TopologicalSorter.get_ready`. + + Raises :exc:`ValueError` if any node in *nodes* has already been marked as + processed by a previous call to this method or if a node was not added to the + graph by using :meth:`TopologicalSorter.add`, if called without calling + :meth:`~TopologicalSorter.prepare` or if node has not yet been returned by + :meth:`~TopologicalSorter.get_ready`. + + .. method:: get_ready() + + Returns a ``tuple`` with all the nodes that are ready. Initially it returns all + nodes with no predecessors, and once those are marked as processed by calling + :meth:`TopologicalSorter.done`, further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be + made, empty tuples are returned. + made. + + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. + + .. method:: static_order() + + Returns an iterable of nodes in a topological order. Using this method + does not require to call :meth:`TopologicalSorter.prepare` or + :meth:`TopologicalSorter.done`. This method is equivalent to:: + + def static_order(self): + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + + The particular order that is returned may depend on the specific order in + which the items were inserted in the graph. For example: + + .. doctest:: + + >>> ts = TopologicalSorter() + >>> ts.add(3, 2, 1) + >>> ts.add(1, 0) + >>> print([*ts.static_order()]) + [2, 0, 1, 3] + + >>> ts2 = TopologicalSorter() + >>> ts2.add(1, 0) + >>> ts2.add(3, 2, 1) + >>> print([*ts2.static_order()]) + [0, 2, 1, 3] + + This is due to the fact that "0" and "2" are in the same level in the graph (they + would have been returned in the same call to :meth:`~TopologicalSorter.get_ready`) + and the order between them is determined by the order of insertion. + + + If any cycle is detected, :exc:`CycleError` will be raised. + + .. versionadded:: 3.9 + + .. function:: update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) Update a *wrapper* function to look like the *wrapped* function. The optional @@ -621,3 +813,19 @@ differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` 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. + + +Exceptions +---------- +The :mod:`functools` module defines the following exception classes: + +.. exception:: CycleError + + Subclass of :exc:`ValueError` raised by :meth:`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 element in the :attr:`~CycleError.args` + attribute of the exception instance and consists in a list of nodes, such that each node is, + in the graph, an immediate predecessor of the next node in the list. In the reported list, + the first and the last node will be the same, to make it clear that it is cyclic. diff --git a/Doc/myfile.bz2 b/Doc/myfile.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7ada20f60926b48c5e828d1e7bf71413ab4e70e9 GIT binary patch literal 331 zcmV-R0kr-?T4*^jL0KkKS+!R|D*ym2SAYNzKm{!$Kmb4Y{{S!nQ)N(SCV(fDn4n-m zsj1*o)jw1{KzfI%pc>6yC8lH}rXzFA}n%<_UC%QtSrIv)E4R zDh^1A%zp>6B3vmTgeYY0oJp0(`BpUNh|T3{*-_`)^ao&) zc!V(so1042t!WwNmV`neq?w3@G%ivk5jbims09KR+7&i4b+DaUp9+qJE21@v>K~jq d&ZNWD>qxYMPv6On5RHF}xgwk>NLs6)m4J*en85%5 literal 0 HcmV?d00001 diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index d9c545adc43..a6e938faa99 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -166,6 +166,13 @@ ftplib if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) +functools +--------- + +Add the :class:`functools.TopologicalSorter` class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim Peters and Larry +Hastings in :issue:`17005`.) + gc -- diff --git a/Lib/functools.py b/Lib/functools.py index 2c01b2e5952..050bec86051 100644 --- a/Lib/functools.py +++ b/Lib/functools.py @@ -10,8 +10,9 @@ # See C source code for _functools credits/copyright __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', - 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', - 'partialmethod', 'singledispatch', 'singledispatchmethod'] + 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', + 'TopologicalSorter', 'CycleError', + 'partial', 'partialmethod', 'singledispatch', 'singledispatchmethod'] from abc import get_cache_token from collections import namedtuple @@ -192,6 +193,250 @@ def total_ordering(cls): setattr(cls, opname, opfunc) return cls +################################################################################ +### topological sort +################################################################################ + +_NODE_OUT = -1 +_NODE_DONE = -2 + + +class _NodeInfo: + __slots__ = 'node', 'npredecessors', 'successors' + + def __init__(self, node): + # The node this class is augmenting. + self.node = node + + # Number of predecessors, generally >= 0. When this value falls to 0, + # and is returned by get_ready(), this is set to _NODE_OUT and when the + # node is marked done by a call to done(), set to _NODE_DONE. + self.npredecessors = 0 + + # List of successor nodes. The list can contain duplicated elements as + # long as they're all reflected in the successor's npredecessors attribute). + self.successors = [] + + +class CycleError(ValueError): + """Subclass of ValueError raised by TopologicalSorterif cycles exist in the 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 + element in the *args* attribute of the exception instance and consists in a list + of nodes, such that each node is, in the graph, an immediate predecessor of the + next node in the list. In the reported list, the first and the last node will be + the same, to make it clear that it is cyclic. + """ + pass + + +class TopologicalSorter: + """Provides functionality to topologically sort a graph of hashable nodes""" + + def __init__(self, graph=None): + self._node2info = {} + self._ready_nodes = None + self._npassedout = 0 + self._nfinished = 0 + + if graph is not None: + for node, predecessors in graph.items(): + self.add(node, *predecessors) + + def _get_nodeinfo(self, node): + if (result := self._node2info.get(node)) is None: + self._node2info[node] = result = _NodeInfo(node) + return result + + def add(self, node, *predecessors): + """Add a new node and its predecessors to the graph. + + Both the *node* and all elements in *predecessors* must be hashable. + + If called multiple times with the same node argument, the set of dependencies + will be the union of all dependencies passed in. + + It is possible to add a node with no dependencies (*predecessors* is not provided) + as well as provide a dependency twice. If a node that has not been provided before + is included among *predecessors* it will be automatically added to the graph with + no predecessors of its own. + + Raises ValueError if called after "prepare". + """ + if self._ready_nodes is not None: + raise ValueError("Nodes cannot be added after a call to prepare()") + + # Create the node -> predecessor edges + nodeinfo = self._get_nodeinfo(node) + nodeinfo.npredecessors += len(predecessors) + + # Create the predecessor -> node edges + for pred in predecessors: + pred_info = self._get_nodeinfo(pred) + pred_info.successors.append(node) + + def prepare(self): + """Mark the graph as finished and check for cycles in the graph. + + If any cycle is detected, "CycleError" will be raised, but "get_ready" can + still be used to obtain as many nodes as possible until cycles block more + progress. After a call to this function, the graph cannot be modified and + therefore no more nodes can be added using "add". + """ + if self._ready_nodes is not None: + raise ValueError("cannot prepare() more than once") + + self._ready_nodes = [i.node for i in self._node2info.values() + if i.npredecessors == 0] + # ready_nodes is set before we look for cycles on purpose: + # if the user wants to catch the CycleError, that's fine, + # they can continue using the instance to grab as many + # nodes as possible before cycles block more progress + cycle = self._find_cycle() + if cycle: + raise CycleError(f"nodes are in a cycle", cycle) + + def get_ready(self): + """Return a tuple of all the nodes that are ready. + + Initially it returns all nodes with no predecessors; once those are marked + as processed by calling "done", further calls will return all new nodes that + have all their predecessors already processed. Once no more progress can be made, + empty tuples are returned. + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + # Get the nodes that are ready and mark them + result = tuple(self._ready_nodes) + n2i = self._node2info + for node in result: + n2i[node].npredecessors = _NODE_OUT + + # Clean the list of nodes that are ready and update + # the counter of nodes that we have returned. + self._ready_nodes.clear() + self._npassedout += len(result) + + return result + + def is_active(self): + """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 + number of nodes marked "done" is less than the number that have been returned + by "get_ready". + + Raises ValueError if called without calling "prepare" previously. + """ + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + return self._nfinished < self._npassedout or bool(self._ready_nodes) + + def __bool__(self): + return self.is_active() + + 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" + + 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 + graph by using "add" or if called without calling "prepare" previously or if + node has not yet been returned by "get_ready". + """ + + if self._ready_nodes is None: + raise ValueError("prepare() must be called first") + + n2i = self._node2info + + for node in nodes: + + # Check if we know about this node (it was added previously using add() + if (nodeinfo := n2i.get(node)) is None: + raise ValueError(f"node {node!r} was not added using add()") + + # If the node has not being returned (marked as ready) previously, inform the user. + stat = nodeinfo.npredecessors + if stat != _NODE_OUT: + if stat >= 0: + raise ValueError(f"node {node!r} was not passed out (still not ready)") + elif stat == _NODE_DONE: + raise ValueError(f"node {node!r} was already marked done") + else: + assert False, f"node {node!r}: unknown status {stat}" + + # Mark the node as processed + nodeinfo.npredecessors = _NODE_DONE + + # Go to all the successors and reduce the number of predecessors, collecting all the ones + # that are ready to be returned in the next get_ready() call. + for successor in nodeinfo.successors: + successor_info = n2i[successor] + successor_info.npredecessors -= 1 + if successor_info.npredecessors == 0: + self._ready_nodes.append(successor) + self._nfinished += 1 + + def _find_cycle(self): + n2i = self._node2info + stack = [] + itstack = [] + seen = set() + node2stacki = {} + + for node in n2i: + if node in seen: + continue + + while True: + if node in seen: + # If we have seen already the node and is in the + # current stack we have found a cycle. + if node in node2stacki: + return stack[node2stacki[node]:] + [node] + # else go on to get next successor + else: + seen.add(node) + itstack.append(iter(n2i[node].successors).__next__) + node2stacki[node] = len(stack) + stack.append(node) + + # Backtrack to the topmost stack entry with + # at least another successor. + while stack: + try: + node = itstack[-1]() + break + except StopIteration: + del node2stacki[stack.pop()] + itstack.pop() + else: + break + return None + + def static_order(self): + """Returns an iterable of nodes in a topological order. + + The particular order that is returned may depend on the specific + order in which the items were inserted in the graph. + + Using this method does not require to call "prepare" or "done". If any + cycle is detected, :exc:`CycleError` will be raised. + """ + self.prepare() + while self.is_active(): + node_group = self.get_ready() + yield from node_group + self.done(*node_group) + ################################################################################ ### cmp_to_key() function converter diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index a97ca398e77..9503f4086b1 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -3,7 +3,7 @@ import builtins import collections import collections.abc import copy -from itertools import permutations +from itertools import permutations, chain import pickle from random import choice import sys @@ -13,9 +13,12 @@ import time import typing import unittest import unittest.mock +import os from weakref import proxy import contextlib +from test.support.script_helper import assert_python_ok + import functools py_functools = support.import_fresh_module('functools', blocked=['_functools']) @@ -1158,6 +1161,275 @@ class Orderable_LT: return self.value == other.value +class TestTopologicalSort(unittest.TestCase): + + def _test_graph(self, graph, expected): + + def static_order_with_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + for node in nodes: + ts.done(node) + yield nodes + + ts = functools.TopologicalSorter(graph) + self.assertEqual(list(static_order_with_groups(ts)), list(expected)) + + ts = functools.TopologicalSorter(graph) + self.assertEqual(list(ts.static_order()), list(chain(*expected))) + + def _assert_cycle(self, graph, cycle): + ts = functools.TopologicalSorter() + for node, dependson in graph.items(): + ts.add(node, *dependson) + try: + ts.prepare() + except functools.CycleError as e: + msg, seq = e.args + self.assertIn(' '.join(map(str, cycle)), + ' '.join(map(str, seq * 2))) + else: + raise + + def test_simple_cases(self): + self._test_graph( + {2: {11}, + 9: {11, 8}, + 10: {11, 3}, + 11: {7, 5}, + 8: {7, 3}}, + [(3, 5, 7), (11, 8), (2, 10, 9)] + ) + + self._test_graph({1: {}}, [(1,)]) + + self._test_graph({x: {x+1} for x in range(10)}, + [(x,) for x in range(10, -1, -1)]) + + self._test_graph({2: {3}, 3: {4}, 4: {5}, 5: {1}, + 11: {12}, 12: {13}, 13: {14}, 14: {15}}, + [(1, 15), (5, 14), (4, 13), (3, 12), (2, 11)]) + + self._test_graph({ + 0: [1, 2], + 1: [3], + 2: [5, 6], + 3: [4], + 4: [9], + 5: [3], + 6: [7], + 7: [8], + 8: [4], + 9: [] + }, + [(9,), (4,), (3, 8), (1, 5, 7), (6,), (2,), (0,)] + ) + + self._test_graph({ + 0: [1, 2], + 1: [], + 2: [3], + 3: [] + }, + [(1, 3), (2,), (0,)] + ) + + self._test_graph({ + 0: [1, 2], + 1: [], + 2: [3], + 3: [], + 4: [5], + 5: [6], + 6: [] + }, + [(1, 3, 6), (2, 5), (0, 4)] + ) + + def test_no_dependencies(self): + self._test_graph( + {1: {2}, + 3: {4}, + 5: {6}}, + [(2, 4, 6), (1, 3, 5)] + ) + + self._test_graph( + {1: set(), + 3: set(), + 5: set()}, + [(1, 3, 5)] + ) + + def test_the_node_multiple_times(self): + # Test same node multiple times in dependencies + self._test_graph({1: {2}, 3: {4}, 0: [2, 4, 4, 4, 4, 4]}, + [(2, 4), (1, 3, 0)]) + + # Test adding the same dependency multiple times + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 2) + ts.add(1, 2) + self.assertEqual([*ts.static_order()], [2, 1]) + + def test_graph_with_iterables(self): + dependson = (2*x + 1 for x in range(5)) + ts = functools.TopologicalSorter({0: dependson}) + self.assertEqual(list(ts.static_order()), [1, 3, 5, 7, 9, 0]) + + def test_add_dependencies_for_same_node_incrementally(self): + # Test same node multiple times + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.add(1, 3) + ts.add(1, 4) + ts.add(1, 5) + + ts2 = functools.TopologicalSorter({1: {2, 3, 4, 5}}) + self.assertEqual([*ts.static_order()], [*ts2.static_order()]) + + def test_empty(self): + self._test_graph({}, []) + + def test_cycle(self): + # Self cycle + self._assert_cycle({1: {1}}, [1, 1]) + # Simple cycle + self._assert_cycle({1: {2}, 2: {1}}, [1, 2, 1]) + # Indirect cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}}, [1, 3, 2, 1]) + # not all elements involved in a cycle + self._assert_cycle({1: {2}, 2: {3}, 3: {1}, 5: {4}, 4: {6}}, [1, 3, 2, 1]) + # Multiple cycles + self._assert_cycle({1: {2}, 2: {1}, 3: {4}, 4: {5}, 6: {7}, 7: {6}}, + [1, 2, 1]) + # Cycle in the middle of the graph + self._assert_cycle({1: {2}, 2: {3}, 3: {2, 4}, 4: {5}}, [3, 2]) + + def test_calls_before_prepare(self): + ts = functools.TopologicalSorter() + + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.get_ready() + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.done(3) + with self.assertRaisesRegex(ValueError, r"prepare\(\) must be called first"): + ts.is_active() + + def test_prepare_multiple_times(self): + ts = functools.TopologicalSorter() + ts.prepare() + with self.assertRaisesRegex(ValueError, r"cannot prepare\(\) more than once"): + ts.prepare() + + def test_invalid_nodes_in_done(self): + ts = functools.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3, 4) + ts.prepare() + ts.get_ready() + + with self.assertRaisesRegex(ValueError, "node 2 was not passed out"): + ts.done(2) + with self.assertRaisesRegex(ValueError, r"node 24 was not added using add\(\)"): + ts.done(24) + + def test_done(self): + ts = functools.TopologicalSorter() + ts.add(1, 2, 3, 4) + ts.add(2, 3) + ts.prepare() + + self.assertEqual(ts.get_ready(), (3, 4)) + # If we don't mark anything as done, get_ready() returns nothing + self.assertEqual(ts.get_ready(), ()) + ts.done(3) + # Now 2 becomes available as 3 is done + self.assertEqual(ts.get_ready(), (2,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(4) + ts.done(2) + # Only 1 is missing + self.assertEqual(ts.get_ready(), (1,)) + self.assertEqual(ts.get_ready(), ()) + ts.done(1) + self.assertEqual(ts.get_ready(), ()) + self.assertFalse(ts.is_active()) + + def test_is_active(self): + ts = functools.TopologicalSorter() + ts.add(1, 2) + ts.prepare() + + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (2,)) + self.assertTrue(ts.is_active()) + ts.done(2) + self.assertTrue(ts.is_active()) + self.assertEqual(ts.get_ready(), (1,)) + self.assertTrue(ts.is_active()) + ts.done(1) + self.assertFalse(ts.is_active()) + + def test_not_hashable_nodes(self): + ts = functools.TopologicalSorter() + self.assertRaises(TypeError, ts.add, dict(), 1) + self.assertRaises(TypeError, ts.add, 1, dict()) + self.assertRaises(TypeError, ts.add, dict(), dict()) + + def test_order_of_insertion_does_not_matter_between_groups(self): + def get_groups(ts): + ts.prepare() + while ts.is_active(): + nodes = ts.get_ready() + ts.done(*nodes) + yield set(nodes) + + ts = functools.TopologicalSorter() + ts.add(3, 2, 1) + ts.add(1, 0) + ts.add(4, 5) + ts.add(6, 7) + ts.add(4, 7) + + ts2 = functools.TopologicalSorter() + ts2.add(1, 0) + ts2.add(3, 2, 1) + ts2.add(4, 7) + ts2.add(6, 7) + ts2.add(4, 5) + + self.assertEqual(list(get_groups(ts)), list(get_groups(ts2))) + + def test_static_order_does_not_change_with_the_hash_seed(self): + def check_order_with_hash_seed(seed): + code = """if 1: + import functools + ts = functools.TopologicalSorter() + ts.add('blech', 'bluch', 'hola') + ts.add('abcd', 'blech', 'bluch', 'a', 'b') + ts.add('a', 'a string', 'something', 'b') + ts.add('bluch', 'hola', 'abcde', 'a', 'b') + print(list(ts.static_order())) + """ + env = os.environ.copy() + # signal to assert_python not to do a copy + # of os.environ on its own + env['__cleanenv'] = True + env['PYTHONHASHSEED'] = str(seed) + out = assert_python_ok('-c', code, **env) + return out + + run1 = check_order_with_hash_seed(1234) + run2 = check_order_with_hash_seed(31415) + + self.assertNotEqual(run1, "") + self.assertNotEqual(run2, "") + self.assertEqual(run1, run2) + + class TestLRU: def test_lru(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst new file mode 100644 index 00000000000..e5336437754 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst @@ -0,0 +1,3 @@ +Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to +offers functionality to perform topological sorting of graphs. Patch by +Pablo Galindo, Tim Peters and Larry Hastings. From 7142df5ea23b4ce0efb72746b4b3b65414e8dcb1 Mon Sep 17 00:00:00 2001 From: Shanavas M Date: Thu, 23 Jan 2020 23:39:21 +0530 Subject: [PATCH 188/380] bpo-39431: Also mention nonlocal in assignment quirk (GH-17375) --- Doc/tutorial/classes.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index 0c0dca99f21..f781fecf832 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -143,10 +143,10 @@ language definition is evolving towards static name resolution, at "compile" time, so don't rely on dynamic name resolution! (In fact, local variables are already determined statically.) -A special quirk of Python is that -- if no :keyword:`global` statement is in -effect -- assignments to names always go into the innermost scope. Assignments -do not copy data --- they just bind names to objects. The same is true for -deletions: the statement ``del x`` removes the binding of ``x`` from the +A special quirk of Python is that -- if no :keyword:`global` or :keyword:`nonlocal` +statement is in effect -- assignments to names always go into the innermost scope. +Assignments do not copy data --- they just bind names to objects. The same is true +for deletions: the statement ``del x`` removes the binding of ``x`` from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, :keyword:`import` statements and function definitions bind the module or function name in the local scope. From 65ecc390c1fa5acdd6348ae3f9843bbdcd8870d1 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 23 Jan 2020 21:01:50 +0000 Subject: [PATCH 189/380] bpo-17005: Minor improvements to the documentation of TopologicalSorter (GH-18155) --- Doc/library/functools.rst | 136 ++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 72 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 8c408923b70..e708a0d99cd 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -522,54 +522,46 @@ The :mod:`functools` module defines the following functions: Provides functionality to topologically sort a graph of hashable nodes. - A topological order is a linear ordering of the vertices in a graph such that for - every directed edge u -> v from vertex u to vertex v, vertex u comes before vertex - v in the ordering. For instance, the vertices of the graph may represent tasks to - be performed, and the edges may represent constraints that one task must be - performed before another; in this example, a topological ordering is just a valid - sequence for the tasks. A complete topological ordering is possible if and only if - the graph has no directed cycles, that is, if it is a directed acyclic graph. + A topological order is a linear ordering of the vertices in a graph such that + for every directed edge u -> v from vertex u to vertex v, vertex u comes + before vertex v in the ordering. For instance, the vertices of the graph may + represent tasks to be performed, and the edges may represent constraints that + one task must be performed before another; in this example, a topological + ordering is just a valid sequence for the tasks. A complete topological + ordering is possible if and only if the graph has no directed cycles, that + is, if it is a directed acyclic graph. - If the optional *graph* argument is provided it must be a dictionary representing - a directed acyclic graph where the keys are nodes and the values are iterables of - all predecessors of that node in the graph (the nodes that have edges that point - to the value in the key). Additional nodes can be added to the graph using the - :meth:`~TopologicalSorter.add` method. + If the optional *graph* argument is provided it must be a dictionary + representing a directed acyclic graph where the keys are nodes and the values + are iterables of all predecessors of that node in the graph (the nodes that + have edges that point to the value in the key). Additional nodes can be added + to the graph using the :meth:`~TopologicalSorter.add` method. - In the general case, the steps required to perform the sorting of a given graph - are as follows: + In the general case, the steps required to perform the sorting of a given + graph are as follows: - * Create an instance of the :class:`TopologicalSorter` with an optional initial graph. + * Create an instance of the :class:`TopologicalSorter` with an optional + initial graph. * Add additional nodes to the graph. * Call :meth:`~TopologicalSorter.prepare` on the graph. - * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over the - nodes returned by :meth:`~TopologicalSorter.get_ready` and process them. - Call :meth:`~TopologicalSorter.done` on each node as it finishes processing. + * While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over + the nodes returned by :meth:`~TopologicalSorter.get_ready` and + process them. Call :meth:`~TopologicalSorter.done` on each node as it + finishes processing. In case just an immediate sorting of the nodes in the graph is required and - no parallelism is involved, the convenience method :meth:`TopologicalSorter.static_order` - can be used directly. For example, this method can be used to implement a simple - version of the C3 linearization algorithm used by Python to calculate the Method - Resolution Order (MRO) of a derived class: + no parallelism is involved, the convenience method + :meth:`TopologicalSorter.static_order` can be used directly: .. doctest:: - >>> class A: pass - >>> class B(A): pass - >>> class C(A): pass - >>> class D(B, C): pass - - >>> D.__mro__ - (, , , , ) - - >>> graph = {D: {B, C}, C: {A}, B: {A}, A:{object}} + >>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}} >>> ts = TopologicalSorter(graph) - >>> topological_order = tuple(ts.static_order()) - >>> tuple(reversed(topological_order)) - (, , , , ) + >>> tuple(ts.static_order()) + ('A', 'C', 'B', 'D') - The class is designed to easily support parallel processing of the nodes as they - become ready. For instance:: + The class is designed to easily support parallel processing of the nodes as + they become ready. For instance:: topological_sorter = TopologicalSorter() @@ -595,39 +587,39 @@ The :mod:`functools` module defines the following functions: .. method:: add(node, *predecessors) - Add a new node and its predecessors to the graph. Both the *node* and - all elements in *predecessors* must be hashable. + Add a new node and its predecessors to the graph. Both the *node* and all + elements in *predecessors* must be hashable. - If called multiple times with the same node argument, the set of dependencies - will be the union of all dependencies passed in. + If called multiple times with the same node argument, the set of + dependencies will be the union of all dependencies passed in. It is possible to add a node with no dependencies (*predecessors* is not provided) or to provide a dependency twice. If a node that has not been - provided before is included among *predecessors* it will be automatically added - to the graph with no predecessors of its own. + provided before is included among *predecessors* it will be automatically + added to the graph with no predecessors of its own. Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`. .. method:: prepare() - Mark the graph as finished and check for cycles in the graph. If any cycle is - detected, :exc:`CycleError` will be raised, but - :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many nodes - as possible until cycles block more progress. After a call to this function, - the graph cannot be modified, and therefore no more nodes can be added using - :meth:`~TopologicalSorter.add`. + Mark the graph as finished and check for cycles in the graph. If any cycle + is detected, :exc:`CycleError` will be raised, but + :meth:`~TopologicalSorter.get_ready` can still be used to obtain as many + nodes as possible until cycles block more progress. After a call to this + function, the graph cannot be modified, and therefore no more nodes can be + added using :meth:`~TopologicalSorter.add`. .. method:: is_active() - Returns ``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 + Returns ``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 :meth:`TopologicalSorter.get_ready` or the number of nodes marked - :meth:`TopologicalSorter.done` is less than the number that have been returned - by :meth:`TopologicalSorter.get_ready`. + :meth:`TopologicalSorter.done` is less than the number that have been + returned by :meth:`TopologicalSorter.get_ready`. - The :meth:`~TopologicalSorter.__bool__` method of this class defers to this - function, so instead of:: + The :meth:`~TopologicalSorter.__bool__` method of this class defers to + this function, so instead of:: if ts.is_active(): ... @@ -637,29 +629,28 @@ The :mod:`functools` module defines the following functions: if ts: ... - Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` - previously. + Raises :exc:`ValueError` if called without calling + :meth:`~TopologicalSorter.prepare` previously. .. method:: done(*nodes) Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as - processed, unblocking any successor of each node in *nodes* for being returned - in the future by a call to :meth:`TopologicalSorter.get_ready`. + processed, unblocking any successor of each node in *nodes* for being + returned in the future by a call to :meth:`TopologicalSorter.get_ready`. Raises :exc:`ValueError` if any node in *nodes* has already been marked as - processed by a previous call to this method or if a node was not added to the - graph by using :meth:`TopologicalSorter.add`, if called without calling - :meth:`~TopologicalSorter.prepare` or if node has not yet been returned by - :meth:`~TopologicalSorter.get_ready`. + processed by a previous call to this method or if a node was not added to + the graph by using :meth:`TopologicalSorter.add`, if called without + calling :meth:`~TopologicalSorter.prepare` or if node has not yet been + returned by :meth:`~TopologicalSorter.get_ready`. .. method:: get_ready() - Returns a ``tuple`` with all the nodes that are ready. Initially it returns all - nodes with no predecessors, and once those are marked as processed by calling - :meth:`TopologicalSorter.done`, further calls will return all new nodes that - have all their predecessors already processed. Once no more progress can be - made, empty tuples are returned. - made. + Returns a ``tuple`` with all the nodes that are ready. Initially it + returns all nodes with no predecessors, and once those are marked as + processed by calling :meth:`TopologicalSorter.done`, further calls will + return all new nodes that have all their predecessors already processed. + Once no more progress can be made, empty tuples are returned. Raises :exc:`ValueError` if called without calling :meth:`~TopologicalSorter.prepare` previously. @@ -694,9 +685,10 @@ The :mod:`functools` module defines the following functions: >>> print([*ts2.static_order()]) [0, 2, 1, 3] - This is due to the fact that "0" and "2" are in the same level in the graph (they - would have been returned in the same call to :meth:`~TopologicalSorter.get_ready`) - and the order between them is determined by the order of insertion. + This is due to the fact that "0" and "2" are in the same level in the + graph (they would have been returned in the same call to + :meth:`~TopologicalSorter.get_ready`) and the order between them is + determined by the order of insertion. If any cycle is detected, :exc:`CycleError` will be raised. From 1d0c5e16eab29d55773cc4196bb90d2bf12e09dd Mon Sep 17 00:00:00 2001 From: Emmanuel Arias Date: Fri, 24 Jan 2020 05:14:14 -0300 Subject: [PATCH 190/380] bpo-24928: Add test case for patch.dict using OrderedDict (GH -11437) * add test for path.dict using OrderedDict Co-authored-by: Yu Tomita nekobon@users.noreply.github.com --- Lib/unittest/test/testmock/testpatch.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index e065a2c35fb..dc4ccdbae24 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -4,6 +4,7 @@ import os import sys +from collections import OrderedDict import unittest from unittest.test.testmock import support @@ -1834,6 +1835,25 @@ class PatchTest(unittest.TestCase): self.assertEqual(foo(), 1) self.assertEqual(foo(), 0) + def test_patch_orderdict(self): + foo = OrderedDict() + foo['a'] = object() + foo['b'] = 'python' + + original = foo.copy() + update_values = list(zip('cdefghijklmnopqrstuvwxyz', range(26))) + patched_values = list(foo.items()) + update_values + + with patch.dict(foo, OrderedDict(update_values)): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + + with patch.dict(foo, update_values): + self.assertEqual(list(foo.items()), patched_values) + + self.assertEqual(foo, original) + def test_dotted_but_module_not_loaded(self): # This exercises the AttributeError branch of _dot_lookup. From e131c9720d087c0c4988bd2a5c62020feb9d1d77 Mon Sep 17 00:00:00 2001 From: Mario Corchero Date: Fri, 24 Jan 2020 08:38:33 +0000 Subject: [PATCH 191/380] Fix `mock.patch.dict` to be stopped with `mock.patch.stopall` (#17606) As the function was not registering in the active patches, the mocks started by `mock.patch.dict` were not being stopped when `mock.patch.stopall` was being called. --- Lib/unittest/mock.py | 19 ++++++- Lib/unittest/test/testmock/testpatch.py | 50 +++++++++++++++++++ .../2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst | 2 + 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 5622917dc37..3fafe594c59 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1851,8 +1851,23 @@ class _patch_dict(object): self._unpatch_dict() return False - start = __enter__ - stop = __exit__ + + def start(self): + """Activate a patch, returning any created mock.""" + result = self.__enter__() + _patch._active_patches.append(self) + return result + + + def stop(self): + """Stop an active patch.""" + try: + _patch._active_patches.remove(self) + except ValueError: + # If the patch hasn't been started this will fail + pass + + return self.__exit__() def _clear_dict(in_dict): diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index dc4ccdbae24..438dfd8cfbc 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -1808,6 +1808,56 @@ class PatchTest(unittest.TestCase): self.assertEqual(stopped, ["three", "two", "one"]) + def test_patch_dict_stopall(self): + dic1 = {} + dic2 = {1: 'a'} + dic3 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + origdic3 = dic3.copy() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2, {2: 'b'}).start() + + @patch.dict(dic3) + def patched(): + del dic3[1] + + patched() + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + patch.stopall() + + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + self.assertEqual(dic3, origdic3) + + + def test_patch_and_patch_dict_stopall(self): + original_unlink = os.unlink + original_chdir = os.chdir + dic1 = {} + dic2 = {1: 'A', 2: 'B'} + origdic1 = dic1.copy() + origdic2 = dic2.copy() + + patch('os.unlink', something).start() + patch('os.chdir', something_else).start() + patch.dict(dic1, {1: 'I', 2: 'II'}).start() + patch.dict(dic2).start() + del dic2[1] + + self.assertIsNot(os.unlink, original_unlink) + self.assertIsNot(os.chdir, original_chdir) + self.assertNotEqual(dic1, origdic1) + self.assertNotEqual(dic2, origdic2) + patch.stopall() + self.assertIs(os.unlink, original_unlink) + self.assertIs(os.chdir, original_chdir) + self.assertEqual(dic1, origdic1) + self.assertEqual(dic2, origdic2) + def test_special_attrs(self): def foo(x=0): diff --git a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst new file mode 100644 index 00000000000..0f726393106 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst @@ -0,0 +1,2 @@ +Fix :func:`mock.patch.stopall` to stop active patches that were created with +:func:`mock.patch.dict`. From b9783d2e035d2babe8fcd9ec109044c0002c18a2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 24 Jan 2020 10:22:18 +0100 Subject: [PATCH 192/380] bpo-39429: Add a new "Python Development Mode" doc page (GH-18132) --- Doc/c-api/init_config.rst | 2 +- Doc/library/asyncio-dev.rst | 2 +- Doc/library/asyncio-eventloop.rst | 2 +- Doc/library/development.rst | 4 +- Doc/library/devmode.rst | 214 ++++++++++++++++++++++++++++++ Doc/library/exceptions.rst | 16 ++- Doc/library/faulthandler.rst | 3 + Doc/library/stdtypes.rst | 8 +- Doc/library/sys.rst | 15 ++- Doc/using/cmdline.rst | 26 +--- Doc/whatsnew/3.7.rst | 10 +- Doc/whatsnew/3.9.rst | 7 +- Include/cpython/initconfig.h | 8 +- 13 files changed, 268 insertions(+), 49 deletions(-) create mode 100644 Doc/library/devmode.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 79a8815ed41..108bd2c0245 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -466,7 +466,7 @@ PyConfig .. c:member:: int dev_mode - Development mode: see :option:`-X dev <-X>`. + If non-zero, enable the :ref:`Python Development Mode `. .. c:member:: int dump_refs diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index 101e7817a95..ff51c4fa3b2 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -25,7 +25,7 @@ There are several ways to enable asyncio debug mode: * Setting the :envvar:`PYTHONASYNCIODEBUG` environment variable to ``1``. -* Using the :option:`-X` ``dev`` Python command line option. +* Using the :ref:`Python Development Mode `. * Passing ``debug=True`` to :func:`asyncio.run`. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 25a3692695d..0029d94f0b5 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1200,7 +1200,7 @@ Enabling debug mode .. versionchanged:: 3.7 - The new ``-X dev`` command line option can now also be used + The new :ref:`Python Development Mode ` can now also be used to enable the debug mode. .. seealso:: diff --git a/Doc/library/development.rst b/Doc/library/development.rst index ab34e1f7ce5..9edce758688 100644 --- a/Doc/library/development.rst +++ b/Doc/library/development.rst @@ -18,12 +18,10 @@ The list of modules described in this chapter is: typing.rst pydoc.rst + devmode.rst doctest.rst unittest.rst unittest.mock.rst unittest.mock-examples.rst 2to3.rst test.rst - -See also the Python development mode: the :option:`-X` ``dev`` option and -:envvar:`PYTHONDEVMODE` environment variable. diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst new file mode 100644 index 00000000000..d5a40cdeeac --- /dev/null +++ b/Doc/library/devmode.rst @@ -0,0 +1,214 @@ +.. _devmode: + +Python Development Mode +======================= + +.. versionadded:: 3.7 + +The Python Development Mode introduces additional runtime checks that are too +expensive to be enabled by default. It should not be more verbose than the +default if the code is correct; new warnings are only emitted when an issue is +detected. + +It can be enabled using the :option:`-X dev <-X>` command line option or by +setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``. + +Effects of the Python Development Mode +====================================== + +Enabling the Python Development Mode is similar to the following command, but +with additional effects described below:: + + PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler + +Effects of the Python Development Mode: + +* Add ``default`` :ref:`warning filter `. The + following warnings are shown: + + * :exc:`DeprecationWarning` + * :exc:`ImportWarning` + * :exc:`PendingDeprecationWarning` + * :exc:`ResourceWarning` + + Normally, the above warnings are filtered by the default :ref:`warning + filters `. + + It behaves as if the :option:`-W default <-W>` command line option is used. + + Use the :option:`-W error <-W>` command line option or set the + :envvar:`PYTHONWARNINGS` environment variable to ``error`` to treat warnings + as errors. + +* Install debug hooks on memory allocators to check for: + + * Buffer underflow + * Buffer overflow + * Memory allocator API violation + * Unsafe usage of the GIL + + See the :c:func:`PyMem_SetupDebugHooks` C function. + + It behaves as if the :envvar:`PYTHONMALLOC` environment variable is set to + ``debug``. + + To enable the Python Development Mode without installing debug hooks on + memory allocators, set the :envvar:`PYTHONMALLOC` environment variable to + ``default``. + +* Call :func:`faulthandler.enable` at Python startup to install handlers for + the :const:`SIGSEGV`, :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and + :const:`SIGILL` signals to dump the Python traceback on a crash. + + It behaves as if the :option:`-X faulthandler <-X>` command line option is + used or if the :envvar:`PYTHONFAULTHANDLER` environment variable is set to + ``1``. + +* Enable :ref:`asyncio debug mode `. For example, + :mod:`asyncio` checks for coroutines that were not awaited and logs them. + + It behaves as if the :envvar:`PYTHONASYNCIODEBUG` environment variable is set + to ``1``. + +* Check the *encoding* and *errors* arguments for string encoding and decoding + operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. + + By default, for best performance, the *errors* argument is only checked at + the first encoding/decoding error and the *encoding* argument is sometimes + ignored for empty strings. + +* The :class:`io.IOBase` destructor logs ``close()`` exceptions. +* Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to + ``True``. + +The Python Development Mode does not enable the :mod:`tracemalloc` module by +default, because the overhead cost (to performance and memory) would be too +large. Enabling the :mod:`tracemalloc` module provides additional information +on the origin of some errors. For example, :exc:`ResourceWarning` logs the +traceback where the resource was allocated, and a buffer overflow error logs +the traceback where the memory block was allocated. + +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``. + +.. versionchanged:: 3.8 + The :class:`io.IOBase` destructor now logs ``close()`` exceptions. + +.. versionchanged:: 3.9 + The *encoding* and *errors* arguments are now checked for string encoding + and decoding operations. + + +ResourceWarning Example +======================= + +Example of a script counting the number of lines of the text file specified in +the command line:: + + import sys + + def main(): + fp = open(sys.argv[1]) + nlines = len(fp.readlines()) + print(nlines) + # The file is closed implicitly + + if __name__ == "__main__": + main() + +The script does not close the file explicitly. By default, Python does not emit +any warning. Example using README.txt, which has 269 lines: + +.. code-block:: shell-session + + $ python3 script.py README.txt + 269 + +Enabling the Python Development Mode displays a :exc:`ResourceWarning` warning: + +.. code-block:: shell-session + + $ python3 -X dev script.py README.txt + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + +In addition, enabling :mod:`tracemalloc` shows the line where the file was +opened: + +.. code-block:: shell-session + + $ python3 -X dev -X tracemalloc=5 script.py README.rst + 269 + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'> + main() + Object allocated at (most recent call last): + File "script.py", lineno 10 + main() + File "script.py", lineno 4 + fp = open(sys.argv[1]) + +The fix is to close explicitly the file. Example using a context manager:: + + def main(): + # Close the file explicitly when exiting the with block + with open(sys.argv[1]) as fp: + nlines = len(fp.readlines()) + print(nlines) + +Not closing a resource explicitly can leave a resource open for way longer than +expected; it can cause severe issues upon exiting Python. It is bad in +CPython, but it is even worse in PyPy. Closing resources explicitly makes an +application more deterministic and more reliable. + + +Bad file descriptor error example +================================= + +Script displaying the first line of itself:: + + import os + + def main(): + fp = open(__file__) + firstline = fp.readline() + print(firstline.rstrip()) + os.close(fp.fileno()) + # The file is closed implicitly + + main() + +By default, Python does not emit any warning: + +.. code-block:: shell-session + + $ python3 script.py + import os + +The Python Development Mode shows a :exc:`ResourceWarning` and logs a "Bad file +descriptor" error when finalizing the file object: + +.. code-block:: shell-session + + $ python3 script.py + import os + script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + main() + ResourceWarning: Enable tracemalloc to get the object allocation traceback + Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'> + Traceback (most recent call last): + File "script.py", line 10, in + main() + OSError: [Errno 9] Bad file descriptor + +``os.close(fp.fileno())`` closes the file descriptor. When the file object +finalizer tries to close the file descriptor again, it fails with the ``Bad +file descriptor`` error. A file descriptor must be closed only once. In the +worst case scenario, closing it twice can lead to a crash (see :issue:`18748` +for an example). + +The fix is to remove the ``os.close(fp.fileno())`` line, or open the file with +``closefd=False``. diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index 52a505e0a0f..df2cda9d67a 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -688,6 +688,10 @@ The following exceptions are used as warning categories; see the Base class for warnings about deprecated features when those warnings are intended for other Python developers. + Ignored by the default warning filters, except in the ``__main__`` module + (:pep:`565`). Enabling the :ref:`Python Development Mode ` shows + this warning. + .. exception:: PendingDeprecationWarning @@ -699,6 +703,9 @@ The following exceptions are used as warning categories; see the upcoming deprecation is unusual, and :exc:`DeprecationWarning` is preferred for already active deprecations. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: SyntaxWarning @@ -720,6 +727,9 @@ The following exceptions are used as warning categories; see the Base class for warnings about probable mistakes in module imports. + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. + .. exception:: UnicodeWarning @@ -733,8 +743,10 @@ The following exceptions are used as warning categories; see the .. exception:: ResourceWarning - Base class for warnings related to resource usage. Ignored by the default - warning filters. + Base class for warnings related to resource usage. + + Ignored by the default warning filters. Enabling the :ref:`Python + Development Mode ` shows this warning. .. versionadded:: 3.2 diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index b588dfa18db..59274c1dd7e 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -40,6 +40,9 @@ alternatively be passed to :func:`faulthandler.enable`. The module is implemented in C, so tracebacks can be dumped on a crash or when Python is deadlocked. +The :ref:`Python Development Mode ` calls :func:`faulthandler.enable` +at Python startup. + Dumping the traceback --------------------- diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 3e25faaa427..fd3401fd18a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1559,8 +1559,8 @@ expression support in the :mod:`re` module). list of possible encodings, see section :ref:`standard-encodings`. By default, the *errors* argument is not checked for best performances, but - only used at the first encoding error. Enable the development mode - (:option:`-X` ``dev`` option), or use a debug build, to check *errors*. + only used at the first encoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. .. versionchanged:: 3.1 Support for keyword arguments added. @@ -2596,8 +2596,8 @@ arbitrary binary data. list of possible encodings, see section :ref:`standard-encodings`. By default, the *errors* argument is not checked for best performances, but - only used at the first decoding error. Enable the development mode - (:option:`-X` ``dev`` option), or use a debug build, to check *errors*. + only used at the first decoding error. Enable the :ref:`Python Development + Mode `, or use a debug build to check *errors*. .. note:: diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 351a8e4c9ea..d28b3565c1c 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -428,9 +428,9 @@ always available. The :term:`named tuple` *flags* exposes the status of command line flags. The attributes are read only. - ============================= ============================= + ============================= ================================================================ attribute flag - ============================= ============================= + ============================= ================================================================ :const:`debug` :option:`-d` :const:`inspect` :option:`-i` :const:`interactive` :option:`-i` @@ -444,9 +444,9 @@ always available. :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` :const:`hash_randomization` :option:`-R` - :const:`dev_mode` :option:`-X` ``dev`` - :const:`utf8_mode` :option:`-X` ``utf8`` - ============================= ============================= + :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) + :const:`utf8_mode` :option:`-X utf8 <-X>` + ============================= ================================================================ .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. @@ -461,8 +461,9 @@ always available. Added ``isolated`` attribute for :option:`-I` ``isolated`` flag. .. versionchanged:: 3.7 - Added ``dev_mode`` attribute for the new :option:`-X` ``dev`` flag - and ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. + Added the ``dev_mode`` attribute for the new :ref:`Python Development + Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` + ``utf8`` flag. .. data:: float_info diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 9e149806c38..146003b1471 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -442,24 +442,9 @@ Miscellaneous options nested imports). Note that its output may be broken in multi-threaded application. Typical usage is ``python3 -X importtime -c 'import asyncio'``. See also :envvar:`PYTHONPROFILEIMPORTTIME`. - * ``-X dev``: enable CPython's "development mode", introducing additional - runtime checks which are too expensive to be enabled by default. It should - 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: - - * Check *encoding* and *errors* arguments on string encoding and decoding - operations. Examples: :func:`open`, :meth:`str.encode` and - :meth:`bytes.decode`. - * Add ``default`` warning filter, as :option:`-W` ``default``. - * Install debug hooks on memory allocators: see the - :c:func:`PyMem_SetupDebugHooks` C function. - * Enable the :mod:`faulthandler` module to dump the Python traceback - on a crash. - * Enable :ref:`asyncio debug mode `. - * Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to - ``True``. - * :class:`io.IOBase` destructor logs ``close()`` exceptions. - + * ``-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). @@ -890,8 +875,9 @@ conflict. .. envvar:: PYTHONDEVMODE - If this environment variable is set to a non-empty string, enable the - CPython "development mode". See the :option:`-X` ``dev`` option. + If this environment variable is set to a non-empty string, enable + :ref:`Python Development Mode `, introducing additional runtime + checks that are too expensive to be enabled by default. .. versionadded:: 3.7 diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 8a70fe22d52..04cfa57e144 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -102,7 +102,7 @@ CPython implementation improvements: * :ref:`PEP 538 `, legacy C locale coercion * :ref:`PEP 540 `, forced UTF-8 runtime mode * :ref:`PEP 552 `, deterministic .pycs -* :ref:`the new development runtime mode ` +* :ref:`New Python Development Mode ` * :ref:`PEP 565 `, improved :exc:`DeprecationWarning` handling @@ -479,15 +479,15 @@ Three new translations have been added: .. _whatsnew37-devmode: -Development Runtime Mode: -X dev +Python Development Mode (-X dev) -------------------------------- The new :option:`-X` ``dev`` command line option or the new :envvar:`PYTHONDEVMODE` environment variable can be used to enable -CPython's *development mode*. When in development mode, CPython performs +:ref:`Python Development Mode `. When in development mode, Python performs additional runtime checks that are too expensive to be enabled by default. -See :option:`-X` ``dev`` documentation for the full description of the effects -of this mode. +See :ref:`Python Development Mode ` documentation for the full +description. Other Language Changes diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a6e938faa99..ff5cb1486f9 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -90,9 +90,10 @@ Other Language Changes in this case. (Contributed by Victor Stinner in :issue:`20443`.) -* In development mode and in debug build, *encoding* and *errors* arguments are - now checked on string encoding and decoding operations. Examples: - :func:`open`, :meth:`str.encode` and :meth:`bytes.decode`. +* In the :ref:`Python Development Mode ` and in debug build, the + *encoding* and *errors* arguments are now checked for string encoding and + decoding operations. Examples: :func:`open`, :meth:`str.encode` and + :meth:`bytes.decode`. By default, for best performance, the *errors* argument is only checked at the first encoding/decoding error and the *encoding* argument is sometimes diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 4b5ceafe02d..54e662347e3 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -113,7 +113,11 @@ typedef struct { "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */ int utf8_mode; - int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ + /* If non-zero, enable the Python Development Mode. + + Set to 1 by the -X dev command line option. Set by the PYTHONDEVMODE + environment variable. */ + int dev_mode; /* Memory allocator: PYTHONMALLOC env var. See PyMemAllocatorName for valid values. */ @@ -131,7 +135,7 @@ typedef struct { int isolated; /* Isolated mode? see PyPreConfig.isolated */ int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Development mode? See PyPreConfig.dev_mode */ + int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ /* Install signal handlers? Yes by default. */ int install_signal_handlers; From e9652e8d58392f5022759ba06b444ce970eb12db Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Fri, 24 Jan 2020 10:03:22 +0000 Subject: [PATCH 193/380] bpo-39426: Fix outdated default and highest protocols in docs (GH-18154) Some portions of the pickle documentation hadn't been updated for the pickle protocol changes in Python 3.8 (new protocol 5, default protocol 4). This PR fixes those docs. https://bugs.python.org/issue39426 --- Lib/pickle.py | 6 +++--- Modules/_pickle.c | 19 ++++++++++--------- Modules/clinic/_pickle.c.h | 15 ++++++++------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Lib/pickle.py b/Lib/pickle.py index 01d41422aa4..d7adc162c98 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -409,9 +409,9 @@ class _Pickler: """This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the - given protocol; supported protocols are 0, 1, 2, 3 and 4. The - default protocol is 4. It was introduced in Python 3.4, it is - incompatible with previous versions. + given protocol; supported protocols are 0, 1, 2, 3, 4 and 5. + The default protocol is 4. It was introduced in Python 3.4, and + is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the diff --git a/Modules/_pickle.c b/Modules/_pickle.c index baa0a274196..25d5c8da920 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4645,8 +4645,9 @@ _pickle.Pickler.__init__ This takes a binary file for writing a pickle data stream. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 3; a backward-incompatible protocol designed for Python 3. +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible +with previous versions. Specifying a negative protocol version selects the highest protocol version supported. The higher the protocol used, the more recent the @@ -4678,7 +4679,7 @@ static int _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=0abedc50590d259b input=bb886e00443a7811]*/ +/*[clinic end generated code: output=0abedc50590d259b input=a7c969699bf5dad3]*/ { _Py_IDENTIFIER(persistent_id); _Py_IDENTIFIER(dispatch_table); @@ -7635,8 +7636,8 @@ This is equivalent to ``Pickler(file, protocol).dump(obj)``, but may be more efficient. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7662,7 +7663,7 @@ static PyObject * _pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=706186dba996490c input=cfdcaf573ed6e46c]*/ +/*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/ { PicklerObject *pickler = _Pickler_New(); @@ -7705,8 +7706,8 @@ _pickle.dumps Return the pickled representation of the object as a bytes object. The optional *protocol* argument tells the pickler to use the given -protocol; supported protocols are 0, 1, 2, 3 and 4. The default -protocol is 4. It was introduced in Python 3.4, it is incompatible +protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default +protocol is 4. It was introduced in Python 3.4, and is incompatible with previous versions. Specifying a negative protocol version selects the highest protocol @@ -7726,7 +7727,7 @@ into *file* as part of the pickle stream. It is an error if static PyObject * _pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol, int fix_imports, PyObject *buffer_callback) -/*[clinic end generated code: output=fbab0093a5580fdf input=9f334d535ff7194f]*/ +/*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/ { PyObject *result; PicklerObject *pickler = _Pickler_New(); diff --git a/Modules/clinic/_pickle.c.h b/Modules/clinic/_pickle.c.h index 9da3f1195a3..0457a433e79 100644 --- a/Modules/clinic/_pickle.c.h +++ b/Modules/clinic/_pickle.c.h @@ -69,8 +69,9 @@ PyDoc_STRVAR(_pickle_Pickler___init____doc__, "This takes a binary file for writing a pickle data stream.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 3; a backward-incompatible protocol designed for Python 3.\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" +"with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" "version supported. The higher the protocol used, the more recent the\n" @@ -463,8 +464,8 @@ PyDoc_STRVAR(_pickle_dump__doc__, "be more efficient.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -550,8 +551,8 @@ PyDoc_STRVAR(_pickle_dumps__doc__, "Return the pickled representation of the object as a bytes object.\n" "\n" "The optional *protocol* argument tells the pickler to use the given\n" -"protocol; supported protocols are 0, 1, 2, 3 and 4. The default\n" -"protocol is 4. It was introduced in Python 3.4, it is incompatible\n" +"protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default\n" +"protocol is 4. It was introduced in Python 3.4, and is incompatible\n" "with previous versions.\n" "\n" "Specifying a negative protocol version selects the highest protocol\n" @@ -835,4 +836,4 @@ skip_optional_kwonly: exit: return return_value; } -/*[clinic end generated code: output=de075ec48d4ee0e1 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=e2506823be1960c5 input=a9049054013a1b77]*/ From 2d5097663d7f80921fb07cdcd26c9d59cf71f1a2 Mon Sep 17 00:00:00 2001 From: Ammar Askar Date: Fri, 24 Jan 2020 05:35:01 -0500 Subject: [PATCH 194/380] bpo-39361: Document the removal of PyTypeObject.tp_print (GH-18125) --- 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 ff5cb1486f9..9b5b4fb3785 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -323,6 +323,11 @@ Build and C API Changes removed in Python 3.3. (Contributed by Victor Stinner in :issue:`38896`.) +* The ``tp_print`` slot of :ref:`PyTypeObject ` has been removed. + It was used for printing objects to files in Python 2.7 and before. Since + Python 3.0, it has been ignored and unused. + (Contributed by Jeroen Demeyer in :issue:`36974`.) + Deprecated ========== From 161e7b36b1ea871a1352ccfc1d4f4c1eda76830f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 24 Jan 2020 11:53:44 +0100 Subject: [PATCH 195/380] bpo-39413: Implement os.unsetenv() on Windows (GH-18163) The os.unsetenv() function is now also available on Windows. --- Doc/library/os.rst | 3 + Doc/whatsnew/3.9.rst | 3 + Lib/test/test_os.py | 43 ++++-- .../2020-01-24-10-10-25.bpo-39413.7XYDM8.rst | 1 + Modules/clinic/posixmodule.c.h | 42 +++++- Modules/posixmodule.c | 127 +++++++++++------- 6 files changed, 160 insertions(+), 59 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4fec647828e..de3e5603e10 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -645,6 +645,9 @@ process and user. .. availability:: most flavors of Unix, Windows. + .. versionchanged:: 3.9 + The function is now also available on Windows. + .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 9b5b4fb3785..751562e875e 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -224,6 +224,9 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and :data:`os.P_PIDFD` (:issue:`38713`) for process management with file descriptors. +The :func:`os.unsetenv` function is now also available on Windows. +(Contributed by Victor Stinner in :issue:`39413`.) + poplib ------ diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 82c441c2048..dbdc00c2fea 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -953,17 +953,44 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) + @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") + @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") + def test_putenv_unsetenv(self): + name = "PYTHONTESTVAR" + value = "testvalue" + code = f'import os; print(repr(os.environ.get({name!r})))' + + with support.EnvironmentVarGuard() as env: + env.pop(name, None) + + os.putenv(name, value) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(value)) + + os.unsetenv(name) + proc = subprocess.run([sys.executable, '-c', code], check=True, + stdout=subprocess.PIPE, text=True) + self.assertEqual(proc.stdout.rstrip(), repr(None)) + # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - def test_unset_error(self): + @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") + @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") + def test_putenv_unsetenv_error(self): + # Empty variable name is invalid. + # "=" and null character are not allowed in a variable name. + for name in ('', '=name', 'na=me', 'name=', 'name\0', 'na\0me'): + self.assertRaises((OSError, ValueError), os.putenv, name, "value") + self.assertRaises((OSError, ValueError), os.unsetenv, name) + if sys.platform == "win32": - # an environment variable is limited to 32,767 characters - key = 'x' * 50000 - self.assertRaises(ValueError, os.environ.__delitem__, key) - else: - # "=" is not allowed in a variable name - key = 'key=' - self.assertRaises(OSError, os.environ.__delitem__, key) + # On Windows, an environment variable string ("name=value" string) + # is limited to 32,767 characters + longstr = 'x' * 32_768 + self.assertRaises(ValueError, os.putenv, longstr, "1") + self.assertRaises(ValueError, os.putenv, "X", longstr) + self.assertRaises(ValueError, os.unsetenv, longstr) def test_key_type(self): missing = 'missingkey' diff --git a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst new file mode 100644 index 00000000000..a185ab5efe2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst @@ -0,0 +1 @@ +The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 13a69cd5f0e..0f5995ec640 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6125,7 +6125,43 @@ exit: #endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ -#if defined(HAVE_UNSETENV) +#if defined(MS_WINDOWS) + +PyDoc_STRVAR(os_unsetenv__doc__, +"unsetenv($module, name, /)\n" +"--\n" +"\n" +"Delete an environment variable."); + +#define OS_UNSETENV_METHODDEF \ + {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__}, + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name); + +static PyObject * +os_unsetenv(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + PyObject *name; + + if (!PyUnicode_Check(arg)) { + _PyArg_BadArgument("unsetenv", "argument", "str", arg); + goto exit; + } + if (PyUnicode_READY(arg) == -1) { + goto exit; + } + name = arg; + return_value = os_unsetenv_impl(module, name); + +exit: + return return_value; +} + +#endif /* defined(MS_WINDOWS) */ + +#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6157,7 +6193,7 @@ exit: return return_value; } -#endif /* defined(HAVE_UNSETENV) */ +#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8773,4 +8809,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=6f42d8be634f5942 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=0348cbdff48691e3 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6a687529df0..3a8e6aacb2a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -10082,6 +10082,64 @@ posix_putenv_dict_setitem(PyObject *name, PyObject *value) #endif /* PY_PUTENV_DICT */ +#ifdef MS_WINDOWS +static PyObject* +win32_putenv(PyObject *name, PyObject *value) +{ + /* Search from index 1 because on Windows starting '=' is allowed for + defining hidden environment variables. */ + if (PyUnicode_GET_LENGTH(name) == 0 || + PyUnicode_FindChar(name, '=', 1, PyUnicode_GET_LENGTH(name), 1) != -1) + { + PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); + return NULL; + } + PyObject *unicode; + if (value != NULL) { + unicode = PyUnicode_FromFormat("%U=%U", name, value); + } + else { + unicode = PyUnicode_FromFormat("%U=", name); + } + if (unicode == NULL) { + return NULL; + } + + Py_ssize_t size; + /* PyUnicode_AsWideCharString() rejects embedded null characters */ + wchar_t *env = PyUnicode_AsWideCharString(unicode, &size); + Py_DECREF(unicode); + + if (env == NULL) { + return NULL; + } + if (size > _MAX_ENV) { + PyErr_Format(PyExc_ValueError, + "the environment variable is longer than %u characters", + _MAX_ENV); + PyMem_Free(env); + return NULL; + } + + /* _wputenv() and SetEnvironmentVariableW() update the environment in the + Process Environment Block (PEB). _wputenv() also updates CRT 'environ' + and '_wenviron' variables, whereas SetEnvironmentVariableW() does not. + + Prefer _wputenv() to be compatible with C libraries using CRT + variables and CRT functions using these variables (ex: getenv()). */ + int err = _wputenv(env); + PyMem_Free(env); + + if (err) { + posix_error(); + return NULL; + } + + Py_RETURN_NONE; +} +#endif + + #ifdef MS_WINDOWS /*[clinic input] os.putenv @@ -10097,47 +10155,7 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ { - const wchar_t *env; - Py_ssize_t size; - - /* Search from index 1 because on Windows starting '=' is allowed for - defining hidden environment variables. */ - if (PyUnicode_GET_LENGTH(name) == 0 || - PyUnicode_FindChar(name, '=', 1, PyUnicode_GET_LENGTH(name), 1) != -1) - { - PyErr_SetString(PyExc_ValueError, "illegal environment variable name"); - return NULL; - } - PyObject *unicode = PyUnicode_FromFormat("%U=%U", name, value); - if (unicode == NULL) { - return NULL; - } - - env = PyUnicode_AsUnicodeAndSize(unicode, &size); - if (env == NULL) - goto error; - if (size > _MAX_ENV) { - PyErr_Format(PyExc_ValueError, - "the environment variable is longer than %u characters", - _MAX_ENV); - goto error; - } - if (wcslen(env) != (size_t)size) { - PyErr_SetString(PyExc_ValueError, "embedded null character"); - goto error; - } - - if (_wputenv(env)) { - posix_error(); - goto error; - } - Py_DECREF(unicode); - - Py_RETURN_NONE; - -error: - Py_DECREF(unicode); - return NULL; + return win32_putenv(name, value); } /* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ #elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) @@ -10186,7 +10204,23 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) #endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ -#ifdef HAVE_UNSETENV +#ifdef MS_WINDOWS +/*[clinic input] +os.unsetenv + name: unicode + / + +Delete an environment variable. +[clinic start generated code]*/ + +static PyObject * +os_unsetenv_impl(PyObject *module, PyObject *name) +/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ +{ + return win32_putenv(name, NULL); +} +/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ +#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) /*[clinic input] os.unsetenv name: FSConverter @@ -10199,16 +10233,13 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ { -#ifndef HAVE_BROKEN_UNSETENV - int err; -#endif - #ifdef HAVE_BROKEN_UNSETENV unsetenv(PyBytes_AS_STRING(name)); #else - err = unsetenv(PyBytes_AS_STRING(name)); - if (err) + int err = unsetenv(PyBytes_AS_STRING(name)); + if (err) { return posix_error(); + } #endif #ifdef PY_PUTENV_DICT From b8d1262e8afe7b907b4a394a191739571092acdb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 24 Jan 2020 14:05:48 +0100 Subject: [PATCH 196/380] bpo-39395: putenv() and unsetenv() always available (GH-18135) The os.putenv() and os.unsetenv() functions are now always available. On non-Windows platforms, Python now requires setenv() and unsetenv() functions to build. Remove putenv_dict from posixmodule.c: it's not longer needed. --- Doc/library/os.rst | 43 +++++----- Doc/whatsnew/3.9.rst | 8 ++ Lib/os.py | 32 ++----- Lib/test/test_os.py | 4 - Lib/test/test_posix.py | 1 - .../2020-01-23-03-05-13.bpo-39395.RoArIZ.rst | 2 + .../2020-01-23-03-05-41.bpo-39395.4dda42.rst | 2 + Modules/clinic/posixmodule.c.h | 10 +-- Modules/posixmodule.c | 83 +------------------ configure | 6 +- configure.ac | 6 +- pyconfig.h.in | 9 -- 12 files changed, 52 insertions(+), 154 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst create mode 100644 Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index de3e5603e10..f59423c6f2d 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -111,9 +111,9 @@ process and user. to the environment made after this time are not reflected in ``os.environ``, except for changes made by modifying ``os.environ`` directly. - If the platform supports the :func:`putenv` function, this mapping may be used - to modify the environment as well as query the environment. :func:`putenv` will - be called automatically when the mapping is modified. + This mapping may be used to modify the environment as well as query the + environment. :func:`putenv` will be called automatically when the mapping + is modified. On Unix, keys and values use :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :data:`environb` if you would like @@ -130,14 +130,10 @@ process and user. cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - If :func:`putenv` is not provided, a modified copy of this mapping may be - passed to the appropriate process-creation functions to cause child processes - to use a modified environment. - - If the platform supports the :func:`unsetenv` function, you can delete items in - this mapping to unset environment variables. :func:`unsetenv` will be called - automatically when an item is deleted from ``os.environ``, and when - one of the :meth:`pop` or :meth:`clear` methods is called. + You can delete items in this mapping to unset environment variables. + :func:`unsetenv` will be called automatically when an item is deleted from + ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is + called. .. data:: environb @@ -439,17 +435,18 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - .. availability:: most flavors of Unix, Windows. + Assignments to items in ``os.environ`` are automatically translated into + corresponding calls to :func:`putenv`; however, calls to :func:`putenv` + don't update ``os.environ``, so it is actually preferable to assign to items + of ``os.environ``. .. note:: On some platforms, including FreeBSD and Mac OS X, setting ``environ`` may - cause memory leaks. Refer to the system documentation for putenv. + cause memory leaks. Refer to the system documentation for :c:func:`putenv`. - When :func:`putenv` is supported, assignments to items in ``os.environ`` are - automatically translated into corresponding calls to :func:`putenv`; however, - calls to :func:`putenv` don't update ``os.environ``, so it is actually - preferable to assign to items of ``os.environ``. + .. versionchanged:: 3.9 + The function is now always available. .. function:: setegid(egid) @@ -638,15 +635,13 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - When :func:`unsetenv` is supported, deletion of items in ``os.environ`` is - automatically translated into a corresponding call to :func:`unsetenv`; however, - calls to :func:`unsetenv` don't update ``os.environ``, so it is actually - preferable to delete items of ``os.environ``. - - .. availability:: most flavors of Unix, Windows. + Deletion of items in ``os.environ`` is automatically translated into a + corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` + don't update ``os.environ``, so it is actually preferable to delete items of + ``os.environ``. .. versionchanged:: 3.9 - The function is now also available on Windows. + The function is now always available and is also available on Windows. .. _os-newstreams: diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 751562e875e..a4c4266bfc3 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -227,6 +227,10 @@ descriptors. The :func:`os.unsetenv` function is now also available on Windows. (Contributed by Victor Stinner in :issue:`39413`.) +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. +(Contributed by Victor Stinner in :issue:`39395`.) + poplib ------ @@ -331,6 +335,10 @@ Build and C API Changes Python 3.0, it has been ignored and unused. (Contributed by Jeroen Demeyer in :issue:`36974`.) +* On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` + functions are now required to build Python. + (Contributed by Victor Stinner in :issue:`39395`.) + Deprecated ========== diff --git a/Lib/os.py b/Lib/os.py index ca418edbc57..7ae102617e8 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -654,17 +654,15 @@ def get_exec_path(env=None): return path_list.split(pathsep) -# Change environ to automatically call putenv(), unsetenv if they exist. +# Change environ to automatically call putenv() and unsetenv() from _collections_abc import MutableMapping class _Environ(MutableMapping): - def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue, putenv, unsetenv): + def __init__(self, data, encodekey, decodekey, encodevalue, decodevalue): self.encodekey = encodekey self.decodekey = decodekey self.encodevalue = encodevalue self.decodevalue = decodevalue - self.putenv = putenv - self.unsetenv = unsetenv self._data = data def __getitem__(self, key): @@ -678,12 +676,12 @@ class _Environ(MutableMapping): def __setitem__(self, key, value): key = self.encodekey(key) value = self.encodevalue(value) - self.putenv(key, value) + putenv(key, value) self._data[key] = value def __delitem__(self, key): encodedkey = self.encodekey(key) - self.unsetenv(encodedkey) + unsetenv(encodedkey) try: del self._data[encodedkey] except KeyError: @@ -712,22 +710,6 @@ class _Environ(MutableMapping): self[key] = value return self[key] -try: - _putenv = putenv -except NameError: - _putenv = lambda key, value: None -else: - if "putenv" not in __all__: - __all__.append("putenv") - -try: - _unsetenv = unsetenv -except NameError: - _unsetenv = lambda key: _putenv(key, "") -else: - if "unsetenv" not in __all__: - __all__.append("unsetenv") - def _createenviron(): if name == 'nt': # Where Env Var Names Must Be UPPERCASE @@ -755,8 +737,7 @@ def _createenviron(): data = environ return _Environ(data, encodekey, decode, - encode, decode, - _putenv, _unsetenv) + encode, decode) # unicode environ environ = _createenviron() @@ -781,8 +762,7 @@ if supports_bytes_environ: # bytes environ environb = _Environ(environ._data, _check_bytes, bytes, - _check_bytes, bytes, - _putenv, _unsetenv) + _check_bytes, bytes) del _check_bytes def getenvb(key, default=None): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index dbdc00c2fea..9e3a1695dfb 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -953,8 +953,6 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape') self.assertEqual(os.environ['bytes'], value_str) - @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") - @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") def test_putenv_unsetenv(self): name = "PYTHONTESTVAR" value = "testvalue" @@ -975,8 +973,6 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415). @support.requires_mac_ver(10, 6) - @unittest.skipUnless(hasattr(os, 'putenv'), "Test needs os.putenv()") - @unittest.skipUnless(hasattr(os, 'unsetenv'), "Test needs os.unsetenv()") def test_putenv_unsetenv_error(self): # Empty variable name is invalid. # "=" and null character are not allowed in a variable name. diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 4df882b6210..fad26d88be2 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -969,7 +969,6 @@ class PosixTester(unittest.TestCase): self.assertEqual(type(k), item_type) self.assertEqual(type(v), item_type) - @unittest.skipUnless(hasattr(os, "putenv"), "requires os.putenv()") def test_putenv(self): with self.assertRaises(ValueError): os.putenv('FRUIT\0VEGETABLE', 'cabbage') diff --git a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst new file mode 100644 index 00000000000..aa2146a11d9 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst @@ -0,0 +1,2 @@ +On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` functions +are now required to build Python. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst new file mode 100644 index 00000000000..cf713709dcf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst @@ -0,0 +1,2 @@ +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 0f5995ec640..48dd7a74b3b 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -6082,7 +6082,7 @@ exit: #endif /* defined(MS_WINDOWS) */ -#if ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_putenv__doc__, "putenv($module, name, value, /)\n" @@ -6123,7 +6123,7 @@ exit: return return_value; } -#endif /* ((defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS)) */ +#endif /* !defined(MS_WINDOWS) */ #if defined(MS_WINDOWS) @@ -6161,7 +6161,7 @@ exit: #endif /* defined(MS_WINDOWS) */ -#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) +#if !defined(MS_WINDOWS) PyDoc_STRVAR(os_unsetenv__doc__, "unsetenv($module, name, /)\n" @@ -6193,7 +6193,7 @@ exit: return return_value; } -#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */ +#endif /* !defined(MS_WINDOWS) */ PyDoc_STRVAR(os_strerror__doc__, "strerror($module, code, /)\n" @@ -8809,4 +8809,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=0348cbdff48691e3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5d99f90cead7c0e1 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3a8e6aacb2a..b71eddf90b7 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -819,22 +819,8 @@ dir_fd_converter(PyObject *o, void *p) } } -/* Windows _wputenv() and setenv() copy the arguments and so don't require - the caller to manage the variable memory. Only Unix putenv() requires - putenv_dict. */ -#if defined(HAVE_PUTENV) && !defined(MS_WINDOWS) && !defined(HAVE_SETENV) -# define PY_PUTENV_DICT -#endif - typedef struct { PyObject *billion; -#ifdef PY_PUTENV_DICT - /* putenv() requires that the caller manages the environment variable - memory. Use a Python dictionary for that: name => env, where env is a - string like "name=value". On Windows, dict keys and values are Unicode - strings. On Unix, they are bytes strings. */ - PyObject *putenv_dict; -#endif PyObject *DirEntryType; PyObject *ScandirIteratorType; #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2118,9 +2104,6 @@ static int _posix_clear(PyObject *module) { Py_CLEAR(_posixstate(module)->billion); -#ifdef PY_PUTENV_DICT - Py_CLEAR(_posixstate(module)->putenv_dict); -#endif Py_CLEAR(_posixstate(module)->DirEntryType); Py_CLEAR(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -2145,9 +2128,6 @@ static int _posix_traverse(PyObject *module, visitproc visit, void *arg) { Py_VISIT(_posixstate(module)->billion); -#ifdef PY_PUTENV_DICT - Py_VISIT(_posixstate(module)->putenv_dict); -#endif Py_VISIT(_posixstate(module)->DirEntryType); Py_VISIT(_posixstate(module)->ScandirIteratorType); #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) @@ -10065,23 +10045,6 @@ os_posix_fadvise_impl(PyObject *module, int fd, Py_off_t offset, #endif /* HAVE_POSIX_FADVISE && !POSIX_FADVISE_AIX_BUG */ -#ifdef PY_PUTENV_DICT -static void -posix_putenv_dict_setitem(PyObject *name, PyObject *value) -{ - /* Install the first arg and newstr in putenv_dict; - * this will cause previous value to be collected. This has to - * happen after the real putenv() call because the old value - * was still accessible until then. */ - if (PyDict_SetItem(_posixstate_global->putenv_dict, name, value)) - /* really not much we can do; just leak */ - PyErr_Clear(); - else - Py_DECREF(value); -} -#endif /* PY_PUTENV_DICT */ - - #ifdef MS_WINDOWS static PyObject* win32_putenv(PyObject *name, PyObject *value) @@ -10157,8 +10120,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) { return win32_putenv(name, value); } -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif (defined(HAVE_SETENV) || defined(HAVE_PUTENV)) && !defined(MS_WINDOWS) +#else /*[clinic input] os.putenv @@ -10181,27 +10143,12 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) return NULL; } -#ifdef HAVE_SETENV if (setenv(name_string, value_string, 1)) { return posix_error(); } -#else - PyObject *bytes = PyBytes_FromFormat("%s=%s", name_string, value_string); - if (bytes == NULL) { - return NULL; - } - - char *env = PyBytes_AS_STRING(bytes); - if (putenv(env)) { - Py_DECREF(bytes); - return posix_error(); - } - - posix_putenv_dict_setitem(name, bytes); -#endif Py_RETURN_NONE; } -#endif /* defined(HAVE_SETENV) || defined(HAVE_PUTENV) */ +#endif /* !defined(MS_WINDOWS) */ #ifdef MS_WINDOWS @@ -10219,8 +10166,7 @@ os_unsetenv_impl(PyObject *module, PyObject *name) { return win32_putenv(name, NULL); } -/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */ -#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS) +#else /*[clinic input] os.unsetenv name: FSConverter @@ -10242,24 +10188,9 @@ os_unsetenv_impl(PyObject *module, PyObject *name) } #endif -#ifdef PY_PUTENV_DICT - /* Remove the key from putenv_dict; - * this will cause it to be collected. This has to - * happen after the real unsetenv() call because the - * old value was still accessible until then. - */ - if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) { - /* really not much we can do; just leak */ - if (!PyErr_ExceptionMatches(PyExc_KeyError)) { - return NULL; - } - PyErr_Clear(); - } -#endif - Py_RETURN_NONE; } -#endif /* HAVE_UNSETENV */ +#endif /* !MS_WINDOWS */ /*[clinic input] @@ -14553,12 +14484,6 @@ INITFUNC(void) Py_INCREF(PyExc_OSError); PyModule_AddObject(m, "error", PyExc_OSError); -#ifdef PY_PUTENV_DICT - /* Save putenv() parameters as values here, so we can collect them when they - * get re-set with another call for the same key. */ - _posixstate(m)->putenv_dict = PyDict_New(); -#endif - #if defined(HAVE_WAITID) && !defined(__APPLE__) waitid_result_desc.name = MODNAME ".waitid_result"; PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc); diff --git a/configure b/configure index e96683622b3..85120e498d1 100755 --- a/configure +++ b/configure @@ -11548,9 +11548,9 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ @@ -11558,7 +11558,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 unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes 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 36c165b2f2e..ab8e1b7d27a 100644 --- a/configure.ac +++ b/configure.ac @@ -3598,9 +3598,9 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \ memrchr mbrtowc mkdirat mkfifo \ madvise mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise posix_spawn posix_spawnp pread preadv preadv2 \ - pthread_condattr_setclock pthread_init pthread_kill putenv pwrite pwritev pwritev2 \ + pthread_condattr_setclock pthread_init pthread_kill pwrite pwritev pwritev2 \ readlink readlinkat readv realpath renameat \ - sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid setenv seteuid \ + sem_open sem_timedwait sem_getvalue sem_unlink sendfile setegid seteuid \ setgid sethostname \ setlocale setregid setreuid setresuid setresgid setsid setpgid setpgrp setpriority setuid setvbuf \ sched_get_priority_max sched_setaffinity sched_setscheduler sched_setparam \ @@ -3608,7 +3608,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 unsetenv utimensat utimes waitid waitpid wait3 wait4 \ + truncate uname unlinkat utimensat utimes 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 1918fab8bdb..b5602134d70 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -802,9 +802,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PTY_H -/* Define to 1 if you have the `putenv' function. */ -#undef HAVE_PUTENV - /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE @@ -895,9 +892,6 @@ /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID -/* Define to 1 if you have the `setenv' function. */ -#undef HAVE_SETENV - /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID @@ -1266,9 +1260,6 @@ /* Define to 1 if you have the `unlinkat' function. */ #undef HAVE_UNLINKAT -/* Define to 1 if you have the `unsetenv' function. */ -#undef HAVE_UNSETENV - /* Define if you have a useable wchar_t type defined in wchar.h; useable means wchar_t must be an unsigned type with at least 16 bits. (see Include/unicodeobject.h). */ From 66b00a9d3aacf6ed49412f48743e4913104a2bb3 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Fri, 24 Jan 2020 18:44:29 +0530 Subject: [PATCH 197/380] bpo-38473: Handle autospecced functions and methods used with attach_mock (GH-16784) --- Lib/unittest/mock.py | 4 +++ Lib/unittest/test/testmock/testmock.py | 29 +++++++++++++++++++ .../2019-10-14-21-14-55.bpo-38473.uXpVld.rst | 2 ++ 3 files changed, 35 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 3fafe594c59..92b596f672c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -817,6 +817,10 @@ class NonCallableMock(Base): if child is None or isinstance(child, _SpecState): break else: + # If an autospecced object is attached using attach_mock the + # child would be a function with mock object as attribute from + # which signature has to be derived. + child = _extract_mock(child) children = child._mock_children sig = child._spec_signature diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 01bc4794446..1030d12323d 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1922,6 +1922,35 @@ class MockTest(unittest.TestCase): self.assertEqual(mock_func.mock._extract_mock_name(), 'mock.child') + def test_attach_mock_patch_autospec_signature(self): + with mock.patch(f'{__name__}.Something.meth', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_meth') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_meth(mock.ANY, 1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + mocked.assert_has_calls([call(mock.ANY, 1, 2, 3, d=4)]) + + with mock.patch(f'{__name__}.something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_func') + something(1) + manager.assert_has_calls([call.attach_func(1)]) + something.assert_has_calls([call(1)]) + mocked.assert_has_calls([call(1)]) + + with mock.patch(f'{__name__}.Something', autospec=True) as mocked: + manager = Mock() + manager.attach_mock(mocked, 'attach_obj') + obj = Something() + obj.meth(1, 2, 3, d=4) + manager.assert_has_calls([call.attach_obj(), + call.attach_obj().meth(1, 2, 3, d=4)]) + obj.meth.assert_has_calls([call(1, 2, 3, d=4)]) + mocked.assert_has_calls([call(), call().meth(1, 2, 3, d=4)]) + + def test_attribute_deletion(self): for mock in (Mock(), MagicMock(), NonCallableMagicMock(), NonCallableMock()): diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst new file mode 100644 index 00000000000..de80e89e00e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst @@ -0,0 +1,2 @@ +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. From 88704334e5262c6cd395a0809d4ef810f33f3ca5 Mon Sep 17 00:00:00 2001 From: mbarkhau Date: Fri, 24 Jan 2020 14:51:16 +0000 Subject: [PATCH 198/380] bpo-39390 shutil: fix argument types for ignore callback (GH-18122) --- Lib/shutil.py | 2 +- Lib/test/test_shutil.py | 42 +++++++++++++++++++ .../2020-01-23-21-34-29.bpo-39390.D2tSXk.rst | 2 + 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst diff --git a/Lib/shutil.py b/Lib/shutil.py index 8f609b312d3..9a83a3242ed 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -442,7 +442,7 @@ def ignore_patterns(*patterns): def _copytree(entries, src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok=False): if ignore is not None: - ignored_names = ignore(src, {x.name for x in entries}) + ignored_names = ignore(os.fspath(src), [x.name for x in entries]) else: ignored_names = set() diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index 460b979ba93..076c450e09b 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -579,6 +579,48 @@ class TestCopyTree(BaseTest, unittest.TestCase): shutil.rmtree(src_dir) shutil.rmtree(os.path.dirname(dst_dir)) + def test_copytree_arg_types_of_ignore(self): + join = os.path.join + exists = os.path.exists + + tmp_dir = self.mkdtemp() + src_dir = join(tmp_dir, "source") + + os.mkdir(join(src_dir)) + os.mkdir(join(src_dir, 'test_dir')) + os.mkdir(os.path.join(src_dir, 'test_dir', 'subdir')) + write_file((src_dir, 'test_dir', 'subdir', 'test.txt'), '456') + + invokations = [] + + def _ignore(src, names): + invokations.append(src) + self.assertIsInstance(src, str) + self.assertIsInstance(names, list) + self.assertEqual(len(names), len(set(names))) + for name in names: + self.assertIsInstance(name, str) + return [] + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(src_dir, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + shutil.copytree(pathlib.Path(src_dir), dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + dst_dir = join(self.mkdtemp(), 'destination') + src_dir_entry = list(os.scandir(tmp_dir))[0] + self.assertIsInstance(src_dir_entry, os.DirEntry) + shutil.copytree(src_dir_entry, dst_dir, ignore=_ignore) + self.assertTrue(exists(join(dst_dir, 'test_dir', 'subdir', + 'test.txt'))) + + self.assertEqual(len(invokations), 9) + def test_copytree_retains_permissions(self): tmp_dir = self.mkdtemp() src_dir = os.path.join(tmp_dir, 'source') diff --git a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst new file mode 100644 index 00000000000..ffa961ea4cd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst @@ -0,0 +1,2 @@ +Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. From 656c45ec9a9dc2e94cec199ebde553a6979e0e05 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 24 Jan 2020 18:05:24 +0100 Subject: [PATCH 199/380] bpo-38631: Avoid Py_FatalError() in GC collect() (GH-18164) collect() should not get an exception, but it does, logging the exception is enough. Override sys.unraisablehook to decide how to handle unraisable exceptions. Py_FatalError() should be avoided whenever possible. --- Modules/gcmodule.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index aacdb3f45a1..99a6c9ed91d 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -118,9 +118,6 @@ gc_decref(PyGC_Head *g) g->_gc_prev -= 1 << _PyGC_PREV_SHIFT; } -/* Python string to use if unhandled exception occurs */ -static PyObject *gc_str = NULL; - /* set for debugging information */ #define DEBUG_STATS (1<<0) /* print collection statistics */ #define DEBUG_COLLECTABLE (1<<1) /* print collectable objects */ @@ -1310,10 +1307,7 @@ collect(PyThreadState *tstate, int generation, _PyErr_Clear(tstate); } else { - if (gc_str == NULL) - gc_str = PyUnicode_FromString("garbage collection"); - PyErr_WriteUnraisable(gc_str); - Py_FatalError("unexpected exception during garbage collection"); + _PyErr_WriteUnraisableMsg("in garbage collection", NULL); } } From 9017e0bd5e124ae6d2ed94b9e9cacb2e86270980 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 24 Jan 2020 19:55:52 +0200 Subject: [PATCH 200/380] bpo-39430: Fix race condition in lazy imports in tarfile. (GH-18161) Use `from ... import ...` to ensure module is fully loaded before accessing its attributes. --- Lib/tarfile.py | 18 ++++++++---------- .../2020-01-24-11-05-21.bpo-39430.I0UQzM.rst | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index d0b748cea17..90a2c95b315 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1655,13 +1655,12 @@ class TarFile(object): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): + from gzip import GzipFile + except ImportError: raise CompressionError("gzip module is not available") try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + fileobj = GzipFile(name, mode + "b", compresslevel, fileobj) except OSError: if fileobj is not None and mode == 'r': raise ReadError("not a gzip file") @@ -1689,12 +1688,11 @@ class TarFile(object): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import bz2 + from bz2 import BZ2File except ImportError: raise CompressionError("bz2 module is not available") - fileobj = bz2.BZ2File(fileobj or name, mode, - compresslevel=compresslevel) + fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel) try: t = cls.taropen(name, mode, fileobj, **kwargs) @@ -1718,15 +1716,15 @@ class TarFile(object): raise ValueError("mode must be 'r', 'w' or 'x'") try: - import lzma + from lzma import LZMAFile, LZMAError except ImportError: raise CompressionError("lzma module is not available") - fileobj = lzma.LZMAFile(fileobj or name, mode, preset=preset) + fileobj = LZMAFile(fileobj or name, mode, preset=preset) try: t = cls.taropen(name, mode, fileobj, **kwargs) - except (lzma.LZMAError, EOFError): + except (LZMAError, EOFError): fileobj.close() if mode == 'r': raise ReadError("not an lzma file") diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst new file mode 100644 index 00000000000..712fc5d34bb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst @@ -0,0 +1 @@ +Fixed race condition in lazy imports in :mod:`tarfile`. From c33378df3988de26a07df9cb9ba5df4192ed9c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Fri, 24 Jan 2020 22:05:07 +0100 Subject: [PATCH 201/380] Python 3.9.0a3 --- Include/patchlevel.h | 4 +- Lib/pydoc_data/topics.py | 167 +++- Misc/NEWS.d/3.9.0a3.rst | 906 ++++++++++++++++++ .../2019-12-27-22-18-26.bpo-39144.dwHMlR.rst | 1 - .../2019-12-30-03-54-24.bpo-39160.aBmj13.rst | 1 - .../2020-01-23-03-05-13.bpo-39395.RoArIZ.rst | 2 - .../2019-12-30-10-43-52.bpo-39164.WEV0uu.rst | 1 - .../2020-01-17-19-25-48.bpo-39372.hGJMY6.rst | 8 - .../2019-03-11-13-30-40.bpo-32021.dpbtkP.rst | 1 - .../2019-10-31-14-30-39.bpo-38610.fHdVMS.rst | 2 - .../2019-12-17-22-32-11.bpo-13601.vNP4LC.rst | 6 - .../2019-12-29-19-13-54.bpo-38588.pgXnNS.rst | 2 - .../2019-12-30-10-53-59.bpo-39156.veT-CB.rst | 9 - .../2019-12-31-18-25-45.bpo-39114.WG9alt.rst | 2 - .../2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst | 2 - .../2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst | 2 - .../2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst | 2 - .../2020-01-04-17-25-34.bpo-39215.xiqiIz.rst | 2 - .../2020-01-05-06-55-52.bpo-39216.74jLh9.rst | 2 - ...2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst | 1 - .../2020-01-06-10-29-16.bpo-39209.QHAONe.rst | 2 - .../2020-01-09-10-01-18.bpo-39235.RYwjoc.rst | 2 - .../2020-01-13-14-45-22.bpo-39048.iPsj81.rst | 4 - .../2020-01-13-15-18-13.bpo-39322.aAs-1T.rst | 2 - .../2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst | 1 - .../2020-01-15-15-33-44.bpo-39320.b4hnJW.rst | 15 - .../2020-01-17-00-00-58.bpo-17005.nTSxsy.rst | 3 - .../2020-01-20-21-40-57.bpo-39386.ULqD8t.rst | 1 - .../2020-01-22-15-53-37.bpo-39421.O3nG7u.rst | 2 - .../2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst | 2 - .../2019-11-17-11-53-10.bpo-3530.8zFUMc.rst | 2 - .../2019-12-15-22-04-41.bpo-38918.8JnDTS.rst | 3 - .../2020-01-18-15-37-56.bpo-39381.wTWe8d.rst | 2 - .../2018-03-03-12-56-26.bpo-32989.FVhmhH.rst | 2 - .../2019-12-30-16-44-07.bpo-34118.FaNW0a.rst | 2 - .../2020-01-22-22-28-06.bpo-39050.zkn0FO.rst | 1 - .../2019-05-06-22-38-47.bpo-28367.2AKen5.rst | 13 - .../2019-08-27-03-57-25.bpo-37958.lRORI3.rst | 2 - .../2019-09-29-08-17-03.bpo-38293.wls5s3.rst | 1 - .../2019-10-04-09-49-56.bpo-38361.LM4u4T.rst | 1 - .../2019-10-14-21-14-55.bpo-38473.uXpVld.rst | 2 - .../2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst | 2 - .../2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst | 5 - .../2019-10-31-19-23-25.bpo-35182.hzeNl9.rst | 3 - .../2019-11-17-17-32-35.bpo-38615.OVyaNX.rst | 5 - .../2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst | 2 - .../2019-11-26-23-21-56.bpo-38914.8l-g-T.rst | 5 - .../2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst | 2 - .../2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst | 1 - .../2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst | 2 - .../2019-12-15-19-23-23.bpo-39055.FmN3un.rst | 2 - .../2019-12-15-21-05-16.bpo-39056.nEfUM9.rst | 2 - .../2019-12-15-21-47-54.bpo-39057.FOxn-w.rst | 2 - .../2019-12-24-10-43-13.bpo-39129.jVx5rW.rst | 1 - .../2019-12-29-15-44-38.bpo-39158.cxVoOR.rst | 1 - .../2019-12-31-19-27-23.bpo-39142.oqU5iD.rst | 5 - .../2020-01-01-18-44-52.bpo-38871.3EEOLg.rst | 2 - .../2020-01-02-17-28-03.bpo-39191.ur_scy.rst | 3 - .../2020-01-02-20-21-03.bpo-39198.nzwGyG.rst | 1 - .../2020-01-03-18-02-50.bpo-39152.JgPjCC.rst | 2 - .../2020-01-06-02-14-38.bpo-38907.F1RkCR.rst | 1 - .../2020-01-07-01-02-44.bpo-39239.r7vecs.rst | 2 - .../2020-01-08-14-39-19.bpo-35292.ihRT1z.rst | 1 - .../2020-01-08-23-25-27.bpo-39242.bnL65N.rst | 3 - .../2020-01-09-10-58-58.bpo-39259.RmDgCC.rst | 3 - .../2020-01-10-16-52-09.bpo-39288.IB-aQX.rst | 2 - .../2020-01-10-22-30-48.bpo-38901.OdVIIb.rst | 3 - .../2020-01-11-00-32-45.bpo-39259._S5VjC.rst | 3 - .../2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst | 1 - .../2020-01-12-13-34-42.bpo-39310.YMRdcj.rst | 1 - .../2020-01-12-16-34-28.bpo-39259.J_yBVq.rst | 3 - .../2020-01-12-17-19-40.bpo-39259.iax06r.rst | 3 - .../2020-01-12-18-17-00.bpo-39313.DCTsnm.rst | 2 - .../2020-01-14-22-16-07.bpo-39329.6OKGBn.rst | 2 - .../2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst | 2 - .../2020-01-16-09-27-28.bpo-39351.a-FQdv.rst | 3 - .../2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst | 4 - .../2020-01-16-11-24-00.bpo-39357.bCwx-h.rst | 4 - .../2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst | 2 - .../2020-01-20-00-56-01.bpo-39389.fEirIS.rst | 2 - .../2020-01-20-13-00-35.bpo-39377.QSFdaU.rst | 2 - .../2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst | 2 - .../2020-01-21-09-00-42.bpo-39396.6UXQXE.rst | 1 - .../2020-01-22-21-18-58.bpo-39406.HMpe8x.rst | 3 - .../2020-01-23-03-05-41.bpo-39395.4dda42.rst | 2 - .../2020-01-23-21-34-29.bpo-39390.D2tSXk.rst | 2 - .../2020-01-24-10-10-25.bpo-39413.7XYDM8.rst | 1 - .../2020-01-24-11-05-21.bpo-39430.I0UQzM.rst | 1 - README.rst | 2 +- 89 files changed, 1024 insertions(+), 275 deletions(-) create mode 100644 Misc/NEWS.d/3.9.0a3.rst delete mode 100644 Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst delete mode 100644 Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst delete mode 100644 Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst delete mode 100644 Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst delete mode 100644 Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst delete mode 100644 Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst delete mode 100644 Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst delete mode 100644 Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst delete mode 100644 Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst diff --git a/Include/patchlevel.h b/Include/patchlevel.h index e6b33dad38e..d0720f7d8c6 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 9 #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.9.0a2+" +#define PY_VERSION "3.9.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 d9535f70be8..fd914465872 100644 --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Autogenerated by Sphinx on Wed Dec 18 22:05:39 2019 +# Autogenerated by Sphinx on Fri Jan 24 22:03:37 2020 topics = {'assert': 'The "assert" statement\n' '**********************\n' '\n' @@ -470,24 +470,25 @@ topics = {'assert': 'The "assert" statement\n' 'The following code:\n' '\n' ' async for TARGET in ITER:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'Is semantically equivalent to:\n' '\n' ' iter = (ITER)\n' ' iter = type(iter).__aiter__(iter)\n' ' running = True\n' + '\n' ' while running:\n' ' try:\n' ' TARGET = await type(iter).__anext__(iter)\n' ' except StopAsyncIteration:\n' ' running = False\n' ' else:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'See also "__aiter__()" and "__anext__()" for details.\n' '\n' @@ -507,23 +508,27 @@ topics = {'assert': 'The "assert" statement\n' '\n' 'The following code:\n' '\n' - ' async with EXPR as VAR:\n' - ' BLOCK\n' + ' async with EXPRESSION as TARGET:\n' + ' SUITE\n' '\n' - 'Is semantically equivalent to:\n' + 'is semantically equivalent to:\n' '\n' - ' mgr = (EXPR)\n' - ' aexit = type(mgr).__aexit__\n' - ' aenter = type(mgr).__aenter__(mgr)\n' + ' manager = (EXPRESSION)\n' + ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' + ' value = await aenter(manager)\n' + ' hit_except = False\n' '\n' - ' VAR = await aenter\n' ' try:\n' - ' BLOCK\n' + ' TARGET = value\n' + ' SUITE\n' ' except:\n' - ' if not await aexit(mgr, *sys.exc_info()):\n' + ' hit_except = True\n' + ' if not await aexit(manager, *sys.exc_info()):\n' ' raise\n' - ' else:\n' - ' await aexit(mgr, None, None, None)\n' + ' finally:\n' + ' if not hit_except:\n' + ' await aexit(manager, None, None, None)\n' '\n' 'See also "__aenter__()" and "__aexit__()" for details.\n' '\n' @@ -2519,11 +2524,13 @@ topics = {'assert': 'The "assert" statement\n' '"with_item")\n' ' is evaluated to obtain a context manager.\n' '\n' - '2. The context manager’s "__exit__()" is loaded for later use.\n' + '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' - '3. The context manager’s "__enter__()" method is invoked.\n' + '3. The context manager’s "__exit__()" is loaded for later use.\n' '\n' - '4. If a target was included in the "with" statement, the return\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' '\n' ' Note: The "with" statement guarantees that if the ' @@ -2536,9 +2543,9 @@ topics = {'assert': 'The "assert" statement\n' 'occurring\n' ' within the suite would be. See step 6 below.\n' '\n' - '5. The suite is executed.\n' + '6. The suite is executed.\n' '\n' - '6. The context manager’s "__exit__()" method is invoked. If an\n' + '7. The context manager’s "__exit__()" method is invoked. If an\n' ' exception caused the suite to be exited, its type, value, ' 'and\n' ' traceback are passed as arguments to "__exit__()". Otherwise, ' @@ -2560,18 +2567,42 @@ topics = {'assert': 'The "assert" statement\n' 'proceeds\n' ' at the normal location for the kind of exit that was taken.\n' '\n' + 'The following code:\n' + '\n' + ' with EXPRESSION as TARGET:\n' + ' SUITE\n' + '\n' + 'is semantically equivalent to:\n' + '\n' + ' manager = (EXPRESSION)\n' + ' enter = type(manager).__enter__\n' + ' exit = type(manager).__exit__\n' + ' value = enter(manager)\n' + ' hit_except = False\n' + '\n' + ' try:\n' + ' TARGET = value\n' + ' SUITE\n' + ' except:\n' + ' hit_except = True\n' + ' if not exit(manager, *sys.exc_info()):\n' + ' raise\n' + ' finally:\n' + ' if not hit_except:\n' + ' exit(manager, None, None, None)\n' + '\n' 'With more than one item, the context managers are processed as ' 'if\n' 'multiple "with" statements were nested:\n' '\n' ' with A() as a, B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' - 'is equivalent to\n' + 'is semantically equivalent to:\n' '\n' ' with A() as a:\n' ' with B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' 'Changed in version 3.1: Support for multiple context ' 'expressions.\n' @@ -2935,24 +2966,25 @@ topics = {'assert': 'The "assert" statement\n' 'The following code:\n' '\n' ' async for TARGET in ITER:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'Is semantically equivalent to:\n' '\n' ' iter = (ITER)\n' ' iter = type(iter).__aiter__(iter)\n' ' running = True\n' + '\n' ' while running:\n' ' try:\n' ' TARGET = await type(iter).__anext__(iter)\n' ' except StopAsyncIteration:\n' ' running = False\n' ' else:\n' - ' BLOCK\n' + ' SUITE\n' ' else:\n' - ' BLOCK2\n' + ' SUITE2\n' '\n' 'See also "__aiter__()" and "__anext__()" for details.\n' '\n' @@ -2972,23 +3004,27 @@ topics = {'assert': 'The "assert" statement\n' '\n' 'The following code:\n' '\n' - ' async with EXPR as VAR:\n' - ' BLOCK\n' + ' async with EXPRESSION as TARGET:\n' + ' SUITE\n' '\n' - 'Is semantically equivalent to:\n' + 'is semantically equivalent to:\n' '\n' - ' mgr = (EXPR)\n' - ' aexit = type(mgr).__aexit__\n' - ' aenter = type(mgr).__aenter__(mgr)\n' + ' manager = (EXPRESSION)\n' + ' aenter = type(manager).__aenter__\n' + ' aexit = type(manager).__aexit__\n' + ' value = await aenter(manager)\n' + ' hit_except = False\n' '\n' - ' VAR = await aenter\n' ' try:\n' - ' BLOCK\n' + ' TARGET = value\n' + ' SUITE\n' ' except:\n' - ' if not await aexit(mgr, *sys.exc_info()):\n' + ' hit_except = True\n' + ' if not await aexit(manager, *sys.exc_info()):\n' ' raise\n' - ' else:\n' - ' await aexit(mgr, None, None, None)\n' + ' finally:\n' + ' if not hit_except:\n' + ' await aexit(manager, None, None, None)\n' '\n' 'See also "__aenter__()" and "__aexit__()" for details.\n' '\n' @@ -6808,7 +6844,7 @@ topics = {'assert': 'The "assert" statement\n' 'object.__rfloordiv__(self, other)\n' 'object.__rmod__(self, other)\n' 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' + 'object.__rpow__(self, other[, modulo])\n' 'object.__rlshift__(self, other)\n' 'object.__rrshift__(self, other)\n' 'object.__rand__(self, other)\n' @@ -9483,7 +9519,7 @@ topics = {'assert': 'The "assert" statement\n' 'object.__rfloordiv__(self, other)\n' 'object.__rmod__(self, other)\n' 'object.__rdivmod__(self, other)\n' - 'object.__rpow__(self, other)\n' + 'object.__rpow__(self, other[, modulo])\n' 'object.__rlshift__(self, other)\n' 'object.__rrshift__(self, other)\n' 'object.__rand__(self, other)\n' @@ -9874,9 +9910,8 @@ topics = {'assert': 'The "assert" statement\n' 'best\n' ' performances, but only used at the first encoding ' 'error. Enable the\n' - ' development mode ("-X" "dev" option), or use a debug ' - 'build, to\n' - ' check *errors*.\n' + ' Python Development Mode, or use a debug build to check ' + '*errors*.\n' '\n' ' Changed in version 3.1: Support for keyword arguments ' 'added.\n' @@ -12401,6 +12436,8 @@ topics = {'assert': 'The "assert" statement\n' 'dictionary. This\n' ' is a shortcut for "reversed(d.keys())".\n' '\n' + ' New in version 3.8.\n' + '\n' ' setdefault(key[, default])\n' '\n' ' If *key* is in the dictionary, return its value. If ' @@ -13606,11 +13643,13 @@ topics = {'assert': 'The "assert" statement\n' '1. The context expression (the expression given in the "with_item")\n' ' is evaluated to obtain a context manager.\n' '\n' - '2. The context manager’s "__exit__()" is loaded for later use.\n' + '2. The context manager’s "__enter__()" is loaded for later use.\n' '\n' - '3. The context manager’s "__enter__()" method is invoked.\n' + '3. The context manager’s "__exit__()" is loaded for later use.\n' '\n' - '4. If a target was included in the "with" statement, the return\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' '\n' ' Note: The "with" statement guarantees that if the "__enter__()"\n' @@ -13620,9 +13659,9 @@ topics = {'assert': 'The "assert" statement\n' ' target list, it will be treated the same as an error occurring\n' ' within the suite would be. See step 6 below.\n' '\n' - '5. The suite is executed.\n' + '6. The suite is executed.\n' '\n' - '6. The context manager’s "__exit__()" method is invoked. If an\n' + '7. The context manager’s "__exit__()" method is invoked. If an\n' ' exception caused the suite to be exited, its type, value, and\n' ' traceback are passed as arguments to "__exit__()". Otherwise, ' 'three\n' @@ -13642,17 +13681,41 @@ topics = {'assert': 'The "assert" statement\n' 'proceeds\n' ' at the normal location for the kind of exit that was taken.\n' '\n' + 'The following code:\n' + '\n' + ' with EXPRESSION as TARGET:\n' + ' SUITE\n' + '\n' + 'is semantically equivalent to:\n' + '\n' + ' manager = (EXPRESSION)\n' + ' enter = type(manager).__enter__\n' + ' exit = type(manager).__exit__\n' + ' value = enter(manager)\n' + ' hit_except = False\n' + '\n' + ' try:\n' + ' TARGET = value\n' + ' SUITE\n' + ' except:\n' + ' hit_except = True\n' + ' if not exit(manager, *sys.exc_info()):\n' + ' raise\n' + ' finally:\n' + ' if not hit_except:\n' + ' exit(manager, None, None, None)\n' + '\n' 'With more than one item, the context managers are processed as if\n' 'multiple "with" statements were nested:\n' '\n' ' with A() as a, B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' - 'is equivalent to\n' + 'is semantically equivalent to:\n' '\n' ' with A() as a:\n' ' with B() as b:\n' - ' suite\n' + ' SUITE\n' '\n' 'Changed in version 3.1: Support for multiple context expressions.\n' '\n' diff --git a/Misc/NEWS.d/3.9.0a3.rst b/Misc/NEWS.d/3.9.0a3.rst new file mode 100644 index 00000000000..6c71d7e839d --- /dev/null +++ b/Misc/NEWS.d/3.9.0a3.rst @@ -0,0 +1,906 @@ +.. bpo: 39427 +.. date: 2020-01-22-22-28-04 +.. nonce: LiO-Eo +.. release date: 2020-01-24 +.. section: Core and Builtins + +Document all possibilities for the ``-X`` options in the command line help +section. Patch by Pablo Galindo. + +.. + +.. bpo: 39421 +.. date: 2020-01-22-15-53-37 +.. nonce: O3nG7u +.. section: Core and Builtins + +Fix possible crashes when operating with the functions in the :mod:`heapq` +module and custom comparison operators. + +.. + +.. bpo: 39386 +.. date: 2020-01-20-21-40-57 +.. nonce: ULqD8t +.. section: Core and Builtins + +Prevent double awaiting of async iterator. + +.. + +.. bpo: 17005 +.. date: 2020-01-17-00-00-58 +.. nonce: nTSxsy +.. section: Core and Builtins + +Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to +offers functionality to perform topological sorting of graphs. Patch by +Pablo Galindo, Tim Peters and Larry Hastings. + +.. + +.. bpo: 39320 +.. date: 2020-01-15-15-33-44 +.. nonce: b4hnJW +.. section: Core and Builtins + +Replace four complex bytecodes for building sequences with three simpler +ones. + +The following four bytecodes have been removed: + +* BUILD_LIST_UNPACK +* BUILD_TUPLE_UNPACK +* BUILD_SET_UNPACK +* BUILD_TUPLE_UNPACK_WITH_CALL + +The following three bytecodes have been added: + +* LIST_TO_TUPLE +* LIST_EXTEND +* SET_UPDATE + +.. + +.. bpo: 39336 +.. date: 2020-01-15-01-39-29 +.. nonce: nJ7W9I +.. section: Core and Builtins + +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. + +.. + +.. bpo: 39322 +.. date: 2020-01-13-15-18-13 +.. nonce: aAs-1T +.. section: Core and Builtins + +Added a new function :func:`gc.is_finalized` to check if an object has been +finalized by the garbage collector. Patch by Pablo Galindo. + +.. + +.. bpo: 39048 +.. date: 2020-01-13-14-45-22 +.. nonce: iPsj81 +.. section: Core and Builtins + +Improve the displayed error message when incorrect types are passed to +``async with`` statements by looking up the :meth:`__aenter__` special +method before the :meth:`__aexit__` special method when entering an +asynchronous context manager. Patch by Géry Ogam. + +.. + +.. bpo: 39235 +.. date: 2020-01-09-10-01-18 +.. nonce: RYwjoc +.. section: Core and Builtins + +Fix AST end location for lone generator expression in function call, e.g. +f(i for i in a). + +.. + +.. bpo: 39209 +.. date: 2020-01-06-10-29-16 +.. nonce: QHAONe +.. section: Core and Builtins + +Correctly handle multi-line tokens in interactive mode. Patch by Pablo +Galindo. + +.. + +.. bpo: 1635741 +.. date: 2020-01-05-13-40-08 +.. nonce: QRTJVC +.. section: Core and Builtins + +Port _json extension module to multiphase initialization (:pep:`489`). + +.. + +.. bpo: 39216 +.. date: 2020-01-05-06-55-52 +.. nonce: 74jLh9 +.. section: Core and Builtins + +Fix constant folding optimization for positional only arguments - by Anthony +Sottile. + +.. + +.. bpo: 39215 +.. date: 2020-01-04-17-25-34 +.. nonce: xiqiIz +.. section: Core and Builtins + +Fix ``SystemError`` when nested function has annotation on positional-only +argument - by Anthony Sottile. + +.. + +.. bpo: 39200 +.. date: 2020-01-04-01-14-32 +.. nonce: 8Z9DYp +.. section: Core and Builtins + +Correct the error message when calling the :func:`min` or :func:`max` with +no arguments. Patch by Dong-hee Na. + +.. + +.. bpo: 39200 +.. date: 2020-01-03-14-50-14 +.. nonce: Ip2_iI +.. section: Core and Builtins + +Correct the error message when trying to construct :class:`range` objects +with no arguments. Patch by Pablo Galindo. + +.. + +.. bpo: 39166 +.. date: 2020-01-02-22-22-03 +.. nonce: Qt-UeD +.. section: Core and Builtins + +Fix incorrect line execution reporting in trace functions when tracing the +last iteration of asynchronous for loops. Patch by Pablo Galindo. + +.. + +.. bpo: 39114 +.. date: 2019-12-31-18-25-45 +.. nonce: WG9alt +.. section: Core and Builtins + +Fix incorrent line execution reporting in trace functions when tracing +exception handlers with name binding. Patch by Pablo Galindo. + +.. + +.. bpo: 39156 +.. date: 2019-12-30-10-53-59 +.. nonce: veT-CB +.. section: Core and Builtins + +Split the COMPARE_OP bytecode instruction into four distinct instructions. + +* COMPARE_OP for rich comparisons +* IS_OP for 'is' and 'is not' tests +* CONTAINS_OP for 'in' and 'is not' tests +* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. + +This improves the clarity of the interpreter and should provide a modest +speedup. + +.. + +.. bpo: 38588 +.. date: 2019-12-29-19-13-54 +.. nonce: pgXnNS +.. section: Core and Builtins + +Fix possible crashes in dict and list when calling +:c:func:`PyObject_RichCompareBool`. + +.. + +.. bpo: 13601 +.. date: 2019-12-17-22-32-11 +.. nonce: vNP4LC +.. section: Core and Builtins + +By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is +redirected to a file. You can still make ``sys.stderr`` unbuffered by +passing the :option:`-u` command-line option or setting the +:envvar:`PYTHONUNBUFFERED` environment variable. + +(Contributed by Jendrik Seipp in bpo-13601.) + +.. + +.. bpo: 38610 +.. date: 2019-10-31-14-30-39 +.. nonce: fHdVMS +.. section: Core and Builtins + +Fix possible crashes in several list methods by holding strong references to +list elements when calling :c:func:`PyObject_RichCompareBool`. + +.. + +.. bpo: 32021 +.. date: 2019-03-11-13-30-40 +.. nonce: dpbtkP +.. section: Core and Builtins + +Include brotli .br encoding in mimetypes encodings_map + +.. + +.. bpo: 39430 +.. date: 2020-01-24-11-05-21 +.. nonce: I0UQzM +.. section: Library + +Fixed race condition in lazy imports in :mod:`tarfile`. + +.. + +.. bpo: 39413 +.. date: 2020-01-24-10-10-25 +.. nonce: 7XYDM8 +.. section: Library + +The :func:`os.unsetenv` function is now also available on Windows. + +.. + +.. bpo: 39390 +.. date: 2020-01-23-21-34-29 +.. nonce: D2tSXk +.. section: Library + +Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. +The argument types are now str and List[str] again. + +.. + +.. bpo: 39395 +.. date: 2020-01-23-03-05-41 +.. nonce: 4dda42 +.. section: Library + +The :func:`os.putenv` and :func:`os.unsetenv` functions are now always +available. + +.. + +.. bpo: 39406 +.. date: 2020-01-22-21-18-58 +.. nonce: HMpe8x +.. section: Library + +If ``setenv()`` C function is available, :func:`os.putenv` is now +implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't +have to handle the environment variable memory. + +.. + +.. bpo: 39396 +.. date: 2020-01-21-09-00-42 +.. nonce: 6UXQXE +.. section: Library + +Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. + +.. + +.. bpo: 29435 +.. date: 2020-01-20-18-48-00 +.. nonce: qqJ2Ax +.. section: Library + +Allow :func:`tarfile.is_tarfile` to be used with file and file-like objects, +like :func:`zipfile.is_zipfile`. Patch by William Woodruff. + +.. + +.. bpo: 39377 +.. date: 2020-01-20-13-00-35 +.. nonce: QSFdaU +.. section: Library + +Removed ``encoding`` option from :func:`json.loads`. It has been deprecated +since Python 3.1. + +.. + +.. bpo: 39389 +.. date: 2020-01-20-00-56-01 +.. nonce: fEirIS +.. section: Library + +Write accurate compression level metadata in :mod:`gzip` archives, rather +than always signaling maximum compression. + +.. + +.. bpo: 39366 +.. date: 2020-01-17-18-14-51 +.. nonce: Cv3NQS +.. section: Library + +The previously deprecated ``xpath()`` and ``xgtitle()`` methods of +:class:`nntplib.NNTP` have been removed. + +.. + +.. bpo: 39357 +.. date: 2020-01-16-11-24-00 +.. nonce: bCwx-h +.. section: Library + +Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, +it was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an +open file object, to control how the file is opened. The *compresslevel* +parameter becomes keyword-only. + +.. + +.. bpo: 39353 +.. date: 2020-01-16-10-21-48 +.. nonce: ntp7Ql +.. section: Library + +Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module +and the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, +:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, +:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. + +.. + +.. bpo: 39351 +.. date: 2020-01-16-09-27-28 +.. nonce: a-FQdv +.. section: Library + +Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases +deprecated since Python 3.1: use :func:`base64.encodebytes` and +:func:`base64.decodebytes` instead. + +.. + +.. bpo: 39350 +.. date: 2020-01-16-09-15-40 +.. nonce: ZQx0uY +.. section: Library + +Remove ``fractions.gcd()`` function, deprecated since Python 3.5 +(:issue:`22486`): use :func:`math.gcd` instead. + +.. + +.. bpo: 39329 +.. date: 2020-01-14-22-16-07 +.. nonce: 6OKGBn +.. section: Library + +:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. +Patch by Dong-hee Na. + +.. + +.. bpo: 39313 +.. date: 2020-01-12-18-17-00 +.. nonce: DCTsnm +.. section: Library + +Add a new ``exec_function`` option (*--exec-function* in the CLI) to +``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan +Taskaya. + +.. + +.. bpo: 39259 +.. date: 2020-01-12-17-19-40 +.. nonce: iax06r +.. section: Library + +:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39259 +.. date: 2020-01-12-16-34-28 +.. nonce: J_yBVq +.. section: Library + +:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39310 +.. date: 2020-01-12-13-34-42 +.. nonce: YMRdcj +.. section: Library + +Add :func:`math.ulp`: return the value of the least significant bit of a +float. + +.. + +.. bpo: 39297 +.. date: 2020-01-11-01-15-37 +.. nonce: y98Z6Q +.. section: Library + +Improved performance of importlib.metadata distribution discovery and +resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). + +.. + +.. bpo: 39259 +.. date: 2020-01-11-00-32-45 +.. nonce: _S5VjC +.. section: Library + +:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 38901 +.. date: 2020-01-10-22-30-48 +.. nonce: OdVIIb +.. section: Library + +When you specify prompt='.' or equivalently python -m venv --prompt . ... +the basename of the current directory is used to set the created venv's +prompt when it's activated. + +.. + +.. bpo: 39288 +.. date: 2020-01-10-16-52-09 +.. nonce: IB-aQX +.. section: Library + +Add :func:`math.nextafter`: return the next floating-point value after *x* +towards *y*. + +.. + +.. bpo: 39259 +.. date: 2020-01-09-10-58-58 +.. nonce: RmDgCC +.. section: Library + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a +:class:`ValueError` if the given timeout for their constructor is zero to +prevent the creation of a non-blocking socket. Patch by Dong-hee Na. + +.. + +.. bpo: 39242 +.. date: 2020-01-08-23-25-27 +.. nonce: bnL65N +.. section: Library + +Updated the Gmane domain from news.gmane.org to news.gmane.io which is used +for examples of :class:`~nntplib.NNTP` news reader server and nntplib tests. + +.. + +.. bpo: 35292 +.. date: 2020-01-08-14-39-19 +.. nonce: ihRT1z +.. section: Library + +Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so +the `mimetypes.init` is called lazily to avoid unnecessary costs when +:mod:`http.server` module is imported. + +.. + +.. bpo: 39239 +.. date: 2020-01-07-01-02-44 +.. nonce: r7vecs +.. section: Library + +The :meth:`select.epoll.unregister` method no longer ignores the +:data:`~errno.EBADF` error. + +.. + +.. bpo: 38907 +.. date: 2020-01-06-02-14-38 +.. nonce: F1RkCR +.. section: Library + +In http.server script, restore binding to IPv4 on Windows. + +.. + +.. bpo: 39152 +.. date: 2020-01-03-18-02-50 +.. nonce: JgPjCC +.. section: Library + +Fix ttk.Scale.configure([name]) to return configuration tuple for name or +all options. Giovanni Lombardo contributed part of the patch. + +.. + +.. bpo: 39198 +.. date: 2020-01-02-20-21-03 +.. nonce: nzwGyG +.. section: Library + +If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio +timeouts or stopit) , the `logging` global lock may not be released +appropriately, resulting in deadlock. This change wraps that block of code +with `try...finally` to ensure the lock is released. + +.. + +.. bpo: 39191 +.. date: 2020-01-02-17-28-03 +.. nonce: ur_scy +.. section: Library + +Perform a check for running loop before starting a new task in +``loop.run_until_complete()`` to fail fast; it prevents the side effect of +new task spawning before exception raising. + +.. + +.. bpo: 38871 +.. date: 2020-01-01-18-44-52 +.. nonce: 3EEOLg +.. section: Library + +Correctly parenthesize filter-based statements that contain lambda +expressions in mod:`lib2to3`. Patch by Dong-hee Na. + +.. + +.. bpo: 39142 +.. date: 2019-12-31-19-27-23 +.. nonce: oqU5iD +.. section: Library + +A change was made to logging.config.dictConfig to avoid converting instances +of named tuples to ConvertingTuple. It's assumed that named tuples are too +specialised to be treated like ordinary tuples; if a user of named tuples +requires ConvertingTuple functionality, they will have to implement that +themselves in their named tuple class. + +.. + +.. bpo: 39158 +.. date: 2019-12-29-15-44-38 +.. nonce: cxVoOR +.. section: Library + +ast.literal_eval() now supports empty sets. + +.. + +.. bpo: 39129 +.. date: 2019-12-24-10-43-13 +.. nonce: jVx5rW +.. section: Library + +Fix import path for ``asyncio.TimeoutError`` + +.. + +.. bpo: 39057 +.. date: 2019-12-15-21-47-54 +.. nonce: FOxn-w +.. section: Library + +:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and +no longer ignores a trailing newline. + +.. + +.. bpo: 39056 +.. date: 2019-12-15-21-05-16 +.. nonce: nEfUM9 +.. section: Library + +Fixed handling invalid warning category in the -W option. No longer import +the re module if it is not needed. + +.. + +.. bpo: 39055 +.. date: 2019-12-15-19-23-23 +.. nonce: FmN3un +.. section: Library + +:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error +if the input ends with a single ``\n``. + +.. + +.. bpo: 21600 +.. date: 2019-12-14-14-38-40 +.. nonce: kC4Cgh +.. section: Library + +Fix :func:`mock.patch.stopall` to stop active patches that were created with +:func:`mock.patch.dict`. + +.. + +.. bpo: 39019 +.. date: 2019-12-10-21-11-05 +.. nonce: YIlgZ7 +.. section: Library + +Implement dummy ``__class_getitem__`` for +:class:`tempfile.SpooledTemporaryFile`. + +.. + +.. bpo: 39019 +.. date: 2019-12-10-21-03-34 +.. nonce: i8RpMZ +.. section: Library + +Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, +``subprocess.CompletedProcess`` + +.. + +.. bpo: 38914 +.. date: 2019-11-26-23-21-56 +.. nonce: 8l-g-T +.. section: Library + +Adjusted the wording of the warning issued by distutils' ``check`` command +when the ``author`` and ``maintainer`` fields are supplied but no +corresponding e-mail field (``author_email`` or ``maintainer_email``) is +found. The wording now reflects the fact that these fields are suggested, +but not required. Patch by Juergen Gmach. + +.. + +.. bpo: 38878 +.. date: 2019-11-22-12-08-52 +.. nonce: EJ0cFf +.. section: Library + +Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result +upon inheritence. Patch by Bar Harel. + +.. + +.. bpo: 38615 +.. date: 2019-11-17-17-32-35 +.. nonce: OVyaNX +.. section: Library + +:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an optional +*timeout* parameter for their constructors. Also, the +:meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter +with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and +:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by +Dong-hee Na. + +.. + +.. bpo: 35182 +.. date: 2019-10-31-19-23-25 +.. nonce: hzeNl9 +.. section: Library + +Fixed :func:`Popen.communicate` subsequent call crash when the child process +has already closed any piped standard stream, but still continues to be +running. Patch by Andriy Maletsky. + +.. + +.. bpo: 38630 +.. date: 2019-10-29-12-21-10 +.. nonce: Dv6Xrm +.. section: Library + +On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. +Polling reduces the risk of sending a signal to the wrong process if the +process completed, the :attr:`subprocess.Popen.returncode` attribute is +still ``None``, and the pid has been reassigned (recycled) to a new +different process. + +.. + +.. bpo: 38536 +.. date: 2019-10-21-20-24-51 +.. nonce: beZ0Sk +.. section: Library + +Removes trailing space in formatted currency with `international=True` and a +locale with symbol following value. E.g. `locale.currency(12.34, +international=True)` returned `'12,34 EUR '` instead of `'12,34 EUR'`. + +.. + +.. bpo: 38473 +.. date: 2019-10-14-21-14-55 +.. nonce: uXpVld +.. section: Library + +Use signature from inner mock for autospecced methods attached with +:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. + +.. + +.. bpo: 38361 +.. date: 2019-10-04-09-49-56 +.. nonce: LM4u4T +.. section: Library + +Fixed an issue where ``ident`` could include a leading path separator when +:func:`syslog.openlog` was called without arguments. + +.. + +.. bpo: 38293 +.. date: 2019-09-29-08-17-03 +.. nonce: wls5s3 +.. section: Library + +Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` +objects. + +.. + +.. bpo: 37958 +.. date: 2019-08-27-03-57-25 +.. nonce: lRORI3 +.. section: Library + +Added the pstats.Stats.get_profile_dict() method to return the profile data +as a StatsProfile instance. + +.. + +.. bpo: 28367 +.. date: 2019-05-06-22-38-47 +.. nonce: 2AKen5 +.. section: Library + +Termios magic constants for the following baud rates: - B500000 - +B576000 - B921600 - B1000000 - B1152000 - B1500000 - B2000000 - +B2500000 - B3000000 - B3500000 - B4000000 Patch by Andrey Smirnov + +.. + +.. bpo: 39381 +.. date: 2020-01-18-15-37-56 +.. nonce: wTWe8d +.. section: Documentation + +Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new +event loop only if called from the main thread. + +.. + +.. bpo: 38918 +.. date: 2019-12-15-22-04-41 +.. nonce: 8JnDTS +.. section: Documentation + +Add an entry for ``__module__`` in the "function" & "method" sections of the +`inspect docs types and members table +`_ + +.. + +.. bpo: 3530 +.. date: 2019-11-17-11-53-10 +.. nonce: 8zFUMc +.. section: Documentation + +In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` +example and add advice on when to use the ``fix_missing_locations`` +function. + +.. + +.. bpo: 39395 +.. date: 2020-01-23-03-05-13 +.. nonce: RoArIZ +.. section: Build + +On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` +functions are now required to build Python. + +.. + +.. bpo: 39160 +.. date: 2019-12-30-03-54-24 +.. nonce: aBmj13 +.. section: Build + +Updated the documentation in `./configure --help` to show default values, +reference documentation where required and add additional explanation where +needed. + +.. + +.. bpo: 39144 +.. date: 2019-12-27-22-18-26 +.. nonce: dwHMlR +.. section: Build + +The ctags and etags build targets both include Modules/_ctypes and Python +standard library source files. + +.. + +.. bpo: 39050 +.. date: 2020-01-22-22-28-06 +.. nonce: zkn0FO +.. section: IDLE + +Make IDLE Settings dialog Help button work again. + +.. + +.. bpo: 34118 +.. date: 2019-12-30-16-44-07 +.. nonce: FaNW0a +.. section: IDLE + +Tag memoryview, range, and tuple as classes, the same as list, etcetera, in +the library manual built-in functions list. + +.. + +.. bpo: 32989 +.. date: 2018-03-03-12-56-26 +.. nonce: FVhmhH +.. section: IDLE + +Add tests for editor newline_and_indent_event method. Remove dead code from +pyparse find_good_parse_start method. + +.. + +.. bpo: 39372 +.. date: 2020-01-17-19-25-48 +.. nonce: hGJMY6 +.. section: C API + +Clean 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``. + +.. + +.. bpo: 39164 +.. date: 2019-12-30-10-43-52 +.. nonce: WEV0uu +.. section: C API + +Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception +information of the specified Python thread state. diff --git a/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst b/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst deleted file mode 100644 index 8b90da19622..00000000000 --- a/Misc/NEWS.d/next/Build/2019-12-27-22-18-26.bpo-39144.dwHMlR.rst +++ /dev/null @@ -1 +0,0 @@ -The ctags and etags build targets both include Modules/_ctypes and Python standard library source files. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst b/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst deleted file mode 100644 index 9fb4088de0e..00000000000 --- a/Misc/NEWS.d/next/Build/2019-12-30-03-54-24.bpo-39160.aBmj13.rst +++ /dev/null @@ -1 +0,0 @@ -Updated the documentation in `./configure --help` to show default values, reference documentation where required and add additional explanation where needed. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst b/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst deleted file mode 100644 index aa2146a11d9..00000000000 --- a/Misc/NEWS.d/next/Build/2020-01-23-03-05-13.bpo-39395.RoArIZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -On non-Windows platforms, the :c:func:`setenv` and :c:func:`unsetenv` functions -are now required to build Python. diff --git a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst deleted file mode 100644 index bb72ac70d5b..00000000000 --- a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst +++ /dev/null @@ -1 +0,0 @@ -Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception information of the specified Python thread state. diff --git a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst b/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst deleted file mode 100644 index 8415d756ffa..00000000000 --- a/Misc/NEWS.d/next/C API/2020-01-17-19-25-48.bpo-39372.hGJMY6.rst +++ /dev/null @@ -1,8 +0,0 @@ -Clean 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``. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst deleted file mode 100644 index a07f6d3e85a..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-03-11-13-30-40.bpo-32021.dpbtkP.rst +++ /dev/null @@ -1 +0,0 @@ -Include brotli .br encoding in mimetypes encodings_map \ No newline at end of file diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst deleted file mode 100644 index 0ee63bbb40d..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-10-31-14-30-39.bpo-38610.fHdVMS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes in several list methods by holding strong references to -list elements when calling :c:func:`PyObject_RichCompareBool`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst deleted file mode 100644 index f2c9495a59a..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-17-22-32-11.bpo-13601.vNP4LC.rst +++ /dev/null @@ -1,6 +0,0 @@ -By default, ``sys.stderr`` is line-buffered now, even if ``stderr`` is -redirected to a file. You can still make ``sys.stderr`` unbuffered by -passing the :option:`-u` command-line option or setting the -:envvar:`PYTHONUNBUFFERED` environment variable. - -(Contributed by Jendrik Seipp in bpo-13601.) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst deleted file mode 100644 index 0b81085a89d..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-29-19-13-54.bpo-38588.pgXnNS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes in dict and list when calling -:c:func:`PyObject_RichCompareBool`. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst deleted file mode 100644 index f8d1a1a88a7..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-10-53-59.bpo-39156.veT-CB.rst +++ /dev/null @@ -1,9 +0,0 @@ -Split the COMPARE_OP bytecode instruction into four distinct instructions. - -* COMPARE_OP for rich comparisons -* IS_OP for 'is' and 'is not' tests -* CONTAINS_OP for 'in' and 'is not' tests -* JUMP_IF_NOT_EXC_MATCH for checking exceptions in 'try-except' statements. - -This improves the clarity of the interpreter and should provide a modest -speedup. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst deleted file mode 100644 index d742af9d326..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2019-12-31-18-25-45.bpo-39114.WG9alt.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrent line execution reporting in trace functions when tracing -exception handlers with name binding. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst deleted file mode 100644 index 4737e9c4d2e..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-02-22-22-03.bpo-39166.Qt-UeD.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix incorrect line execution reporting in trace functions when tracing the -last iteration of asynchronous for loops. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst deleted file mode 100644 index e5cb396643f..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-03-14-50-14.bpo-39200.Ip2_iI.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct the error message when trying to construct :class:`range` objects -with no arguments. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst deleted file mode 100644 index 71e40720992..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-01-14-32.bpo-39200.8Z9DYp.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correct the error message when calling the :func:`min` or :func:`max` with -no arguments. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst deleted file mode 100644 index 9a3178f9c62..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ``SystemError`` when nested function has annotation on positional-only -argument - by Anthony Sottile. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst deleted file mode 100644 index 971b0655297..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-06-55-52.bpo-39216.74jLh9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix constant folding optimization for positional only arguments - by Anthony -Sottile. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst deleted file mode 100644 index 9b856c9e1ba..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-40-08.bpo-1635741.QRTJVC.rst +++ /dev/null @@ -1 +0,0 @@ -Port _json extension module to multiphase initialization (:pep:`489`). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst deleted file mode 100644 index c05b3f8dfa4..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-06-10-29-16.bpo-39209.QHAONe.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly handle multi-line tokens in interactive mode. Patch by Pablo -Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst deleted file mode 100644 index 5fb0d45356b..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-09-10-01-18.bpo-39235.RYwjoc.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix AST end location for lone generator expression in function call, e.g. -f(i for i in a). diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst deleted file mode 100644 index 1179ef49651..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-14-45-22.bpo-39048.iPsj81.rst +++ /dev/null @@ -1,4 +0,0 @@ -Improve the displayed error message when incorrect types are passed to ``async -with`` statements by looking up the :meth:`__aenter__` special method before -the :meth:`__aexit__` special method when entering an asynchronous context -manager. Patch by Géry Ogam. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst deleted file mode 100644 index 60df44cc672..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-13-15-18-13.bpo-39322.aAs-1T.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added a new function :func:`gc.is_finalized` to check if an object has been -finalized by the garbage collector. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst deleted file mode 100644 index 55b6bbbcac0..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-01-39-29.bpo-39336.nJ7W9I.rst +++ /dev/null @@ -1 +0,0 @@ -Import loaders which publish immutable module objects can now publish immutable packages in addition to individual modules. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst deleted file mode 100644 index 1e7235b7e6f..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-33-44.bpo-39320.b4hnJW.rst +++ /dev/null @@ -1,15 +0,0 @@ -Replace four complex bytecodes for building sequences with three simpler ones. - - -The following four bytecodes have been removed: - -* BUILD_LIST_UNPACK -* BUILD_TUPLE_UNPACK -* BUILD_SET_UNPACK -* BUILD_TUPLE_UNPACK_WITH_CALL - -The following three bytecodes have been added: - -* LIST_TO_TUPLE -* LIST_EXTEND -* SET_UPDATE diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst deleted file mode 100644 index e5336437754..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-17-00-00-58.bpo-17005.nTSxsy.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add :class:`functools.TopologicalSorter` to the :mod:`functools` module to -offers functionality to perform topological sorting of graphs. Patch by -Pablo Galindo, Tim Peters and Larry Hastings. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst deleted file mode 100644 index f24e1f4e8a1..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-20-21-40-57.bpo-39386.ULqD8t.rst +++ /dev/null @@ -1 +0,0 @@ -Prevent double awaiting of async iterator. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst deleted file mode 100644 index bae008150ee..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-15-53-37.bpo-39421.O3nG7u.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix possible crashes when operating with the functions in the :mod:`heapq` -module and custom comparison operators. diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst deleted file mode 100644 index a3915a4d81c..00000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2020-01-22-22-28-04.bpo-39427.LiO-Eo.rst +++ /dev/null @@ -1,2 +0,0 @@ -Document all possibilities for the ``-X`` options in the command line help -section. Patch by Pablo Galindo. diff --git a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst b/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst deleted file mode 100644 index 65f1a6d156a..00000000000 --- a/Misc/NEWS.d/next/Documentation/2019-11-17-11-53-10.bpo-3530.8zFUMc.rst +++ /dev/null @@ -1,2 +0,0 @@ -In the :mod:`ast` module documentation, fix a misleading ``NodeTransformer`` example and add -advice on when to use the ``fix_missing_locations`` function. diff --git a/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst b/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst deleted file mode 100644 index 5747936dd64..00000000000 --- a/Misc/NEWS.d/next/Documentation/2019-12-15-22-04-41.bpo-38918.8JnDTS.rst +++ /dev/null @@ -1,3 +0,0 @@ -Add an entry for ``__module__`` in the "function" & "method" sections of the -`inspect docs types and members table -`_ diff --git a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst b/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst deleted file mode 100644 index 37b66ad9dfd..00000000000 --- a/Misc/NEWS.d/next/Documentation/2020-01-18-15-37-56.bpo-39381.wTWe8d.rst +++ /dev/null @@ -1,2 +0,0 @@ -Mention in docs that :func:`asyncio.get_event_loop` implicitly creates new -event loop only if called from the main thread. diff --git a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst b/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst deleted file mode 100644 index 38f0fb6e104..00000000000 --- a/Misc/NEWS.d/next/IDLE/2018-03-03-12-56-26.bpo-32989.FVhmhH.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add tests for editor newline_and_indent_event method. -Remove dead code from pyparse find_good_parse_start method. diff --git a/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst b/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst deleted file mode 100644 index ce95eb5482f..00000000000 --- a/Misc/NEWS.d/next/IDLE/2019-12-30-16-44-07.bpo-34118.FaNW0a.rst +++ /dev/null @@ -1,2 +0,0 @@ -Tag memoryview, range, and tuple as classes, the same as list, etcetera, in -the library manual built-in functions list. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst b/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst deleted file mode 100644 index e71265cdf10..00000000000 --- a/Misc/NEWS.d/next/IDLE/2020-01-22-22-28-06.bpo-39050.zkn0FO.rst +++ /dev/null @@ -1 +0,0 @@ -Make IDLE Settings dialog Help button work again. diff --git a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst b/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst deleted file mode 100644 index 115f458bfbf..00000000000 --- a/Misc/NEWS.d/next/Library/2019-05-06-22-38-47.bpo-28367.2AKen5.rst +++ /dev/null @@ -1,13 +0,0 @@ -Termios magic constants for the following baud rates: - - B500000 - - B576000 - - B921600 - - B1000000 - - B1152000 - - B1500000 - - B2000000 - - B2500000 - - B3000000 - - B3500000 - - B4000000 -Patch by Andrey Smirnov \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst b/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst deleted file mode 100644 index d0b4d6adca4..00000000000 --- a/Misc/NEWS.d/next/Library/2019-08-27-03-57-25.bpo-37958.lRORI3.rst +++ /dev/null @@ -1,2 +0,0 @@ -Added the pstats.Stats.get_profile_dict() method to return the profile -data as a StatsProfile instance. diff --git a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst b/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst deleted file mode 100644 index 0b19551970e..00000000000 --- a/Misc/NEWS.d/next/Library/2019-09-29-08-17-03.bpo-38293.wls5s3.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`copy.copy` and :func:`copy.deepcopy` support to :func:`property` objects. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst b/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst deleted file mode 100644 index 65186db60b4..00000000000 --- a/Misc/NEWS.d/next/Library/2019-10-04-09-49-56.bpo-38361.LM4u4T.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed an issue where ``ident`` could include a leading path separator when :func:`syslog.openlog` was called without arguments. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst b/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst deleted file mode 100644 index de80e89e00e..00000000000 --- a/Misc/NEWS.d/next/Library/2019-10-14-21-14-55.bpo-38473.uXpVld.rst +++ /dev/null @@ -1,2 +0,0 @@ -Use signature from inner mock for autospecced methods attached with -:func:`unittest.mock.attach_mock`. Patch by Karthikeyan Singaravelan. diff --git a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst b/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst deleted file mode 100644 index 147d181cc7e..00000000000 --- a/Misc/NEWS.d/next/Library/2019-10-21-20-24-51.bpo-38536.beZ0Sk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removes trailing space in formatted currency with `international=True` and a locale with symbol following value. -E.g. `locale.currency(12.34, international=True)` returned `'12,34 EUR '` instead of `'12,34 EUR'`. diff --git a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst b/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst deleted file mode 100644 index 1a4d59205ab..00000000000 --- a/Misc/NEWS.d/next/Library/2019-10-29-12-21-10.bpo-38630.Dv6Xrm.rst +++ /dev/null @@ -1,5 +0,0 @@ -On Unix, :meth:`subprocess.Popen.send_signal` now polls the process status. -Polling reduces the risk of sending a signal to the wrong process if the -process completed, the :attr:`subprocess.Popen.returncode` attribute is still -``None``, and the pid has been reassigned (recycled) to a new different -process. diff --git a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst b/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst deleted file mode 100644 index 9438cd8f9fd..00000000000 --- a/Misc/NEWS.d/next/Library/2019-10-31-19-23-25.bpo-35182.hzeNl9.rst +++ /dev/null @@ -1,3 +0,0 @@ -Fixed :func:`Popen.communicate` subsequent call crash when the child process -has already closed any piped standard stream, but still continues to be -running. Patch by Andriy Maletsky. diff --git a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst b/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst deleted file mode 100644 index 04f51da0db7..00000000000 --- a/Misc/NEWS.d/next/Library/2019-11-17-17-32-35.bpo-38615.OVyaNX.rst +++ /dev/null @@ -1,5 +0,0 @@ -:class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now have an -optional *timeout* parameter for their constructors. -Also, the :meth:`~imaplib.IMAP4.open` method now has an optional *timeout* parameter -with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and -:class:`~imaplib.IMAP4_stream` were applied to this change. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst b/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst deleted file mode 100644 index 9cbdf08dd53..00000000000 --- a/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result -upon inheritence. Patch by Bar Harel. diff --git a/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst b/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst deleted file mode 100644 index 2dfc1ea149b..00000000000 --- a/Misc/NEWS.d/next/Library/2019-11-26-23-21-56.bpo-38914.8l-g-T.rst +++ /dev/null @@ -1,5 +0,0 @@ -Adjusted the wording of the warning issued by distutils' ``check`` command when -the ``author`` and ``maintainer`` fields are supplied but no corresponding -e-mail field (``author_email`` or ``maintainer_email``) is found. The wording -now reflects the fact that these fields are suggested, but not required. Patch -by Juergen Gmach. diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst b/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst deleted file mode 100644 index b64a56edc50..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-10-21-03-34.bpo-39019.i8RpMZ.rst +++ /dev/null @@ -1,2 +0,0 @@ -Implement dummy ``__class_getitem__`` for ``subprocess.Popen``, -``subprocess.CompletedProcess`` diff --git a/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst b/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst deleted file mode 100644 index 7bdf291950f..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-10-21-11-05.bpo-39019.YIlgZ7.rst +++ /dev/null @@ -1 +0,0 @@ -Implement dummy ``__class_getitem__`` for :class:`tempfile.SpooledTemporaryFile`. diff --git a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst b/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst deleted file mode 100644 index 0f726393106..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-14-14-38-40.bpo-21600.kC4Cgh.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix :func:`mock.patch.stopall` to stop active patches that were created with -:func:`mock.patch.dict`. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst b/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst deleted file mode 100644 index 83b1431e92f..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-19-23-23.bpo-39055.FmN3un.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`base64.b64decode` with ``validate=True`` raises now a binascii.Error -if the input ends with a single ``\n``. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst deleted file mode 100644 index d5d2b98e9b0..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-21-05-16.bpo-39056.nEfUM9.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed handling invalid warning category in the -W option. No longer import -the re module if it is not needed. diff --git a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst b/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst deleted file mode 100644 index 24a17444b97..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-15-21-47-54.bpo-39057.FOxn-w.rst +++ /dev/null @@ -1,2 +0,0 @@ -:func:`urllib.request.proxy_bypass_environment` now ignores leading dots and -no longer ignores a trailing newline. diff --git a/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst b/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst deleted file mode 100644 index 6667697671a..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-24-10-43-13.bpo-39129.jVx5rW.rst +++ /dev/null @@ -1 +0,0 @@ -Fix import path for ``asyncio.TimeoutError`` diff --git a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst b/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst deleted file mode 100644 index c41799bebae..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-29-15-44-38.bpo-39158.cxVoOR.rst +++ /dev/null @@ -1 +0,0 @@ -ast.literal_eval() now supports empty sets. diff --git a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst b/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst deleted file mode 100644 index 508d1338d7c..00000000000 --- a/Misc/NEWS.d/next/Library/2019-12-31-19-27-23.bpo-39142.oqU5iD.rst +++ /dev/null @@ -1,5 +0,0 @@ -A change was made to logging.config.dictConfig to avoid converting instances -of named tuples to ConvertingTuple. It's assumed that named tuples are too -specialised to be treated like ordinary tuples; if a user of named tuples -requires ConvertingTuple functionality, they will have to implement that -themselves in their named tuple class. diff --git a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst b/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst deleted file mode 100644 index fe970fd9e3f..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-01-18-44-52.bpo-38871.3EEOLg.rst +++ /dev/null @@ -1,2 +0,0 @@ -Correctly parenthesize filter-based statements that contain lambda -expressions in mod:`lib2to3`. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst b/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst deleted file mode 100644 index 138c93c2e48..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-02-17-28-03.bpo-39191.ur_scy.rst +++ /dev/null @@ -1,3 +0,0 @@ -Perform a check for running loop before starting a new task in -``loop.run_until_complete()`` to fail fast; it prevents the side effect of -new task spawning before exception raising. diff --git a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst b/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst deleted file mode 100644 index ec4e81e2bbe..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-02-20-21-03.bpo-39198.nzwGyG.rst +++ /dev/null @@ -1 +0,0 @@ -If an exception were to be thrown in `Logger.isEnabledFor` (say, by asyncio timeouts or stopit) , the `logging` global lock may not be released appropriately, resulting in deadlock. This change wraps that block of code with `try...finally` to ensure the lock is released. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst b/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst deleted file mode 100644 index abb3df0da0f..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-03-18-02-50.bpo-39152.JgPjCC.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix ttk.Scale.configure([name]) to return configuration tuple for name -or all options. Giovanni Lombardo contributed part of the patch. diff --git a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst b/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst deleted file mode 100644 index a6e79f78095..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-06-02-14-38.bpo-38907.F1RkCR.rst +++ /dev/null @@ -1 +0,0 @@ -In http.server script, restore binding to IPv4 on Windows. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst b/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst deleted file mode 100644 index 2a1c9290869..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-07-01-02-44.bpo-39239.r7vecs.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :meth:`select.epoll.unregister` method no longer ignores the -:data:`~errno.EBADF` error. diff --git a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst deleted file mode 100644 index ae52f970d0b..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst +++ /dev/null @@ -1 +0,0 @@ -Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid unnecessary costs when :mod:`http.server` module is imported. \ No newline at end of file diff --git a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst b/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst deleted file mode 100644 index a87dddf81dc..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-08-23-25-27.bpo-39242.bnL65N.rst +++ /dev/null @@ -1,3 +0,0 @@ -Updated the Gmane domain from news.gmane.org to news.gmane.io -which is used for examples of :class:`~nntplib.NNTP` news reader server and -nntplib tests. diff --git a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst deleted file mode 100644 index c7ef8be7e3a..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst b/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst deleted file mode 100644 index 0e0ec99c344..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-10-16-52-09.bpo-39288.IB-aQX.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add :func:`math.nextafter`: return the next floating-point value after *x* -towards *y*. diff --git a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst b/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst deleted file mode 100644 index 304d53289e0..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-10-22-30-48.bpo-38901.OdVIIb.rst +++ /dev/null @@ -1,3 +0,0 @@ -When you specify prompt='.' or equivalently python -m venv --prompt . ... -the basename of the current directory is used to set the created venv's -prompt when it's activated. diff --git a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst b/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst deleted file mode 100644 index a454572c80d..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-11-00-32-45.bpo-39259._S5VjC.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~nntplib.NNTP` and :class:`~nntplib.NNTP_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst b/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst deleted file mode 100644 index 618f6f9f2b7..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-11-01-15-37.bpo-39297.y98Z6Q.rst +++ /dev/null @@ -1 +0,0 @@ -Improved performance of importlib.metadata distribution discovery and resilients to inaccessible sys.path entries (importlib_metadata v1.4.0). diff --git a/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst b/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst deleted file mode 100644 index a787f696087..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-13-34-42.bpo-39310.YMRdcj.rst +++ /dev/null @@ -1 +0,0 @@ -Add :func:`math.ulp`: return the value of the least significant bit of a float. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst b/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst deleted file mode 100644 index 6cc490eb35e..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-16-34-28.bpo-39259.J_yBVq.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~smtplib.SMTP` and :class:`~smtplib.SMTP_SSL` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst b/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst deleted file mode 100644 index bfcaff3c3d0..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-17-19-40.bpo-39259.iax06r.rst +++ /dev/null @@ -1,3 +0,0 @@ -:class:`~ftplib.FTP_TLS` and :class:`~ftplib.FTP_TLS` now raise a -:class:`ValueError` if the given timeout for their constructor is zero to -prevent the creation of a non-blocking socket. Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst b/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst deleted file mode 100644 index 784d73c7b3f..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-12-18-17-00.bpo-39313.DCTsnm.rst +++ /dev/null @@ -1,2 +0,0 @@ -Add a new ``exec_function`` option (*--exec-function* in the CLI) to -``RefactoringTool`` for making ``exec`` a function. Patch by Batuhan Taskaya. diff --git a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst b/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst deleted file mode 100644 index 1e3da4618b4..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-14-22-16-07.bpo-39329.6OKGBn.rst +++ /dev/null @@ -1,2 +0,0 @@ -:class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. -Patch by Dong-hee Na. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst deleted file mode 100644 index 264e52fdc51..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-09-15-40.bpo-39350.ZQx0uY.rst +++ /dev/null @@ -1,2 +0,0 @@ -Remove ``fractions.gcd()`` function, deprecated since Python 3.5 -(:issue:`22486`): use :func:`math.gcd` instead. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst b/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst deleted file mode 100644 index b89bec97bfa..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-09-27-28.bpo-39351.a-FQdv.rst +++ /dev/null @@ -1,3 +0,0 @@ -Remove ``base64.encodestring()`` and ``base64.decodestring()``, aliases -deprecated since Python 3.1: use :func:`base64.encodebytes` and -:func:`base64.decodebytes` instead. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst b/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst deleted file mode 100644 index c0d4583ca7f..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-10-21-48.bpo-39353.ntp7Ql.rst +++ /dev/null @@ -1,4 +0,0 @@ -Deprecate binhex4 and hexbin4 standards. Deprecate the :mod:`binhex` module and -the following :mod:`binascii` functions: :func:`~binascii.b2a_hqx`, -:func:`~binascii.a2b_hqx`, :func:`~binascii.rlecode_hqx`, -:func:`~binascii.rledecode_hqx`, :func:`~binascii.crc_hqx`. diff --git a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst b/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst deleted file mode 100644 index a90802c91a2..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-16-11-24-00.bpo-39357.bCwx-h.rst +++ /dev/null @@ -1,4 +0,0 @@ -Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, it -was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an open -file object, to control how the file is opened. The *compresslevel* parameter -becomes keyword-only. diff --git a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst b/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst deleted file mode 100644 index 00d98a7f183..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-17-18-14-51.bpo-39366.Cv3NQS.rst +++ /dev/null @@ -1,2 +0,0 @@ -The previously deprecated ``xpath()`` and ``xgtitle()`` methods of -:class:`nntplib.NNTP` have been removed. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst b/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst deleted file mode 100644 index d4c80506f7d..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-00-56-01.bpo-39389.fEirIS.rst +++ /dev/null @@ -1,2 +0,0 @@ -Write accurate compression level metadata in :mod:`gzip` archives, rather -than always signaling maximum compression. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst b/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst deleted file mode 100644 index 8493ac88e4b..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-13-00-35.bpo-39377.QSFdaU.rst +++ /dev/null @@ -1,2 +0,0 @@ -Removed ``encoding`` option from :func:`json.loads`. It has been deprecated -since Python 3.1. diff --git a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst b/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst deleted file mode 100644 index eabc94242c8..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-20-18-48-00.bpo-29435.qqJ2Ax.rst +++ /dev/null @@ -1,2 +0,0 @@ -Allow :func:`tarfile.is_tarfile` to be used with file and file-like -objects, like :func:`zipfile.is_zipfile`. Patch by William Woodruff. diff --git a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst b/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst deleted file mode 100644 index af7076854a5..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-21-09-00-42.bpo-39396.6UXQXE.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``math.nextafter(-0.0, +0.0)`` on AIX 7.1. diff --git a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst b/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst deleted file mode 100644 index 56a53160432..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-22-21-18-58.bpo-39406.HMpe8x.rst +++ /dev/null @@ -1,3 +0,0 @@ -If ``setenv()`` C function is available, :func:`os.putenv` is now -implemented with ``setenv()`` instead of ``putenv()``, so Python doesn't -have to handle the environment variable memory. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst b/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst deleted file mode 100644 index cf713709dcf..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-23-03-05-41.bpo-39395.4dda42.rst +++ /dev/null @@ -1,2 +0,0 @@ -The :func:`os.putenv` and :func:`os.unsetenv` functions are now always -available. diff --git a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst b/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst deleted file mode 100644 index ffa961ea4cd..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-23-21-34-29.bpo-39390.D2tSXk.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fixed a regression with the `ignore` callback of :func:`shutil.copytree`. -The argument types are now str and List[str] again. diff --git a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst deleted file mode 100644 index a185ab5efe2..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-24-10-10-25.bpo-39413.7XYDM8.rst +++ /dev/null @@ -1 +0,0 @@ -The :func:`os.unsetenv` function is now also available on Windows. diff --git a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst b/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst deleted file mode 100644 index 712fc5d34bb..00000000000 --- a/Misc/NEWS.d/next/Library/2020-01-24-11-05-21.bpo-39430.I0UQzM.rst +++ /dev/null @@ -1 +0,0 @@ -Fixed race condition in lazy imports in :mod:`tarfile`. diff --git a/README.rst b/README.rst index e8fd598a61e..5971d4aefcb 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -This is Python version 3.9.0 alpha 2 +This is Python version 3.9.0 alpha 3 ==================================== .. image:: https://travis-ci.org/python/cpython.svg?branch=master From d0d9fa8c5e30aff71b6d5e8b2673396622f33270 Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Sat, 25 Jan 2020 04:00:54 -0500 Subject: [PATCH 202/380] bpo-39388: IDLE: Fix bug when cancelling out of configdialog (GH-18068) Co-authored-by: Terry Jan Reedy --- Lib/idlelib/NEWS.txt | 4 +++- Lib/idlelib/configdialog.py | 1 + Lib/idlelib/idle_test/test_configdialog.py | 21 ++++++++++++------- .../2020-01-25-02-26-45.bpo-39388.x4TQNh.rst | 1 + 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 708292ebee9..eda7c278876 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,7 +3,9 @@ Released on 2020-10-05? ====================================== -bpo-39050: Make Settings dialog Help button work again. +bpo-39388: Settings dialog Cancel button cancels pending changes. + +bpo-39050: Settings dialog Help button again displays help text. bpo-32989: Add tests for editor newline_and_indent_event method. Remove unneeded arguments and dead code from pyparse diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 0e007b516ea..2f95c9ccaa0 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -191,6 +191,7 @@ class ConfigDialog(Toplevel): Methods: destroy: inherited """ + changes.clear() self.destroy() def destroy(self): diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 7c575d0e599..817a35217bf 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -47,17 +47,24 @@ def tearDownModule(): root.destroy() root = dialog = None -class ConfigDialogTest(unittest.TestCase): - def test_help(self): +class DialogTest(unittest.TestCase): + + @mock.patch(__name__+'.dialog.destroy', new_callable=Func) + def test_cancel(self, destroy): + changes['main']['something'] = 1 + dialog.cancel() + self.assertEqual(changes['main'], {}) + self.assertEqual(destroy.called, 1) + + @mock.patch('idlelib.configdialog.view_text', new_callable=Func) + def test_help(self, view): dialog.note.select(dialog.keyspage) - saved = configdialog.view_text - view = configdialog.view_text = Func() dialog.help() s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click')) - self.assertTrue(s.endswith('a different name.\n')) - configdialog.view_text = saved + self.assertTrue(s.startswith('When you click') and + s.endswith('a different name.\n')) + class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. diff --git a/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst new file mode 100644 index 00000000000..42bbfb168c1 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-25-02-26-45.bpo-39388.x4TQNh.rst @@ -0,0 +1 @@ +IDLE Settings Cancel button now cancels pending changes From 62865f4532094017a9b780b704686ca9734bc329 Mon Sep 17 00:00:00 2001 From: Matthew Kokotovich Date: Sat, 25 Jan 2020 04:17:47 -0600 Subject: [PATCH 203/380] bpo-39082: Allow AsyncMock to correctly patch static/class methods (GH-18116) --- Lib/unittest/mock.py | 2 ++ Lib/unittest/test/testmock/testasync.py | 23 +++++++++++++++++++ .../2020-01-24-13-24-35.bpo-39082.qKgrq_.rst | 1 + 3 files changed, 26 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 92b596f672c..047ae7c2559 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -46,6 +46,8 @@ _safe_super = super def _is_async_obj(obj): if _is_instance_mock(obj) and not isinstance(obj, AsyncMock): return False + if hasattr(obj, '__func__'): + obj = getattr(obj, '__func__') return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 73d31a29668..43b87498ef3 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -19,6 +19,15 @@ class AsyncClass: def normal_method(self): pass + @classmethod + async def async_class_method(cls): + pass + + @staticmethod + async def async_static_method(): + pass + + class AwaitableClass: def __await__(self): yield @@ -71,6 +80,20 @@ class AsyncPatchDecoratorTest(unittest.TestCase): test_async() + def test_is_AsyncMock_patch_staticmethod(self): + @patch.object(AsyncClass, 'async_static_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + + def test_is_AsyncMock_patch_classmethod(self): + @patch.object(AsyncClass, 'async_class_method') + def test_async(mock_method): + self.assertIsInstance(mock_method, AsyncMock) + + test_async() + def test_async_def_patch(self): @patch(f"{__name__}.async_func", return_value=1) @patch(f"{__name__}.async_func_args", return_value=2) diff --git a/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst new file mode 100644 index 00000000000..52c4ee1b33b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-24-13-24-35.bpo-39082.qKgrq_.rst @@ -0,0 +1 @@ +Allow AsyncMock to correctly patch static/class methods From 40c080934b3d49311209b1cb690c2ea1e04df7e7 Mon Sep 17 00:00:00 2001 From: Paulo Henrique Silva Date: Sat, 25 Jan 2020 07:53:54 -0300 Subject: [PATCH 204/380] bpo-37955: correct mock.patch docs with respect to the returned type (GH-15521) --- Doc/library/unittest.mock.rst | 3 ++- Lib/unittest/mock.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 8394304cfdd..515bdd060a1 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1401,7 +1401,8 @@ patch "as"; very useful if :func:`patch` is creating a mock object for you. :func:`patch` takes arbitrary keyword arguments. These will be passed to - the :class:`Mock` (or *new_callable*) on construction. + :class:`AsyncMock` if the patched object is asynchronous, to + :class:`MagicMock` otherwise or to *new_callable* if specified. ``patch.dict(...)``, ``patch.multiple(...)`` and ``patch.object(...)`` are available for alternate use-cases. diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 047ae7c2559..a97542a2ddf 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1730,7 +1730,8 @@ def patch( "as"; very useful if `patch` is creating a mock object for you. `patch` takes arbitrary keyword arguments. These will be passed to - the `Mock` (or `new_callable`) on construction. + `AsyncMock` if the patched object is asynchronous, to `MagicMock` + otherwise or to `new_callable` if specified. `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are available for alternate use-cases. From d23b08f8d006b94fefcaa664c3c8e600c5055b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Sat, 25 Jan 2020 14:52:44 +0100 Subject: [PATCH 205/380] Post 3.9.0a3 --- Include/patchlevel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h index d0720f7d8c6..a62e175d966 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.9.0a3" +#define PY_VERSION "3.9.0a3+" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. From 9bfb4a7061a3bc4fc5632bccfdf9ed61f62679f7 Mon Sep 17 00:00:00 2001 From: fireattack Date: Sat, 25 Jan 2020 09:08:13 -0600 Subject: [PATCH 206/380] Update 3.8.rst (GH-18173) Fixed the name of the contributor (@selik). --- Doc/whatsnew/3.8.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 0927a965dd3..fabc1c597ec 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -725,7 +725,7 @@ csv The :class:`csv.DictReader` now returns instances of :class:`dict` instead of a :class:`collections.OrderedDict`. The tool is now faster and uses less memory while still preserving the field order. -(Contributed by Michael Seek in :issue:`34003`.) +(Contributed by Michael Selik in :issue:`34003`.) curses From aef7dc89879d099dc704bd8037b8a7686fb72838 Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Sat, 25 Jan 2020 16:44:46 +0100 Subject: [PATCH 207/380] bpo-38932: Mock fully resets child objects on reset_mock(). (GH-17409) --- Lib/unittest/mock.py | 2 +- Lib/unittest/test/testmock/testmock.py | 14 +++++++++++++- .../2020-01-25-13-41-27.bpo-38932.1pu_8I.rst | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a97542a2ddf..beed717522b 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -592,7 +592,7 @@ class NonCallableMock(Base): for child in self._mock_children.values(): if isinstance(child, _SpecState) or child is _deleted: continue - child.reset_mock(visited) + child.reset_mock(visited, return_value=return_value, side_effect=side_effect) ret = self._mock_return_value if _is_instance_mock(ret) and ret is not self: diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1030d12323d..1329346ae72 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1636,11 +1636,23 @@ class MockTest(unittest.TestCase): self.assertNotEqual(m.side_effect, None) def test_reset_sideeffect(self): - m = Mock(return_value=10, side_effect=[2,3]) + m = Mock(return_value=10, side_effect=[2, 3]) m.reset_mock(side_effect=True) self.assertEqual(m.return_value, 10) self.assertEqual(m.side_effect, None) + def test_reset_return_with_children(self): + m = MagicMock(f=MagicMock(return_value=1)) + self.assertEqual(m.f(), 1) + m.reset_mock(return_value=True) + self.assertNotEqual(m.f(), 1) + + def test_reset_return_with_children_side_effect(self): + m = MagicMock(f=MagicMock(side_effect=[2, 3])) + self.assertNotEqual(m.f.side_effect, None) + m.reset_mock(side_effect=True) + self.assertEqual(m.f.side_effect, None) + def test_mock_add_spec(self): class _One(object): one = 1 diff --git a/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst b/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst new file mode 100644 index 00000000000..d9ce8e816bc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-25-13-41-27.bpo-38932.1pu_8I.rst @@ -0,0 +1 @@ +Mock fully resets child objects on reset_mock(). Patch by Vegard Stikbakke From 7de617455ed788e6730c40cf854c4b72b0432194 Mon Sep 17 00:00:00 2001 From: alclarks <57201106+alclarks@users.noreply.github.com> Date: Sat, 25 Jan 2020 18:49:58 +0000 Subject: [PATCH 208/380] bpo-15243: Document __prepare__ as classmethod (GH-17124) --- Doc/reference/datamodel.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 1442fbeb33d..9520f824287 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1945,7 +1945,8 @@ Preparing the class namespace Once the appropriate metaclass has been identified, then the class namespace is prepared. If the metaclass has a ``__prepare__`` attribute, it is called as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the -additional keyword arguments, if any, come from the class definition). +additional keyword arguments, if any, come from the class definition). The +``__prepare__`` method should be implemented as a :func:`classmethod`. If the metaclass has no ``__prepare__`` attribute, then the class namespace is initialised as an empty ordered mapping. From 4b09dc79f4d08d85f2cc945563e9c8ef1e531d7b Mon Sep 17 00:00:00 2001 From: Windson yang Date: Sun, 26 Jan 2020 03:23:00 +0800 Subject: [PATCH 209/380] bpo-36654: Add examples for using tokenize module programmically (#12947) --- Doc/library/tokenize.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst index b208ba46d17..96778f23f8f 100644 --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -278,3 +278,22 @@ The exact token type names can be displayed using the :option:`-e` option: 4,10-4,11: RPAR ')' 4,11-4,12: NEWLINE '\n' 5,0-5,0: ENDMARKER '' + +Example of tokenizing a file programmatically, reading unicode +strings instead of bytes with :func:`generate_tokens`:: + + import tokenize + + with tokenize.open('hello.py') as f: + tokens = tokenize.generate_tokens(f.readline) + for token in tokens: + print(token) + +Or reading bytes directly with :func:`.tokenize`:: + + import tokenize + + with open('hello.py', 'rb') as f: + tokens = tokenize.tokenize(f.readline) + for token in tokens: + print(token) From 8271441d8b6e1f8eae1457c437da24e775801d9f Mon Sep 17 00:00:00 2001 From: Juhana Jauhiainen Date: Sun, 26 Jan 2020 00:18:58 +0200 Subject: [PATCH 210/380] bpo-39374: Updated sorting documentation (GH-18177) --- Doc/howto/sorting.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index 1d6d5c45b4d..a8efe65353d 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -43,16 +43,18 @@ Key Functions ============= Both :meth:`list.sort` and :func:`sorted` have a *key* parameter to specify a -function to be called on each list element prior to making comparisons. +function (or other callable) to be called on each list element prior to making +comparisons. For example, here's a case-insensitive string comparison: >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] -The value of the *key* parameter should be a function that takes a single argument -and returns a key to use for sorting purposes. This technique is fast because -the key function is called exactly once for each input record. +The value of the *key* parameter should be a function (or other callable) that +takes a single argument and returns a key to use for sorting purposes. This +technique is fast because the key function is called exactly once for each +input record. A common pattern is to sort complex objects using some of the object's indices as keys. For example: From 4515a590a4a4c09231a66e81782f33b4bfcd5054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=A0=E5=92=8C?= Date: Sun, 26 Jan 2020 10:07:40 +0800 Subject: [PATCH 211/380] Fix linecache.py add lazycache to __all__ and use dict.clear to clear the cache (GH-4641) --- Lib/linecache.py | 36 +++++++++---------- .../2017-12-04-10-14-23.bpo-32173.e0C5dF.rst | 3 ++ 2 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst diff --git a/Lib/linecache.py b/Lib/linecache.py index 3afcce1f0a1..ddd0abf2cf0 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -10,17 +10,8 @@ import sys import os import tokenize -__all__ = ["getline", "clearcache", "checkcache"] +__all__ = ["getline", "clearcache", "checkcache", "lazycache"] -def getline(filename, lineno, module_globals=None): - lines = getlines(filename, module_globals) - if 1 <= lineno <= len(lines): - return lines[lineno-1] - else: - return '' - - -# The cache # The cache. Maps filenames to either a thunk which will provide source code, # or a tuple (size, mtime, lines, fullname) once loaded. @@ -29,9 +20,17 @@ cache = {} def clearcache(): """Clear the cache entirely.""" + cache.clear() - global cache - cache = {} + +def getline(filename, lineno, module_globals=None): + """Get a line for a Python source file from the cache. + Update the cache if it doesn't contain an entry for this file already.""" + + lines = getlines(filename, module_globals) + if 1 <= lineno <= len(lines): + return lines[lineno - 1] + return '' def getlines(filename, module_globals=None): @@ -56,11 +55,10 @@ def checkcache(filename=None): if filename is None: filenames = list(cache.keys()) + elif filename in cache: + filenames = [filename] else: - if filename in cache: - filenames = [filename] - else: - return + return for filename in filenames: entry = cache[filename] @@ -109,8 +107,10 @@ def updatecache(filename, module_globals=None): # for this module. return [] cache[filename] = ( - len(data), None, - [line+'\n' for line in data.splitlines()], fullname + len(data), + None, + [line + '\n' for line in data.splitlines()], + fullname ) return cache[filename][2] diff --git a/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst b/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst new file mode 100644 index 00000000000..fc8f36fb021 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-04-10-14-23.bpo-32173.e0C5dF.rst @@ -0,0 +1,3 @@ +* Add `lazycache` function to `__all__`. +* Use `dict.clear` to clear the cache. +* Refactoring `getline` function and `checkcache` function. From 10355ed7f132ed10f1e0d8bd64ccb744b86b1cce Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 25 Jan 2020 20:21:17 -0800 Subject: [PATCH 212/380] bpo-36018: Add another example for NormalDist() (#18191) --- Doc/library/statistics.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 4c7239c1895..09b02cabf21 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -772,6 +772,42 @@ Carlo simulation `_: >>> quantiles(map(model, X, Y, Z)) # doctest: +SKIP [1.4591308524824727, 1.8035946855390597, 2.175091447274739] +Normal distributions can be used to approximate `Binomial +distributions `_ +when the sample size is large and when the probability of a successful +trial is near 50%. + +For example, an open source conference has 750 attendees and two rooms with a +500 person capacity. There is a talk about Python and another about Ruby. +In previous conferences, 65% of the attendees preferred to listen to Python +talks. Assuming the population preferences haven't changed, what is the +probability that the rooms will stay within their capacity limits? + +.. doctest:: + + >>> n = 750 # Sample size + >>> p = 0.65 # Preference for Python + >>> q = 1.0 - p # Preference for Ruby + >>> k = 500 # Room capacity + + >>> # Approximation using the cumulative normal distribution + >>> from math import sqrt + >>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4) + 0.8402 + + >>> # Solution using the cumulative binomial distribution + >>> from math import comb, fsum + >>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4) + 0.8402 + + >>> # Approximation using a simulation + >>> from random import seed, choices + >>> seed(8675309) + >>> def trial(): + ... return choices(('Python', 'Ruby'), (p, q), k=n).count('Python') + >>> mean(trial() <= k for i in range(10_000)) + 0.8398 + Normal distributions commonly arise in machine learning problems. Wikipedia has a `nice example of a Naive Bayesian Classifier From 72b1004657e60c900e4cd031b2635b587f4b280e Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Mon, 27 Jan 2020 12:18:15 +0530 Subject: [PATCH 213/380] bpo-25597: Ensure wraps' return value is used for magic methods in MagicMock (#16029) --- Lib/unittest/mock.py | 6 +++ Lib/unittest/test/testmock/testmock.py | 47 +++++++++++++++++++ .../2019-09-12-12-11-05.bpo-25597.mPMzVx.rst | 3 ++ 3 files changed, 56 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index beed717522b..1acafc51df1 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2033,6 +2033,12 @@ _side_effect_methods = { def _set_return_value(mock, method, name): + # If _mock_wraps is present then attach it so that wrapped object + # is used for return value is used when called. + if mock._mock_wraps is not None: + method._mock_wraps = getattr(mock._mock_wraps, name) + return + fixed = _return_values.get(name, DEFAULT) if fixed is not DEFAULT: method.return_value = fixed diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 1329346ae72..677346725bd 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -715,6 +715,53 @@ class MockTest(unittest.TestCase): self.assertRaises(StopIteration, mock.method) + def test_magic_method_wraps_dict(self): + data = {'foo': 'bar'} + + wrapped_dict = MagicMock(wraps=data) + self.assertEqual(wrapped_dict.get('foo'), 'bar') + self.assertEqual(wrapped_dict['foo'], 'bar') + self.assertTrue('foo' in wrapped_dict) + + # return_value is non-sentinel and takes precedence over wrapped value. + wrapped_dict.get.return_value = 'return_value' + self.assertEqual(wrapped_dict.get('foo'), 'return_value') + + # return_value is sentinel and hence wrapped value is returned. + wrapped_dict.get.return_value = sentinel.DEFAULT + self.assertEqual(wrapped_dict.get('foo'), 'bar') + + self.assertEqual(wrapped_dict.get('baz'), None) + with self.assertRaises(KeyError): + wrapped_dict['baz'] + self.assertFalse('bar' in wrapped_dict) + + data['baz'] = 'spam' + self.assertEqual(wrapped_dict.get('baz'), 'spam') + self.assertEqual(wrapped_dict['baz'], 'spam') + self.assertTrue('baz' in wrapped_dict) + + del data['baz'] + self.assertEqual(wrapped_dict.get('baz'), None) + + + def test_magic_method_wraps_class(self): + + class Foo: + + def __getitem__(self, index): + return index + + def __custom_method__(self): + return "foo" + + + klass = MagicMock(wraps=Foo) + obj = klass() + self.assertEqual(obj.__getitem__(2), 2) + self.assertEqual(obj.__custom_method__(), "foo") + + def test_exceptional_side_effect(self): mock = Mock(side_effect=AttributeError) self.assertRaises(AttributeError, mock) diff --git a/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst b/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst new file mode 100644 index 00000000000..5ad8c6d90fa --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-12-12-11-05.bpo-25597.mPMzVx.rst @@ -0,0 +1,3 @@ +Ensure, if ``wraps`` is supplied to :class:`unittest.mock.MagicMock`, it is used +to calculate return values for the magic methods instead of using the default +return values. Patch by Karthikeyan Singaravelan. From 8a4cd700a7426341c2074a2b580306d2d60ec839 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Mon, 27 Jan 2020 09:57:45 +0000 Subject: [PATCH 214/380] bpo-39320: Handle unpacking of **values in compiler (GH-18141) * Add DICT_UPDATE and DICT_MERGE bytecodes. Use them for ** unpacking. * Remove BUILD_MAP_UNPACK and BUILD_MAP_UNPACK_WITH_CALL, as they are now unused. * Update magic number for ** unpacking opcodes. * Update dis.rst to incorporate new bytecodes. * Add blurb entry. --- Doc/library/dis.rst | 21 +- Include/opcode.h | 4 +- Lib/importlib/_bootstrap_external.py | 3 +- Lib/opcode.py | 5 +- .../2020-01-15-15-50-22.bpo-39320.oWARyk.rst | 4 + Python/ceval.c | 55 +- Python/compile.c | 90 +- Python/importlib.h | 2854 +++++------ Python/importlib_external.h | 4308 +++++++++-------- Python/opcode_targets.h | 8 +- 10 files changed, 3680 insertions(+), 3672 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d5d30a03aea..61233d98a0d 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -873,32 +873,25 @@ All of the following opcodes use their arguments. .. versionadded:: 3.9 -.. opcode:: SET_UPDATE +.. opcode:: SET_UPDATE (i) Calls ``set.update(TOS1[-i], TOS)``. Used to build sets. .. versionadded:: 3.9 -.. opcode:: BUILD_MAP_UNPACK (count) +.. opcode:: DICT_UPDATE (i) - Pops *count* mappings from the stack, merges them into a single dictionary, - and pushes the result. Implements dictionary unpacking in dictionary - displays ``{**x, **y, **z}``. + Calls ``dict.update(TOS1[-i], TOS)``. Used to build dicts. - .. versionadded:: 3.5 + .. versionadded:: 3.9 -.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (count) +.. opcode:: DICT_MERGE - This is similar to :opcode:`BUILD_MAP_UNPACK`, - but is used for ``f(**x, **y, **z)`` call syntax. The stack item at - position ``count + 2`` should be the corresponding callable ``f``. + Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys. - .. versionadded:: 3.5 - .. versionchanged:: 3.6 - The position of the callable is determined by adding 2 to the opcode - argument instead of encoding it in the second byte of the argument. + .. versionadded:: 3.9 .. opcode:: LOAD_ATTR (namei) diff --git a/Include/opcode.h b/Include/opcode.h index 1c5cd335f36..19944fac0b9 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -117,8 +117,6 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 -#define BUILD_MAP_UNPACK 150 -#define BUILD_MAP_UNPACK_WITH_CALL 151 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 @@ -127,6 +125,8 @@ extern "C" { #define CALL_METHOD 161 #define LIST_EXTEND 162 #define SET_UPDATE 163 +#define DICT_MERGE 164 +#define DICT_UPDATE 165 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 6c703fa3f75..2434cf06fd4 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -276,6 +276,7 @@ _code_type = type(_write_atomic.__code__) # Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) # 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) # # MAGIC must change whenever the bytecode emitted by the compiler may no @@ -285,7 +286,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3424).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3425).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 5bc2ddc3571..ac1aa535f66 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -200,9 +200,6 @@ hasfree.append(148) def_op('EXTENDED_ARG', 144) EXTENDED_ARG = 144 -def_op('BUILD_MAP_UNPACK', 150) -def_op('BUILD_MAP_UNPACK_WITH_CALL', 151) - jrel_op('SETUP_ASYNC_WITH', 154) def_op('FORMAT_VALUE', 155) @@ -214,5 +211,7 @@ def_op('CALL_METHOD', 161) def_op('LIST_EXTEND', 162) def_op('SET_UPDATE', 163) +def_op('DICT_MERGE', 164) +def_op('DICT_UPDATE', 165) del def_op, name_op, jrel_op, jabs_op diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst new file mode 100644 index 00000000000..9508574f6c0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-15-15-50-22.bpo-39320.oWARyk.rst @@ -0,0 +1,4 @@ + +Replace two complex bytecodes for building dicts with two simpler ones. +The new bytecodes ``DICT_MERGE`` and ``DICT_UPDATE`` have been added +The old bytecodes ``BUILD_MAP_UNPACK`` and ``BUILD_MAP_UNPACK_WITH_CALL`` have been removed. diff --git a/Python/ceval.c b/Python/ceval.c index 528ad7fdd1e..673b401e6ab 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2801,49 +2801,32 @@ main_loop: DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) - goto error; - - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (PyDict_Update(sum, arg) < 0) { - if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - _PyErr_Format(tstate, PyExc_TypeError, - "'%.200s' object is not a mapping", - arg->ob_type->tp_name); - } - Py_DECREF(sum); - goto error; + case TARGET(DICT_UPDATE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); + if (PyDict_Update(dict, update) < 0) { + if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { + _PyErr_Format(tstate, PyExc_TypeError, + "'%.200s' object is not a mapping", + update->ob_type->tp_name); } + Py_DECREF(update); + goto error; } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); DISPATCH(); } - case TARGET(BUILD_MAP_UNPACK_WITH_CALL): { - Py_ssize_t i; - PyObject *sum = PyDict_New(); - if (sum == NULL) + case TARGET(DICT_MERGE): { + PyObject *update = POP(); + PyObject *dict = PEEK(oparg); + + if (_PyDict_MergeEx(dict, update, 2) < 0) { + format_kwargs_error(tstate, PEEK(2 + oparg), update); + Py_DECREF(update); goto error; - - for (i = oparg; i > 0; i--) { - PyObject *arg = PEEK(i); - if (_PyDict_MergeEx(sum, arg, 2) < 0) { - Py_DECREF(sum); - format_kwargs_error(tstate, PEEK(2 + oparg), arg); - goto error; - } } - - while (oparg--) - Py_DECREF(POP()); - PUSH(sum); + Py_DECREF(update); PREDICT(CALL_FUNCTION_EX); DISPATCH(); } diff --git a/Python/compile.c b/Python/compile.c index 9ed29f4a1f9..6776df54d47 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1007,9 +1007,6 @@ stack_effect(int opcode, int oparg, int jump) case BUILD_SET: case BUILD_STRING: return 1-oparg; - case BUILD_MAP_UNPACK: - case BUILD_MAP_UNPACK_WITH_CALL: - return 1 - oparg; case BUILD_MAP: return 1 - 2*oparg; case BUILD_CONST_KEY_MAP: @@ -1125,6 +1122,8 @@ stack_effect(int opcode, int oparg, int jump) return 0; case LIST_EXTEND: case SET_UPDATE: + case DICT_MERGE: + case DICT_UPDATE: return -1; default: return PY_INVALID_STACK_EFFECT; @@ -3868,37 +3867,58 @@ static int compiler_dict(struct compiler *c, expr_ty e) { Py_ssize_t i, n, elements; - int containers; + int have_dict; int is_unpacking = 0; n = asdl_seq_LEN(e->v.Dict.values); - containers = 0; + have_dict = 0; elements = 0; for (i = 0; i < n; i++) { is_unpacking = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i) == NULL; - if (elements == 0xFFFF || (elements && is_unpacking)) { - if (!compiler_subdict(c, e, i - elements, i)) - return 0; - containers++; - elements = 0; - } if (is_unpacking) { + if (elements) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + if (have_dict == 0) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); - containers++; + ADDOP_I(c, DICT_UPDATE, 1); } else { - elements++; + if (elements == 0xFFFF) { + if (!compiler_subdict(c, e, i - elements, i)) { + return 0; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; + elements = 0; + } + else { + elements++; + } } } - if (elements || containers == 0) { - if (!compiler_subdict(c, e, n - elements, n)) + if (elements) { + if (!compiler_subdict(c, e, n - elements, n)) { return 0; - containers++; + } + if (have_dict) { + ADDOP_I(c, DICT_UPDATE, 1); + } + have_dict = 1; } - /* If there is more than one dict, they need to be merged into a new - * dict. If there is one dict and it's an unpacking, then it needs - * to be copied into a new dict." */ - if (containers > 1 || is_unpacking) { - ADDOP_I(c, BUILD_MAP_UNPACK, containers); + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); } return 1; } @@ -4263,8 +4283,8 @@ ex_call: } /* Then keyword arguments */ if (nkwelts) { - /* the number of dictionaries on the stack */ - Py_ssize_t nsubkwargs = 0; + /* Has a new dict been pushed */ + int have_dict = 0; nseen = 0; /* the number of keyword arguments on the stack following */ for (i = 0; i < nkwelts; i++) { @@ -4272,13 +4292,18 @@ ex_call: if (kw->arg == NULL) { /* A keyword argument unpacking. */ if (nseen) { - if (!compiler_subkwargs(c, keywords, i - nseen, i)) + if (!compiler_subkwargs(c, keywords, i - nseen, i)) { return 0; - nsubkwargs++; + } + have_dict = 1; nseen = 0; } + if (!have_dict) { + ADDOP_I(c, BUILD_MAP, 0); + have_dict = 1; + } VISIT(c, expr, kw->value); - nsubkwargs++; + ADDOP_I(c, DICT_MERGE, 1); } else { nseen++; @@ -4286,14 +4311,15 @@ ex_call: } if (nseen) { /* Pack up any trailing keyword arguments. */ - if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) + if (!compiler_subkwargs(c, keywords, nkwelts - nseen, nkwelts)) { return 0; - nsubkwargs++; - } - if (nsubkwargs > 1) { - /* Pack it all up */ - ADDOP_I(c, BUILD_MAP_UNPACK_WITH_CALL, nsubkwargs); + } + if (have_dict) { + ADDOP_I(c, DICT_MERGE, 1); + } + have_dict = 1; } + assert(have_dict); } ADDOP_I(c, CALL_FUNCTION_EX, nkwelts > 0); return 1; diff --git a/Python/importlib.h b/Python/importlib.h index 3a84e9bb1d8..7f999704f31 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -368,680 +368,824 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 99,107,95,117,110,108,111,99,107,95,109,111,100,117,108,101, 194,0,0,0,115,12,0,0,0,0,6,8,1,2,1,12, 1,12,3,6,2,114,64,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,79, - 0,0,0,115,10,0,0,0,124,0,124,1,124,2,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,54,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,211,0,0,0,115,2,0,0,0,0, - 8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115,116,100,101,114,114,41, - 3,218,7,109,101,115,115,97,103,101,114,67,0,0,0,114, - 54,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,222,0,0,0,115,8,0,0,0,0,2, - 12,1,10,1,8,1,114,75,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,44,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,232, - 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,82,0,0,0,114,83,0,0,0,114,10,0,0,0, - 114,81,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,230,0,0, - 0,115,6,0,0,0,0,2,12,5,10,1,114,85,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,56,0,0,0,218,9,105,115, - 95,102,114,111,122,101,110,114,78,0,0,0,114,44,0,0, - 0,114,79,0,0,0,114,81,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,243, - 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,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,84,0,0,0,41,2,114,82,0, - 0,0,114,88,0,0,0,114,10,0,0,0,114,81,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,241,0,0,0,115,6,0,0, - 0,0,2,12,5,10,1,114,89,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,62,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,100,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,80,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,253,0,0,0,115,12,0, - 0,0,0,6,10,1,10,1,10,1,10,1,10,2,114,96, - 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,218,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,56,4,0,116,5,121,200,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,89,0,110,14,48,0,100,6,160,9,124, - 3,124,4,161,2,83,0,100,0,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,98,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,44,0,0,0,41,5,114,95,0,0, - 0,218,6,108,111,97,100,101,114,114,94,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,13,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,22, - 2,114,110,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,108,0, - 0,0,114,112,0,0,0,114,113,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,108,0,0, - 0,114,112,0,0,0,114,113,0,0,0,114,114,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 31,0,0,0,86,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,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,44,0,0,0,114,17, - 0,0,0,114,108,0,0,0,114,112,0,0,0,218,6,97, - 112,112,101,110,100,114,115,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,54,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,47,0,0,0, - 98,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,106,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,100,0,83,0,114,13,0,0,0,41, - 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, - 114,112,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,105,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,108,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,117,0,0,0,114,112,0,0,0,114,116, - 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,46,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, - 0,0,0,120,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,117,0,0,0,41, - 2,114,30,0,0,0,114,121,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,121,0,0,0,129, - 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,36,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,100,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,115,0,0,0, - 114,17,0,0,0,218,10,114,112,97,114,116,105,116,105,111, - 110,114,46,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,133,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,116,0,0,0,114, - 46,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,122,0,0,0,141,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,116,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,122,0,0,0,145,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,47,0,0,0,114,124,0,0,0,218,8,112,114, - 111,112,101,114,116,121,114,121,0,0,0,218,6,115,101,116, - 116,101,114,114,129,0,0,0,114,122,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,111,0,0,0,49,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, - 111,0,0,0,169,2,114,112,0,0,0,114,114,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,152,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,136, - 116,0,124,1,100,5,131,2,114,132,122,14,124,1,160,4, - 124,0,161,1,125,3,87,0,113,136,4,0,116,5,121,128, - 1,0,1,0,1,0,100,2,125,3,89,0,113,136,48,0, - 110,4,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,108,0,0,0,41,2,114,108,0,0,0,114,115,0,0, - 0,114,114,0,0,0,70,114,134,0,0,0,41,7,114,4, - 0,0,0,114,125,0,0,0,114,126,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,114,0,0,0,114,78,0,0,0, - 114,111,0,0,0,41,6,114,17,0,0,0,114,108,0,0, - 0,114,112,0,0,0,114,114,0,0,0,114,135,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,90,0,0,0,150,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,12,3,4,2,114,90,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,42,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,176,124,5,100,0, - 117,0,114,172,122,10,124,1,106,5,125,2,87,0,113,176, - 4,0,116,1,121,168,1,0,1,0,1,0,100,0,125,2, - 89,0,113,176,48,0,110,4,124,5,125,2,122,10,124,0, - 106,6,125,6,87,0,110,22,4,0,116,1,121,208,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,246,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,20,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,112,0,0,0, - 70,84,41,13,114,104,0,0,0,114,105,0,0,0,114,1, - 0,0,0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0,114,121,0,0, - 0,114,115,0,0,0,41,8,114,95,0,0,0,114,108,0, - 0,0,114,112,0,0,0,114,94,0,0,0,114,17,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,121,0,0,0, - 114,115,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,176,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,12,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,141,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,97,0,0,0,218,11,95,95,112,97,99,107,97, - 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, - 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, - 1,0,0,0,114,105,0,0,0,114,108,0,0,0,114,115, - 0,0,0,114,125,0,0,0,114,126,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, - 107,0,0,0,114,97,0,0,0,114,129,0,0,0,114,144, - 0,0,0,114,104,0,0,0,114,140,0,0,0,114,122,0, - 0,0,114,112,0,0,0,114,121,0,0,0,114,138,0,0, - 0,41,5,114,94,0,0,0,114,95,0,0,0,114,143,0, - 0,0,114,108,0,0,0,114,145,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,221, - 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,147,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,108,0,0,0,114,148,0,0,0,114,78, - 0,0,0,114,18,0,0,0,114,17,0,0,0,114,147,0, - 0,0,169,2,114,94,0,0,0,114,95,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,37, - 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,151,0,0,0,99, + 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,54,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,211,0,0,0,115,2, + 0,0,0,0,8,114,66,0,0,0,114,37,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,44,0,0,0,218,6,115,116,100, + 101,114,114,41,3,218,7,109,101,115,115,97,103,101,114,67, + 0,0,0,114,54,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,222,0,0,0,115,8,0, + 0,0,0,2,12,1,10,1,8,1,114,75,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,106,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,66,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,110,36,124, - 0,106,4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0,114,101,0,0, - 0,114,102,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,112,0,0,0,114,108,0,0,0,114,44,0,0,0, - 114,122,0,0,0,41,2,114,94,0,0,0,114,17,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,44,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,232,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,82,0,0,0,114,83,0,0,0,114, + 10,0,0,0,114,81,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,230,0,0,0,115,6,0,0,0,0,2,12,5,10,1, + 114,85,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,56,0,0,0, + 218,9,105,115,95,102,114,111,122,101,110,114,78,0,0,0, + 114,44,0,0,0,114,79,0,0,0,114,81,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,243,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,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,84,0,0,0,41, + 2,114,82,0,0,0,114,88,0,0,0,114,10,0,0,0, + 114,81,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,241,0,0,0, + 115,6,0,0,0,0,2,12,5,10,1,114,89,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,62,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,100,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,80,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,253,0,0, + 0,115,12,0,0,0,0,6,10,1,10,1,10,1,10,1, + 10,2,114,96,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,218,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,56,4,0,116,5,121,200,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,89,0,110,14,48,0,100, + 6,160,9,124,3,124,4,161,2,83,0,100,0,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,98,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,44,0,0,0,41,5, + 114,95,0,0,0,218,6,108,111,97,100,101,114,114,94,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,13,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,22,2,114,110,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,108,0,0,0,114,112,0,0,0,114,113,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,108,0,0,0,114,112,0,0,0,114,113,0,0,0,114, + 114,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,31,0,0,0,86,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,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,44,0, + 0,0,114,17,0,0,0,114,108,0,0,0,114,112,0,0, + 0,218,6,97,112,112,101,110,100,114,115,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,54,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 47,0,0,0,98,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, + 106,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,100,0,83,0,114,13, + 0,0,0,41,8,114,115,0,0,0,114,17,0,0,0,114, + 108,0,0,0,114,112,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, + 105,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,108, + 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,117,0,0,0,114,112,0, + 0,0,114,116,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,46, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,121,0,0,0,120,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,117, + 0,0,0,41,2,114,30,0,0,0,114,121,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,121, + 0,0,0,129,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,36,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,100,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, + 115,0,0,0,114,17,0,0,0,218,10,114,112,97,114,116, + 105,116,105,111,110,114,46,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,133,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,116, + 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,122,0,0,0,141,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,116,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,122,0,0,0, + 145,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,47,0,0,0,114,124,0,0,0, + 218,8,112,114,111,112,101,114,116,121,114,121,0,0,0,218, + 6,115,101,116,116,101,114,114,129,0,0,0,114,122,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,111,0,0,0,49,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,111,0,0,0,169,2,114,112,0,0,0,114, + 114,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,152,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,136,116,0,124,1,100,5,131,2,114,132,122,14, + 124,1,160,4,124,0,161,1,125,3,87,0,113,136,4,0, + 116,5,121,128,1,0,1,0,1,0,100,2,125,3,89,0, + 113,136,48,0,110,4,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,108,0,0,0,41,2,114,108,0,0,0, + 114,115,0,0,0,114,114,0,0,0,70,114,134,0,0,0, + 41,7,114,4,0,0,0,114,125,0,0,0,114,126,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,114,0,0,0,114, + 78,0,0,0,114,111,0,0,0,41,6,114,17,0,0,0, + 114,108,0,0,0,114,112,0,0,0,114,114,0,0,0,114, + 135,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,90,0,0,0, + 150,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,12,3,4,2,114,90,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,42,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,176, + 124,5,100,0,117,0,114,172,122,10,124,1,106,5,125,2, + 87,0,113,176,4,0,116,1,121,168,1,0,1,0,1,0, + 100,0,125,2,89,0,113,176,48,0,110,4,124,5,125,2, + 122,10,124,0,106,6,125,6,87,0,110,22,4,0,116,1, + 121,208,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,246,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,20, + 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, + 112,0,0,0,70,84,41,13,114,104,0,0,0,114,105,0, + 0,0,114,1,0,0,0,114,97,0,0,0,114,107,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,111,0,0,0,114,116,0,0,0, + 114,121,0,0,0,114,115,0,0,0,41,8,114,95,0,0, + 0,114,108,0,0,0,114,112,0,0,0,114,94,0,0,0, + 114,17,0,0,0,90,8,108,111,99,97,116,105,111,110,114, + 121,0,0,0,114,115,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,176,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, + 12,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,141,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,97,0,0,0,218,11,95,95,112, + 97,99,107,97,103,101,95,95,114,140,0,0,0,114,107,0, + 0,0,114,138,0,0,0,41,21,114,6,0,0,0,114,17, + 0,0,0,114,1,0,0,0,114,105,0,0,0,114,108,0, + 0,0,114,115,0,0,0,114,125,0,0,0,114,126,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,107,0,0,0,114,97,0,0,0,114,129,0, + 0,0,114,144,0,0,0,114,104,0,0,0,114,140,0,0, + 0,114,122,0,0,0,114,112,0,0,0,114,121,0,0,0, + 114,138,0,0,0,41,5,114,94,0,0,0,114,95,0,0, + 0,114,143,0,0,0,114,108,0,0,0,114,145,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,221,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,147,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,108,0,0,0,114,148,0, + 0,0,114,78,0,0,0,114,18,0,0,0,114,17,0,0, + 0,114,147,0,0,0,169,2,114,94,0,0,0,114,95,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,37,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,151, + 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,106,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,66,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,110,36,124,0,106,4,114,86,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,100,1,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,99,0,0,0,114,100,0,0,0, + 114,101,0,0,0,114,102,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,112,0,0,0,114,108,0,0,0,114, + 44,0,0,0,114,122,0,0,0,41,2,114,94,0,0,0, + 114,17,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,106,0,0,0,54,2,0,0,115,16,0, + 0,0,0,3,20,1,10,1,10,1,10,2,16,2,6,1, + 14,2,114,106,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, + 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,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,142,0,0,0,114,149,0,0,0,41,14,114,17,0,0, + 0,114,49,0,0,0,114,15,0,0,0,114,91,0,0,0, + 114,34,0,0,0,114,44,0,0,0,114,78,0,0,0,114, + 108,0,0,0,114,115,0,0,0,114,147,0,0,0,114,4, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 114,149,0,0,0,218,3,112,111,112,41,4,114,94,0,0, + 0,114,95,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, + 92,0,0,0,71,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,92,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, + 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,97,0, + 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, + 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, + 0,0,114,154,0,0,0,114,17,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,155,0,0,0,114,6,0,0,0, + 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, + 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, + 0,0,0,114,150,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,101,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, + 1,22,1,12,1,6,1,18,1,2,1,10,1,14,1,6, + 1,114,157,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, + 224,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,166,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,48,1,0,1,0,1,0,122,14,116,5,106,6, + 124,0,106,7,61,0,87,0,110,18,4,0,116,11,121,150, + 1,0,1,0,1,0,89,0,110,2,48,0,130,0,89,0, + 110,2,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,149,0,0,0,84,114,153,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,108, + 0,0,0,114,4,0,0,0,114,157,0,0,0,114,151,0, + 0,0,90,13,95,105,110,105,116,105,97,108,105,122,105,110, + 103,114,15,0,0,0,114,91,0,0,0,114,17,0,0,0, + 114,115,0,0,0,114,78,0,0,0,114,149,0,0,0,114, + 62,0,0,0,114,155,0,0,0,114,75,0,0,0,114,150, + 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,138,2,0,0,115,48,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,1,8, + 5,14,1,12,1,18,2,8,0,8,2,114,158,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,49,0,0,0,114, + 17,0,0,0,114,158,0,0,0,41,1,114,94,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 93,0,0,0,180,2,0,0,115,4,0,0,0,0,9,12, + 1,114,93,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,159,0,0,0,114,137,0,0,0,41,1,114, + 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,98,0,0,0,206,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,46,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,100,0,83,0,169,2,78, + 114,136,0,0,0,41,4,114,56,0,0,0,90,10,105,115, + 95,98,117,105,108,116,105,110,114,90,0,0,0,114,137,0, + 0,0,169,4,218,3,99,108,115,114,80,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,215,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,166,0,0,0,114,108,0,0,0, + 41,4,114,163,0,0,0,114,80,0,0,0,114,164,0,0, + 0,114,94,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,224,2,0,0,115,4,0,0,0,0,9,12,1,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,76,0,0,0,114,16,0,0,0,41,8, + 114,17,0,0,0,114,15,0,0,0,114,77,0,0,0,114, + 78,0,0,0,114,44,0,0,0,114,66,0,0,0,114,56, + 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,94,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, + 0,0,0,236,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,66,0,0,0,114,56,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, + 95,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,114,149,0,0,0,244,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,163,0,0,0,114,80,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, - 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, - 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,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,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,142,0,0, - 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, - 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, - 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, - 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, - 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,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,92,0,0,0, - 71,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, - 92,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,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,97,0,0,0,114,144, - 0,0,0,114,140,0,0,0,114,127,0,0,0,114,22,0, - 0,0,114,104,0,0,0,41,14,114,108,0,0,0,114,154, - 0,0,0,114,17,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,155,0,0,0,114,6,0,0,0,114,97,0,0, - 0,114,105,0,0,0,114,1,0,0,0,114,144,0,0,0, - 114,4,0,0,0,114,128,0,0,0,114,104,0,0,0,114, - 150,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,101,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,1,22,1,12, - 1,6,1,18,1,2,1,10,1,14,1,6,1,114,157,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,224,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,166,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,48, - 1,0,1,0,1,0,122,14,116,5,106,6,124,0,106,7, - 61,0,87,0,110,18,4,0,116,11,121,150,1,0,1,0, - 1,0,89,0,110,2,48,0,130,0,89,0,110,2,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,149,0,0,0,84,114,153,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,108,0,0,0,114, - 4,0,0,0,114,157,0,0,0,114,151,0,0,0,90,13, - 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, - 0,0,114,91,0,0,0,114,17,0,0,0,114,115,0,0, - 0,114,78,0,0,0,114,149,0,0,0,114,62,0,0,0, - 114,155,0,0,0,114,75,0,0,0,114,150,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,138,2, - 0,0,115,48,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,1,8,5,14,1,12, - 1,18,2,8,0,8,2,114,158,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,49,0,0,0,114,17,0,0,0, - 114,158,0,0,0,41,1,114,94,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,93,0,0,0, - 180,2,0,0,115,4,0,0,0,0,9,12,1,114,93,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, + 218,8,103,101,116,95,99,111,100,101,249,2,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,168,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,255,2,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,168,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,114, + 0,0,0,5,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,137,0,0,0,218,12,115,116, + 97,116,105,99,109,101,116,104,111,100,114,98,0,0,0,218, + 11,99,108,97,115,115,109,101,116,104,111,100,114,166,0,0, + 0,114,167,0,0,0,114,148,0,0,0,114,149,0,0,0, + 114,85,0,0,0,114,169,0,0,0,114,170,0,0,0,114, + 114,0,0,0,114,96,0,0,0,114,154,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,159,0,0,0,195,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,159,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, @@ -1049,761 +1193,617 @@ 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,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, - 159,0,0,0,114,137,0,0,0,41,1,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 98,0,0,0,206,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,46,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,100,0,83,0,169,2,78,114,136,0,0, - 0,41,4,114,56,0,0,0,90,10,105,115,95,98,117,105, - 108,116,105,110,114,90,0,0,0,114,137,0,0,0,169,4, - 218,3,99,108,115,114,80,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,215,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,166,0,0,0,114,108,0,0,0,41,4,114,163, - 0,0,0,114,80,0,0,0,114,164,0,0,0,114,94,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,224,2, - 0,0,115,4,0,0,0,0,9,12,1,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,76,0,0,0,114,16,0,0,0,41,8,114,17,0,0, - 0,114,15,0,0,0,114,77,0,0,0,114,78,0,0,0, - 114,44,0,0,0,114,66,0,0,0,114,56,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,94,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,148,0,0,0,236, - 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, + 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,160,0,0,0,114,152, + 0,0,0,41,4,114,44,0,0,0,114,1,0,0,0,114, + 173,0,0,0,114,137,0,0,0,41,1,218,1,109,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,98,0, + 0,0,25,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,34,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,100,0,83,0,114,161,0,0,0,41, + 4,114,56,0,0,0,114,87,0,0,0,114,90,0,0,0, + 114,137,0,0,0,114,162,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,166,0,0,0,34,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,56,0,0,0, + 114,87,0,0,0,41,3,114,163,0,0,0,114,80,0,0, + 0,114,164,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,167,0,0,0,41,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,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,66,0,0, - 0,114,56,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,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, - 149,0,0,0,244,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,163,0,0,0,114,80,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,249,2,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, - 168,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,255, - 2,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,168,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,114,0,0,0,5, - 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,137,0,0,0,218,12,115,116,97,116,105,99, - 109,101,116,104,111,100,114,98,0,0,0,218,11,99,108,97, - 115,115,109,101,116,104,111,100,114,166,0,0,0,114,167,0, - 0,0,114,148,0,0,0,114,149,0,0,0,114,85,0,0, - 0,114,169,0,0,0,114,170,0,0,0,114,114,0,0,0, - 114,96,0,0,0,114,154,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,159, - 0,0,0,195,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,159,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,160,0,0,0,114,152,0,0,0,41, - 4,114,44,0,0,0,114,1,0,0,0,114,173,0,0,0, - 114,137,0,0,0,41,1,218,1,109,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,98,0,0,0,25,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, - 34,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,100,0,83,0,114,161,0,0,0,41,4,114,56,0, - 0,0,114,87,0,0,0,114,90,0,0,0,114,137,0,0, - 0,114,162,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,166,0,0,0,34,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,56,0,0,0,114,87,0,0, - 0,41,3,114,163,0,0,0,114,80,0,0,0,114,164,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,167,0,0,0,41,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,163,0,0,0,114,94,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,148, - 0,0,0,50,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,86,0,0,0,41, - 10,114,104,0,0,0,114,17,0,0,0,114,56,0,0,0, - 114,87,0,0,0,114,78,0,0,0,114,44,0,0,0,114, - 66,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,95,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,149,0,0,0,54,3,0,0,115,14,0,0, - 0,0,2,8,1,10,1,10,1,2,255,6,2,12,1,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,96,0,0,0,114,168,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,154,0,0,0,63,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,56,0,0,0,114,175,0, - 0,0,114,168,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,114,169,0,0,0,72,3,0,0,115, - 2,0,0,0,0,4,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,168,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,170,0,0,0,78,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,56,0,0, - 0,90,17,105,115,95,102,114,111,122,101,110,95,112,97,99, - 107,97,103,101,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,114,0,0,0,84,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,137,0,0,0,114,171,0,0,0,114,98,0,0,0,114, - 172,0,0,0,114,166,0,0,0,114,167,0,0,0,114,148, - 0,0,0,114,149,0,0,0,114,154,0,0,0,114,89,0, - 0,0,114,169,0,0,0,114,170,0,0,0,114,114,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,173,0,0,0,14,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,173,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,56,0,0,0,114,57, - 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,53,0,0,0,97,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,56,0,0,0,114,59,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,55,0,0,0,101,3,0,0,115, - 2,0,0,0,0,2,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,53,0,0,0,114, - 55,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,178,0,0,0,93,3,0, - 0,115,6,0,0,0,8,2,4,2,8,4,114,178,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,127,0,0,0,114,37,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,78, - 0,0,0,114,44,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,106,3,0,0,115,10,0, - 0,0,0,2,16,1,12,1,8,1,8,1,114,187,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,167,0,0,0,114,90,0, - 0,0,41,4,218,6,102,105,110,100,101,114,114,17,0,0, - 0,114,164,0,0,0,114,108,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,115,3,0, - 0,115,8,0,0,0,0,3,12,1,8,1,4,1,114,189, - 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,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,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,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,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,113,52,124,7,2,0,1,0,83,0,113,52,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,78,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,91,0,0,0,114,178,0,0,0,114,166,0,0,0, - 114,105,0,0,0,114,189,0,0,0,114,104,0,0,0,41, - 10,114,17,0,0,0,114,164,0,0,0,114,165,0,0,0, - 114,190,0,0,0,90,9,105,115,95,114,101,108,111,97,100, - 114,188,0,0,0,114,166,0,0,0,114,94,0,0,0,114, - 95,0,0,0,114,104,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,124,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,10, - 2,10,2,114,194,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,44,0,0,0,114,14,0,0, - 0,218,10,86,97,108,117,101,69,114,114,111,114,114,78,0, - 0,0,169,3,114,17,0,0,0,114,185,0,0,0,114,186, + 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,163,0,0,0,114,94, 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,171,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,200,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,127,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,128,0,0,0,114,15,0,0,0,114,91, - 0,0,0,114,66,0,0,0,114,140,0,0,0,114,105,0, - 0,0,218,8,95,69,82,82,95,77,83,71,114,44,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,194,0,0,0,114,158,0,0,0, - 114,5,0,0,0,114,191,0,0,0,114,192,0,0,0,114, - 193,0,0,0,41,9,114,17,0,0,0,218,7,105,109,112, - 111,114,116,95,114,164,0,0,0,114,129,0,0,0,90,13, - 112,97,114,101,110,116,95,109,111,100,117,108,101,114,156,0, - 0,0,114,94,0,0,0,114,95,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,190,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,205,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,49,0,0,0,114, - 15,0,0,0,114,91,0,0,0,114,34,0,0,0,218,14, - 95,78,69,69,68,83,95,76,79,65,68,73,78,71,114,205, - 0,0,0,114,44,0,0,0,114,203,0,0,0,114,64,0, - 0,0,41,4,114,17,0,0,0,114,204,0,0,0,114,95, - 0,0,0,114,74,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,225,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,207,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,200,0,0,0,114,187,0, - 0,0,114,207,0,0,0,218,11,95,103,99,100,95,105,109, - 112,111,114,116,114,199,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,208,0,0,0,241,3,0, - 0,115,8,0,0,0,0,9,12,1,8,1,12,1,114,208, - 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,209,0,0, - 0,114,182,0,0,0,78,41,16,114,195,0,0,0,114,196, - 0,0,0,114,1,0,0,0,114,197,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,212,0,0,0,114,44, - 0,0,0,114,66,0,0,0,114,203,0,0,0,114,17,0, - 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, - 0,114,206,0,0,0,41,8,114,95,0,0,0,218,8,102, - 114,111,109,108,105,115,116,114,204,0,0,0,114,210,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,213,0,0,0,0, - 4,0,0,115,44,0,0,0,0,10,8,1,10,1,4,1, - 12,2,4,1,28,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,213,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,144,0,0,0,114,104,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,140,0, - 0,0,114,127,0,0,0,114,22,0,0,0,41,6,114,34, - 0,0,0,114,129,0,0,0,114,191,0,0,0,114,192,0, - 0,0,114,193,0,0,0,114,128,0,0,0,41,3,218,7, - 103,108,111,98,97,108,115,114,185,0,0,0,114,94,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,37,4,0,0,115,38,0,0,0,0,7,10,1, - 10,1,8,1,18,1,22,2,2,0,2,254,6,3,4,1, - 8,1,6,2,6,2,2,0,2,254,6,3,8,1,8,1, - 14,1,114,219,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,180,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,150,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,110,26, - 116,7,124,5,100,4,131,2,114,172,116,8,124,5,124,3, - 116,0,131,3,83,0,124,5,83,0,100,2,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,127,0,0,0,114,140,0,0,0,41,9,114,208, - 0,0,0,114,219,0,0,0,218,9,112,97,114,116,105,116, - 105,111,110,114,184,0,0,0,114,15,0,0,0,114,91,0, - 0,0,114,1,0,0,0,114,4,0,0,0,114,213,0,0, - 0,41,9,114,17,0,0,0,114,218,0,0,0,218,6,108, - 111,99,97,108,115,114,214,0,0,0,114,186,0,0,0,114, - 95,0,0,0,90,8,103,108,111,98,97,108,115,95,114,185, - 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,64,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,32,1,10,1,12,2,114,222, - 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,159,0,0,0,114,166,0,0, - 0,114,78,0,0,0,114,158,0,0,0,41,2,114,17,0, - 0,0,114,94,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,101,4,0,0,115,8, - 0,0,0,0,1,10,1,8,1,12,1,114,223,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,191,0,0,0,114,63, - 0,0,0,78,41,15,114,56,0,0,0,114,15,0,0,0, - 114,14,0,0,0,114,91,0,0,0,218,5,105,116,101,109, - 115,114,195,0,0,0,114,77,0,0,0,114,159,0,0,0, - 114,87,0,0,0,114,173,0,0,0,114,141,0,0,0,114, - 147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94,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,108,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,227, - 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,227, - 0,0,0,114,15,0,0,0,114,190,0,0,0,114,118,0, - 0,0,114,159,0,0,0,114,173,0,0,0,41,2,114,225, - 0,0,0,114,226,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,143,4,0,0,115,6,0,0,0,0,2,10,2,12,1, - 114,228,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,125,0,0,0,114,228,0,0,0,114,15, - 0,0,0,114,91,0,0,0,114,1,0,0,0,41,1,114, - 229,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, - 151,4,0,0,115,6,0,0,0,0,3,8,1,4,1,114, - 230,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,125,0,0,0,114,12,0, - 0,0,114,18,0,0,0,114,58,0,0,0,114,33,0,0, - 0,114,42,0,0,0,114,19,0,0,0,114,20,0,0,0, - 114,48,0,0,0,114,49,0,0,0,114,52,0,0,0,114, - 64,0,0,0,114,66,0,0,0,114,75,0,0,0,114,85, - 0,0,0,114,89,0,0,0,114,96,0,0,0,114,110,0, - 0,0,114,111,0,0,0,114,90,0,0,0,114,141,0,0, - 0,114,147,0,0,0,114,151,0,0,0,114,106,0,0,0, - 114,92,0,0,0,114,157,0,0,0,114,158,0,0,0,114, - 93,0,0,0,114,159,0,0,0,114,173,0,0,0,114,178, - 0,0,0,114,187,0,0,0,114,189,0,0,0,114,194,0, - 0,0,114,200,0,0,0,90,15,95,69,82,82,95,77,83, - 71,95,80,82,69,70,73,88,114,202,0,0,0,114,205,0, - 0,0,218,6,111,98,106,101,99,116,114,206,0,0,0,114, - 207,0,0,0,114,208,0,0,0,114,213,0,0,0,114,219, - 0,0,0,114,222,0,0,0,114,223,0,0,0,114,227,0, - 0,0,114,228,0,0,0,114,230,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,68,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, + 0,0,114,148,0,0,0,50,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,86, + 0,0,0,41,10,114,104,0,0,0,114,17,0,0,0,114, + 56,0,0,0,114,87,0,0,0,114,78,0,0,0,114,44, + 0,0,0,114,66,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,95,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,149,0,0,0,54,3,0,0, + 115,14,0,0,0,0,2,8,1,10,1,10,1,2,255,6, + 2,12,1,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,96,0,0, + 0,114,168,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,154,0,0,0,63,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,56,0,0, + 0,114,175,0,0,0,114,168,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,114,169,0,0,0,72, + 3,0,0,115,2,0,0,0,0,4,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,168,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,170,0,0,0,78,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,56,0,0,0,90,17,105,115,95,102,114,111,122,101,110, + 95,112,97,99,107,97,103,101,114,168,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,114,0,0, + 0,84,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,137,0,0,0,114,171,0,0,0,114,98, + 0,0,0,114,172,0,0,0,114,166,0,0,0,114,167,0, + 0,0,114,148,0,0,0,114,149,0,0,0,114,154,0,0, + 0,114,89,0,0,0,114,169,0,0,0,114,170,0,0,0, + 114,114,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,173,0,0,0,14,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,173,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,56,0, + 0,0,114,57,0,0,0,114,46,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,53,0,0,0, + 97,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,56,0,0,0,114,59,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,55,0,0,0,101, + 3,0,0,115,2,0,0,0,0,2,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,53, + 0,0,0,114,55,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,178,0,0, + 0,93,3,0,0,115,6,0,0,0,8,2,4,2,8,4, + 114,178,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,127,0,0,0,114,37, + 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,78,0,0,0,114,44,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,106,3,0, + 0,115,10,0,0,0,0,2,16,1,12,1,8,1,8,1, + 114,187,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,167,0,0, + 0,114,90,0,0,0,41,4,218,6,102,105,110,100,101,114, + 114,17,0,0,0,114,164,0,0,0,114,108,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,115,3,0,0,115,8,0,0,0,0,3,12,1,8,1, + 4,1,114,189,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,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,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,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,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,113,52,124,7,2,0,1,0,83,0,113, + 52,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,78,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,91,0,0,0,114,178,0,0,0,114, + 166,0,0,0,114,105,0,0,0,114,189,0,0,0,114,104, + 0,0,0,41,10,114,17,0,0,0,114,164,0,0,0,114, + 165,0,0,0,114,190,0,0,0,90,9,105,115,95,114,101, + 108,111,97,100,114,188,0,0,0,114,166,0,0,0,114,94, + 0,0,0,114,95,0,0,0,114,104,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,124,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,10,2,10,2,114,194,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,44,0,0,0, + 114,14,0,0,0,218,10,86,97,108,117,101,69,114,114,111, + 114,114,78,0,0,0,169,3,114,17,0,0,0,114,185,0, + 0,0,114,186,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,171,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,200,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,127,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,128,0,0,0,114,15,0, + 0,0,114,91,0,0,0,114,66,0,0,0,114,140,0,0, + 0,114,105,0,0,0,218,8,95,69,82,82,95,77,83,71, + 114,44,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,194,0,0,0,114, + 158,0,0,0,114,5,0,0,0,114,191,0,0,0,114,192, + 0,0,0,114,193,0,0,0,41,9,114,17,0,0,0,218, + 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, + 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, + 101,114,156,0,0,0,114,94,0,0,0,114,95,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,190, + 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,205,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,49, + 0,0,0,114,15,0,0,0,114,91,0,0,0,114,34,0, + 0,0,218,14,95,78,69,69,68,83,95,76,79,65,68,73, + 78,71,114,205,0,0,0,114,44,0,0,0,114,203,0,0, + 0,114,64,0,0,0,41,4,114,17,0,0,0,114,204,0, + 0,0,114,95,0,0,0,114,74,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,225,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,207,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,200,0,0, + 0,114,187,0,0,0,114,207,0,0,0,218,11,95,103,99, + 100,95,105,109,112,111,114,116,114,199,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,208,0,0, + 0,241,3,0,0,115,8,0,0,0,0,9,12,1,8,1, + 12,1,114,208,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,209,0,0,0,114,182,0,0,0,78,41,16,114,195,0, + 0,0,114,196,0,0,0,114,1,0,0,0,114,197,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,212,0, + 0,0,114,44,0,0,0,114,66,0,0,0,114,203,0,0, + 0,114,17,0,0,0,114,15,0,0,0,114,91,0,0,0, + 114,34,0,0,0,114,206,0,0,0,41,8,114,95,0,0, + 0,218,8,102,114,111,109,108,105,115,116,114,204,0,0,0, + 114,210,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,213, + 0,0,0,0,4,0,0,115,44,0,0,0,0,10,8,1, + 10,1,4,1,12,2,4,1,28,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,213,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,144,0,0,0,114,104,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,140,0,0,0,114,127,0,0,0,114,22,0,0,0, + 41,6,114,34,0,0,0,114,129,0,0,0,114,191,0,0, + 0,114,192,0,0,0,114,193,0,0,0,114,128,0,0,0, + 41,3,218,7,103,108,111,98,97,108,115,114,185,0,0,0, + 114,94,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,37,4,0,0,115,38,0,0,0, + 0,7,10,1,10,1,8,1,18,1,22,2,2,0,2,254, + 6,3,4,1,8,1,6,2,6,2,2,0,2,254,6,3, + 8,1,8,1,14,1,114,219,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,180,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,150,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,110,26,116,7,124,5,100,4,131,2,114,172,116,8, + 124,5,124,3,116,0,131,3,83,0,124,5,83,0,100,2, + 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,127,0,0,0,114,140,0,0,0, + 41,9,114,208,0,0,0,114,219,0,0,0,218,9,112,97, + 114,116,105,116,105,111,110,114,184,0,0,0,114,15,0,0, + 0,114,91,0,0,0,114,1,0,0,0,114,4,0,0,0, + 114,213,0,0,0,41,9,114,17,0,0,0,114,218,0,0, + 0,218,6,108,111,99,97,108,115,114,214,0,0,0,114,186, + 0,0,0,114,95,0,0,0,90,8,103,108,111,98,97,108, + 115,95,114,185,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,64,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,32,1,10,1, + 12,2,114,222,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,159,0,0,0, + 114,166,0,0,0,114,78,0,0,0,114,158,0,0,0,41, + 2,114,17,0,0,0,114,94,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,101,4, + 0,0,115,8,0,0,0,0,1,10,1,8,1,12,1,114, + 223,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,191,0, + 0,0,114,63,0,0,0,78,41,15,114,56,0,0,0,114, + 15,0,0,0,114,14,0,0,0,114,91,0,0,0,218,5, + 105,116,101,109,115,114,195,0,0,0,114,77,0,0,0,114, + 159,0,0,0,114,87,0,0,0,114,173,0,0,0,114,141, + 0,0,0,114,147,0,0,0,114,1,0,0,0,114,223,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,95,0,0,0,114,108,0,0,0,114,94, + 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,108,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,227,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,227,0,0,0,114,15,0,0,0,114,190,0,0, + 0,114,118,0,0,0,114,159,0,0,0,114,173,0,0,0, + 41,2,114,225,0,0,0,114,226,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,143,4,0,0,115,6,0,0,0,0,2, + 10,2,12,1,114,228,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,125,0,0,0,114,228,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,1,0,0, + 0,41,1,114,229,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,151,4,0,0,115,6,0,0,0,0,3,8, + 1,4,1,114,230,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,125,0,0, + 0,114,12,0,0,0,114,18,0,0,0,114,58,0,0,0, + 114,33,0,0,0,114,42,0,0,0,114,19,0,0,0,114, + 20,0,0,0,114,48,0,0,0,114,49,0,0,0,114,52, + 0,0,0,114,64,0,0,0,114,66,0,0,0,114,75,0, + 0,0,114,85,0,0,0,114,89,0,0,0,114,96,0,0, + 0,114,110,0,0,0,114,111,0,0,0,114,90,0,0,0, + 114,141,0,0,0,114,147,0,0,0,114,151,0,0,0,114, + 106,0,0,0,114,92,0,0,0,114,157,0,0,0,114,158, + 0,0,0,114,93,0,0,0,114,159,0,0,0,114,173,0, + 0,0,114,178,0,0,0,114,187,0,0,0,114,189,0,0, + 0,114,194,0,0,0,114,200,0,0,0,90,15,95,69,82, + 82,95,77,83,71,95,80,82,69,70,73,88,114,202,0,0, + 0,114,205,0,0,0,218,6,111,98,106,101,99,116,114,206, + 0,0,0,114,207,0,0,0,114,208,0,0,0,114,213,0, + 0,0,114,219,0,0,0,114,222,0,0,0,114,223,0,0, + 0,114,227,0,0,0,114,228,0,0,0,114,230,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,68,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, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index e8e99da093d..d67c2a8fee4 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -278,7 +278,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,111,109,105,99,120,0,0,0,115,30,0,0,0,0,5, 16,1,6,1,16,0,6,255,4,2,2,3,14,1,40,1, 16,1,12,1,2,1,14,1,12,1,6,1,114,68,0,0, - 0,105,96,13,0,0,114,27,0,0,0,114,16,0,0,0, + 0,105,97,13,0,0,114,27,0,0,0,114,16,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, @@ -392,7 +392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 116,95,102,105,108,101,110,97,109,101,218,8,102,105,108,101, 110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6, 0,0,0,218,17,99,97,99,104,101,95,102,114,111,109,95, - 115,111,117,114,99,101,44,1,0,0,115,72,0,0,0,0, + 115,111,117,114,99,101,45,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, @@ -473,7 +473,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,108, 101,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, 6,0,0,0,218,17,115,111,117,114,99,101,95,102,114,111, - 109,95,99,97,99,104,101,115,1,0,0,115,52,0,0,0, + 109,95,99,97,99,104,101,116,1,0,0,115,52,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,18,2,10,1, 8,1,16,1,10,1,16,1,10,1,14,2,16,1,10,1, @@ -508,7 +508,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 101,120,116,101,110,115,105,111,110,218,11,115,111,117,114,99, 101,95,112,97,116,104,114,3,0,0,0,114,3,0,0,0, 114,6,0,0,0,218,15,95,103,101,116,95,115,111,117,114, - 99,101,102,105,108,101,155,1,0,0,115,20,0,0,0,0, + 99,101,102,105,108,101,156,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, @@ -521,7 +521,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 117,112,108,101,114,101,0,0,0,114,97,0,0,0,114,81, 0,0,0,114,88,0,0,0,41,1,114,96,0,0,0,114, 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,11, - 95,103,101,116,95,99,97,99,104,101,100,174,1,0,0,115, + 95,103,101,116,95,99,97,99,104,101,100,175,1,0,0,115, 16,0,0,0,0,1,14,1,2,1,10,1,12,1,8,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, @@ -536,7 +536,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 0,114,50,0,0,0,114,49,0,0,0,41,2,114,43,0, 0,0,114,51,0,0,0,114,3,0,0,0,114,3,0,0, 0,114,6,0,0,0,218,10,95,99,97,108,99,95,109,111, - 100,101,186,1,0,0,115,12,0,0,0,0,2,2,1,14, + 100,101,187,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, @@ -561,2173 +561,2175 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 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,68,0,0,0,124,1,100,0,117, + 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,124,3,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,3,0,0,0,114,6,0,0,0,218,19,95, - 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, - 101,114,206,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,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,66,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,5, - 95,119,114,97,112,217,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,3,0,0,0,114,121,0,0,0,114,6, - 0,0,0,218,11,95,99,104,101,99,107,95,110,97,109,101, - 198,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,72,0,0,0,41,6,218,11,102,105,110, - 100,95,108,111,97,100,101,114,114,22,0,0,0,114,74,0, - 0,0,114,75,0,0,0,114,61,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,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,17,95,102,105,110,100,95,109,111,100,117,108,101, - 95,115,104,105,109,226,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,158,0,0,0,124,0,100,1,100, - 2,133,2,25,0,125,3,124,3,116,0,107,3,114,60,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,124,2,142,1,130,1,116,4,124,0,131,1,100,6,107, - 0,114,102,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,154,100,10,124,5,155,2,100, - 11,124,1,155,2,157,4,125,4,116,3,124,4,102,1,124, - 2,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,15,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,22,0,0,0,218,8,69,79,70,69,114,114, - 111,114,114,26,0,0,0,41,6,114,25,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,82,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,13,95,99,108,97,115,115,105,102,121,95,112,121,99,243, - 1,0,0,115,28,0,0,0,0,16,12,1,8,1,16,1, - 12,1,12,1,12,1,10,1,12,1,8,1,16,2,8,1, - 16,1,12,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,112,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,58,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,124,4,142,1,130, - 1,124,2,100,6,117,1,114,108,116,0,124,0,100,2,100, - 7,133,2,25,0,131,1,124,2,100,3,64,0,107,3,114, - 108,116,3,100,4,124,3,155,2,157,2,102,1,124,4,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, - 14,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,26,0,0,0,114,134, - 0,0,0,114,149,0,0,0,114,117,0,0,0,41,6,114, - 25,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,3, - 0,0,0,114,3,0,0,0,114,6,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,20,2,0,0,115,16,0,0,0,0, - 19,24,1,10,1,12,1,12,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,3,0,0,0,67,0,0,0,115,38,0, - 0,0,124,0,100,1,100,2,133,2,25,0,124,1,107,3, - 114,34,116,0,100,3,124,2,155,2,157,2,102,1,124,3, - 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,25,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,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,18,95,118,97,108,105,100,97,116,101,95,104,97,115, - 104,95,112,121,99,48,2,0,0,115,12,0,0,0,0,17, - 16,1,2,1,8,255,2,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,43,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,61,0,0,0,41,5,114,25,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,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,218,17,95,99,111,109,112,105,108,101,95,98,121,116, - 101,99,111,100,101,72,2,0,0,115,20,0,0,0,0,2, - 10,1,10,1,12,1,8,1,12,1,4,2,10,1,2,0, - 2,255,114,165,0,0,0,114,72,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, - 72,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,20, - 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,25,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,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,85,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,38,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,20,0,0, - 0,114,22,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,25,0,0,0,114,82,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, - 95,99,111,100,101,95,116,111,95,104,97,115,104,95,112,121, - 99,95,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,72,0,0,0,78,84,41,7,218, - 8,116,111,107,101,110,105,122,101,114,63,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,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,13,100,101,99, - 111,100,101,95,115,111,117,114,99,101,106,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,12, - 1,0,0,124,1,100,1,117,0,114,58,100,2,125,1,116, - 0,124,2,100,3,131,2,114,68,122,14,124,2,160,1,124, - 0,161,1,125,1,87,0,113,68,4,0,116,2,121,54,1, - 0,1,0,1,0,89,0,113,68,48,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,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, - 104,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,222,122,14,124, - 2,160,13,124,0,161,1,125,7,87,0,110,18,4,0,116, - 2,121,202,1,0,1,0,1,0,89,0,113,222,48,0,124, - 7,114,222,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,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,72,0,0,0,41,17,114,128,0,0,0, - 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, - 78,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,46,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,3,0,0,0,114,3, - 0,0,0,114,6,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,123,2,0,0,115,62,0,0,0,0,12,8,4,4,1, - 10,2,2,1,14,1,12,1,8,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,54, - 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,100,0,83,0,114,109,0,0,0,41,5, - 218,7,95,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,49,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,5,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,14,95,111,112,101,110, - 95,114,101,103,105,115,116,114,121,203,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,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,27,0,0, - 0,41,2,114,139,0,0,0,90,11,115,121,115,95,118,101, - 114,115,105,111,110,114,39,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,61,0,0,0, - 114,8,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,49,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,5,0,0,0,90,4,104, - 107,101,121,218,8,102,105,108,101,112,97,116,104,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,115, - 101,97,114,99,104,95,114,101,103,105,115,116,114,121,210,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,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,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,52,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,113,62,100,0,83,0,41,2, - 78,114,180,0,0,0,41,8,114,200,0,0,0,114,48,0, - 0,0,114,49,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,43,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,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,9,102,105,110,100,95, - 115,112,101,99,225,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,34,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,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, + 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,3,0,0,0,114,6,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,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,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,66, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,5,95,119,114,97,112,218,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,3,0,0,0,114,121,0, + 0,0,114,6,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,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,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,43,0,0,0,114,187,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,11,102,105, - 110,100,95,109,111,100,117,108,101,241,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,3,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,191, - 0,0,0,191,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,38,0,0,0,114,70,0,0,0,114,72,0,0,0,114, - 27,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, - 114,46,0,0,0,114,179,0,0,0,114,42,0,0,0,114, - 40,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, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,182, - 0,0,0,4,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, - 3,0,0,0,169,2,114,118,0,0,0,114,187,0,0,0, + 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,72,0,0,0,41,6,218, + 11,102,105,110,100,95,108,111,97,100,101,114,114,22,0,0, + 0,114,74,0,0,0,114,75,0,0,0,114,61,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,3,0,0,0,114,3,0,0, + 0,114,6,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,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,15,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, + 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,26, + 0,0,0,41,6,114,25,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,82,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,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,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,14,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,26,0, + 0,0,114,134,0,0,0,114,149,0,0,0,114,117,0,0, + 0,41,6,114,25,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,3,0,0,0,114,3,0,0,0,114,6,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,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,25, + 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,3,0,0,0,114, + 3,0,0,0,114,6,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,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,43,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,61,0,0,0,41, + 5,114,25,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,3,0,0,0, + 114,3,0,0,0,114,6,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,20,0,0,0,0,2,10,1,10,1,12,1,8,1, + 12,1,4,2,10,1,2,0,2,255,114,165,0,0,0,114, + 72,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,72,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,20,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,25,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,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,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,38,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,20,0,0,0,114,22,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,25,0, + 0,0,114,82,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,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,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,72, + 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, + 101,114,63,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,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, + 99,101,107,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,12,1,0,0,124,1,100,1,117, + 0,114,58,100,2,125,1,116,0,124,2,100,3,131,2,114, + 68,122,14,124,2,160,1,124,0,161,1,125,1,87,0,113, + 68,4,0,116,2,121,54,1,0,1,0,1,0,89,0,113, + 68,48,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,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,104,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,222,122,14,124,2,160,13,124,0,161,1,125, + 7,87,0,110,18,4,0,116,2,121,202,1,0,1,0,1, + 0,89,0,113,222,48,0,124,7,114,222,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,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,72,0,0, + 0,41,17,114,128,0,0,0,114,179,0,0,0,114,117,0, + 0,0,114,2,0,0,0,114,78,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,46,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,3,0,0,0,114,3,0,0,0,114,6,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,1,10,2,2,1,14,1,12,1, + 8,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,54,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,100,0,83, + 0,114,109,0,0,0,41,5,218,7,95,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,49,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,5,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,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,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,27,0,0,0,41,2,114,139,0,0,0, + 90,11,115,121,115,95,118,101,114,115,105,111,110,114,39,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,61,0,0,0,114,8,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,49,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,5,0,0,0,90,4,104,107,101,121,218,8,102,105,108, + 101,112,97,116,104,114,3,0,0,0,114,3,0,0,0,114, + 6,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,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,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,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,52,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, + 113,62,100,0,83,0,41,2,78,114,180,0,0,0,41,8, + 114,200,0,0,0,114,48,0,0,0,114,49,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,43,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,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,9,102,105,110,100,95,115,112,101,99,226,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,34,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,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,43,0,0,0, + 114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,11,102,105,110,100,95,109,111,100,117,108, + 101,242,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,3,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,191,0,0,0,192,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,38,0,0,0,114,70,0, + 0,0,114,72,0,0,0,114,27,0,0,0,218,8,95,95, + 105,110,105,116,95,95,41,4,114,46,0,0,0,114,179,0, + 0,0,114,42,0,0,0,114,40,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,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,182,0,0,0,5,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,3,0,0,0,169,2,114,118, + 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,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,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,61,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,3,0,0, + 0,114,3,0,0,0,114,6,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,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,3,0,0,0,114,3,0,0,0, + 114,6,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,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,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,208,0,0,0,0,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,49, + 0,0,0,169,2,114,118,0,0,0,114,43,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, + 112,97,116,104,95,109,116,105,109,101,31,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 13,99,114,101,97,116,101,95,109,111,100,117,108,101,12,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,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,61,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,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,101, - 15,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,108, - 111,97,100,95,109,111,100,117,108,101,23,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,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 208,0,0,0,255,2,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,49,0,0,0,169,2,114,118,0, - 0,0,114,43,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,30,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, + 10,112,97,116,104,95,115,116,97,116,115,39,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,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,25,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,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,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,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,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,112,97,116,104,95,115,116, - 97,116,115,38,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,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,25,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,15,95,99,97,99,104,101,95,98,121,116,101,99,111, - 100,101,52,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,3,0,0,0,41,3,114, - 118,0,0,0,114,43,0,0,0,114,25,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0, - 0,0,62,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,67,111,110,99,114,101, + 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,3,0,0,0,41,3,114,118,0,0,0,114,43,0,0, + 0,114,25,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,225,0,0,0,63,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,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,49,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,43,0,0,0,114,174,0,0,0,218,3,101,120,99, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 10,103,101,116,95,115,111,117,114,99,101,70,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,25,0,0,0,114,43,0,0,0,114,230, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111, + 100,101,80,3,0,0,115,8,0,0,0,0,5,12,1,2, + 0,2,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,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,49, - 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,43,0,0,0,114,174, - 0,0,0,218,3,101,120,99,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,10,103,101,116,95,115,111,117, - 114,99,101,69,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,25,0,0, - 0,114,43,0,0,0,114,230,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,14,115,111,117,114, - 99,101,95,116,111,95,99,111,100,101,79,3,0,0,115,8, - 0,0,0,0,5,12,1,2,0,2,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,38,0,0,0,114,72,0,0,0,114,27,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,81,0,0,0,114,224,0,0, - 0,114,49,0,0,0,114,17,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,8,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,22,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,25, - 0,0,0,114,151,0,0,0,114,82,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,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,213,0,0,0,87,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,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,221,0,0,0, - 28,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,124,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,100,16, - 100,17,132,0,90,12,100,18,100,19,132,0,90,13,100,20, - 100,21,132,0,90,14,100,22,100,23,132,0,90,15,135,0, - 4,0,90,16,83,0,41,24,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,43,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,209,0,0,0,177,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,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,6,95,95,101,113,95,95,183,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, - 43,0,0,0,169,1,114,118,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,8,95,95,104,97, - 115,104,95,95,187,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,3,0,0,0,114,6, - 0,0,0,114,220,0,0,0,190,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,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,47,0, - 0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,179,0,0,0,202,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,63,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,64,0,0,0,41,3,114,118,0, - 0,0,114,43,0,0,0,114,67,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,227,0,0,0, - 207,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,2,0,0,0,3,0,0,0,67,0,0, - 0,115,18,0,0,0,124,0,160,0,124,1,161,1,114,14, - 124,0,83,0,100,0,83,0,114,109,0,0,0,41,1,114, - 182,0,0,0,169,2,114,118,0,0,0,114,216,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,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,0,2,10, - 1,4,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,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,32,0,0, - 0,116,0,116,1,124,0,106,2,131,1,100,1,25,0,124, - 1,131,2,125,2,116,3,160,4,124,2,100,2,161,2,83, - 0,41,3,78,114,72,0,0,0,114,251,0,0,0,41,5, - 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, - 63,0,0,0,114,64,0,0,0,169,3,114,118,0,0,0, - 90,8,114,101,115,111,117,114,99,101,114,43,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,13, - 111,112,101,110,95,114,101,115,111,117,114,99,101,224,3,0, - 0,115,4,0,0,0,0,1,20,1,122,24,70,105,108,101, - 76,111,97,100,101,114,46,111,112,101,110,95,114,101,115,111, - 117,114,99,101,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,38,0, - 0,0,124,0,160,0,124,1,161,1,115,14,116,1,130,1, - 116,2,116,3,124,0,106,4,131,1,100,1,25,0,124,1, - 131,2,125,2,124,2,83,0,169,2,78,114,72,0,0,0, - 41,5,218,11,105,115,95,114,101,115,111,117,114,99,101,218, - 17,70,105,108,101,78,111,116,70,111,117,110,100,69,114,114, - 111,114,114,37,0,0,0,114,46,0,0,0,114,43,0,0, - 0,114,255,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,13,114,101,115,111,117,114,99,101,95, - 112,97,116,104,228,3,0,0,115,8,0,0,0,0,1,10, - 1,4,1,20,1,122,24,70,105,108,101,76,111,97,100,101, - 114,46,114,101,115,111,117,114,99,101,95,112,97,116,104,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,40,0,0,0,116,0,124, - 1,118,0,114,12,100,1,83,0,116,1,116,2,124,0,106, - 3,131,1,100,2,25,0,124,1,131,2,125,2,116,4,124, - 2,131,1,83,0,41,3,78,70,114,72,0,0,0,41,5, - 114,34,0,0,0,114,37,0,0,0,114,46,0,0,0,114, - 43,0,0,0,114,53,0,0,0,169,3,114,118,0,0,0, - 114,116,0,0,0,114,43,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,2,1,0,0,234,3, - 0,0,115,8,0,0,0,0,1,8,1,4,1,20,1,122, - 22,70,105,108,101,76,111,97,100,101,114,46,105,115,95,114, - 101,115,111,117,114,99,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,24,0,0,0,116,0,116,1,160,2,116,3,124,0,106, - 4,131,1,100,1,25,0,161,1,131,1,83,0,114,1,1, - 0,0,41,5,218,4,105,116,101,114,114,2,0,0,0,218, - 7,108,105,115,116,100,105,114,114,46,0,0,0,114,43,0, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,99,111,110,116,101,110,116,115, - 240,3,0,0,115,2,0,0,0,0,1,122,19,70,105,108, - 101,76,111,97,100,101,114,46,99,111,110,116,101,110,116,115, - 41,17,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,114,0, - 1,0,0,114,4,1,0,0,114,2,1,0,0,114,8,1, - 0,0,90,13,95,95,99,108,97,115,115,99,101,108,108,95, - 95,114,3,0,0,0,114,3,0,0,0,114,249,0,0,0, - 114,6,0,0,0,114,239,0,0,0,172,3,0,0,115,30, - 0,0,0,8,2,4,3,8,6,8,4,8,3,2,1,14, - 11,2,1,10,4,8,11,2,1,10,5,8,4,8,6,8, - 6,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,48,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,43,0,0, - 0,114,238,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,224,0,0,0,248,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,25,0,0,0,114,51,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,226,0,0, - 0,253,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,59,0,0,0,114,11,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,252,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,104,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,113,60,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,52,4,0,116,8, - 144,0,121,246,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,46,0,0,0,114,55,0,0,0,114,186,0,0,0, - 114,41,0,0,0,114,37,0,0,0,114,2,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,49,0,0,0,114,134,0,0, - 0,114,149,0,0,0,114,68,0,0,0,41,9,114,118,0, - 0,0,114,43,0,0,0,114,25,0,0,0,114,12,1,0, - 0,218,6,112,97,114,101,110,116,114,96,0,0,0,114,36, - 0,0,0,114,32,0,0,0,114,228,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0, - 0,2,4,0,0,115,48,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,2,0,2,255,4,2,28,1,2,1, - 12,1,16,1,16,2,8,1,2,255,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,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 9,1,0,0,244,3,0,0,115,8,0,0,0,8,2,4, - 2,8,5,8,5,114,9,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,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,43,0,0,0,114,25,0,0,0,114,151,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,37,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,229,0,0,0,53,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,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 15,1,0,0,33,4,0,0,115,6,0,0,0,8,2,4, - 2,8,16,114,15,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, - 114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,209,0,0,0,70,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,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,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,243,0,0,0,74,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,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,247,0,0,0,78,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,43,0,0,0,41,3,114,118,0,0, - 0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,81, - 4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255, - 4,2,6,1,4,0,4,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,43,0,0,0,114,253,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217, - 0,0,0,89,4,0,0,115,10,0,0,0,0,2,14,1, - 6,1,4,0,4,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,38, - 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,3,0,0,0,169,2,114,31,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,3,0,0,0,114,6,0,0,0,218,9, - 60,103,101,110,101,120,112,114,62,98,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,120,112,114,62,41,4,114,46,0,0,0, - 114,43,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,3,0,0,0,114,18,1,0,0,114,6,0, - 0,0,114,182,0,0,0,95,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,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,213,0,0,0,101,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,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,105, - 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,47,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, - 0,109,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,3,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0, - 62,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, + 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,38,0,0,0,114, + 72,0,0,0,114,27,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, + 81,0,0,0,114,224,0,0,0,114,49,0,0,0,114,17, + 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,8,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,22,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,25,0,0,0,114,151,0,0,0, + 114,82,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, + 0,0,88,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, + 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,221,0,0,0,29,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,124,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,43,0,0,0,90,11,112,97,116,104,95,102,105, - 110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,209,0,0,0,122,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,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,70,0,0,0,114,39,0, - 0,0,41,2,114,8,0,0,0,114,43,0,0,0,90,8, - 95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114, - 40,0,0,0,41,4,114,118,0,0,0,114,14,1,0,0, - 218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3, - 0,0,0,114,6,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,128,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,30,1,0,0, - 114,130,0,0,0,114,8,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1, - 0,0,138,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,25,1,0,0,114, - 26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140, - 0,0,0,114,178,0,0,0,114,24,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,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108, - 97,116,101,142,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,114,6,1,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114, - 95,95,155,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,32,1,0,0,41,2,114,118, - 0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116, - 105,116,101,109,95,95,158,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,24,1,0,0,41,3,114,118,0,0,0,114,35,1,0, - 0,114,43,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109, - 95,95,161,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,22,0,0,0,114, - 32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95, - 95,164,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,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,61,0,0,0,114,24, - 1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95, - 95,167,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,34,1,0,0,169,2,114,118,0,0,0, - 218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110, - 115,95,95,170,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,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186, - 0,0,0,173,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,30,1,0,0,114,25,1,0,0,114,32,1,0,0, - 114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114, - 38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186, - 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,22,1,0,0,115,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,22,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,22,1,0,0, - 114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,209,0,0,0,179,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,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,61,0,0,0,114,125,0,0,0,41,2,114,193, + 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,100,16,100,17,132,0,90,12,100,18, + 100,19,132,0,90,13,100,20,100,21,132,0,90,14,100,22, + 100,23,132,0,90,15,135,0,4,0,90,16,83,0,41,24, + 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,43,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,209,0,0,0,178,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,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,6,95,95,101,113,95, + 95,184,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,43,0,0,0,169,1,114,118, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,8,95,95,104,97,115,104,95,95,188,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,3,0,0,0,114,6,0,0,0,114,220,0,0,0, + 191,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,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,47,0,0,0,114,219,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,179, + 0,0,0,203,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,63,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,64, + 0,0,0,41,3,114,118,0,0,0,114,43,0,0,0,114, + 67,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,227,0,0,0,208,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,2,0,0, + 0,3,0,0,0,67,0,0,0,115,18,0,0,0,124,0, + 160,0,124,1,161,1,114,14,124,0,83,0,100,0,83,0, + 114,109,0,0,0,41,1,114,182,0,0,0,169,2,114,118, 0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,182,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,114,6,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,0,2,10,1,4,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,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,32,0,0,0,116,0,116,1,124,0,106, + 2,131,1,100,1,25,0,124,1,131,2,125,2,116,3,160, + 4,124,2,100,2,161,2,83,0,41,3,78,114,72,0,0, + 0,114,251,0,0,0,41,5,114,37,0,0,0,114,46,0, + 0,0,114,43,0,0,0,114,63,0,0,0,114,64,0,0, + 0,169,3,114,118,0,0,0,90,8,114,101,115,111,117,114, + 99,101,114,43,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,218,13,111,112,101,110,95,114,101,115, + 111,117,114,99,101,225,3,0,0,115,4,0,0,0,0,1, + 20,1,122,24,70,105,108,101,76,111,97,100,101,114,46,111, + 112,101,110,95,114,101,115,111,117,114,99,101,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,38,0,0,0,124,0,160,0,124,1, + 161,1,115,14,116,1,130,1,116,2,116,3,124,0,106,4, + 131,1,100,1,25,0,124,1,131,2,125,2,124,2,83,0, + 169,2,78,114,72,0,0,0,41,5,218,11,105,115,95,114, + 101,115,111,117,114,99,101,218,17,70,105,108,101,78,111,116, + 70,111,117,110,100,69,114,114,111,114,114,37,0,0,0,114, + 46,0,0,0,114,43,0,0,0,114,255,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,114, + 101,115,111,117,114,99,101,95,112,97,116,104,229,3,0,0, + 115,8,0,0,0,0,1,10,1,4,1,20,1,122,24,70, + 105,108,101,76,111,97,100,101,114,46,114,101,115,111,117,114, + 99,101,95,112,97,116,104,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,40,0,0,0,116,0,124,1,118,0,114,12,100,1,83, + 0,116,1,116,2,124,0,106,3,131,1,100,2,25,0,124, + 1,131,2,125,2,116,4,124,2,131,1,83,0,41,3,78, + 70,114,72,0,0,0,41,5,114,34,0,0,0,114,37,0, + 0,0,114,46,0,0,0,114,43,0,0,0,114,53,0,0, + 0,169,3,114,118,0,0,0,114,116,0,0,0,114,43,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,2,1,0,0,235,3,0,0,115,8,0,0,0,0, + 1,8,1,4,1,20,1,122,22,70,105,108,101,76,111,97, + 100,101,114,46,105,115,95,114,101,115,111,117,114,99,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,24,0,0,0,116,0,116, + 1,160,2,116,3,124,0,106,4,131,1,100,1,25,0,161, + 1,131,1,83,0,114,1,1,0,0,41,5,218,4,105,116, + 101,114,114,2,0,0,0,218,7,108,105,115,116,100,105,114, + 114,46,0,0,0,114,43,0,0,0,114,246,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,8, + 99,111,110,116,101,110,116,115,241,3,0,0,115,2,0,0, + 0,0,1,122,19,70,105,108,101,76,111,97,100,101,114,46, + 99,111,110,116,101,110,116,115,41,17,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,114,0,1,0,0,114,4,1,0,0, + 114,2,1,0,0,114,8,1,0,0,90,13,95,95,99,108, + 97,115,115,99,101,108,108,95,95,114,3,0,0,0,114,3, + 0,0,0,114,249,0,0,0,114,6,0,0,0,114,239,0, + 0,0,173,3,0,0,115,30,0,0,0,8,2,4,3,8, + 6,8,4,8,3,2,1,14,11,2,1,10,4,8,11,2, + 1,10,5,8,4,8,6,8,6,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,48,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,43,0,0,0,114,238,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,224,0, + 0,0,249,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,25,0,0,0, + 114,51,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,226,0,0,0,254,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,59,0,0,0,114,11,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,252,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,104,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,113,60,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,52,4,0,116,8,144,0,121,246,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,46,0,0,0,114,55, + 0,0,0,114,186,0,0,0,114,41,0,0,0,114,37,0, + 0,0,114,2,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, + 49,0,0,0,114,134,0,0,0,114,149,0,0,0,114,68, + 0,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, + 25,0,0,0,114,12,1,0,0,218,6,112,97,114,101,110, + 116,114,96,0,0,0,114,36,0,0,0,114,32,0,0,0, + 114,228,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,225,0,0,0,3,4,0,0,115,48,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,2,0, + 2,255,4,2,28,1,2,1,12,1,16,1,16,2,8,1, + 2,255,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,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,9,1,0,0,245,3,0,0, + 115,8,0,0,0,8,2,4,2,8,5,8,5,114,9,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,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,43,0,0,0,114,25, + 0,0,0,114,151,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,38,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,3,0,0,0,114,219,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,229,0,0,0,54,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,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,15,1,0,0,34,4,0,0, + 115,6,0,0,0,8,2,4,2,8,16,114,15,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,114,5,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, + 0,71,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,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,243,0,0,0,75,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,247,0,0,0,79,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,43,0, + 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,212,0,0,0,82,4,0,0,115,18,0,0,0, + 0,2,4,1,4,0,2,255,4,2,6,1,4,0,4,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,43,0, + 0,0,114,253,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,217,0,0,0,90,4,0,0,115, + 10,0,0,0,0,2,14,1,6,1,4,0,4,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,38,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,3,0,0,0, + 169,2,114,31,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,3,0,0, + 0,114,6,0,0,0,218,9,60,103,101,110,101,120,112,114, + 62,99,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,120,112,114, + 62,41,4,114,46,0,0,0,114,43,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,3,0,0,0, + 114,18,1,0,0,114,6,0,0,0,114,182,0,0,0,96, + 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,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,102,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,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,191,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,39, - 0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0, - 0,194,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,39,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,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,213,0,0,0,197,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,3,0,0,0,114,211,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0, - 0,200,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,3,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,203,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,24,1,0, - 0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,206, - 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,0,0,114,124,0,0,0,114,126,0,0,0, - 114,209,0,0,0,114,207,0,0,0,114,44,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,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,43,1,0,0,178,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,43,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, + 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,3,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,229,0,0,0,106,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,47,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,179,0,0,0,110,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, + 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,252,0,0,0,63,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,43,0,0,0,90, + 11,112,97,116,104,95,102,105,110,100,101,114,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, + 123,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,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,70,0,0,0,114,39,0,0,0,41,2,114,8,0,0, + 0,114,43,0,0,0,90,8,95,95,112,97,116,104,95,95, + 41,2,114,23,1,0,0,114,40,0,0,0,41,4,114,118, + 0,0,0,114,14,1,0,0,218,3,100,111,116,90,2,109, + 101,114,3,0,0,0,114,3,0,0,0,114,6,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,129,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,30,1,0,0,114,130,0,0,0,114,8,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,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,25,1,0,0,139,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,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,8,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,46,1,0,0,41,3, - 114,193,0,0,0,114,116,0,0,0,218,6,102,105,110,100, - 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,46,1,0,0,224,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,82,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,42,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,113,34,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,8,0,0,0,218,10,112,97,116,104, - 95,104,111,111,107,115,114,74,0,0,0,114,75,0,0,0, - 114,138,0,0,0,114,117,0,0,0,41,3,114,193,0,0, - 0,114,43,0,0,0,90,4,104,111,111,107,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, - 116,104,95,104,111,111,107,115,234,4,0,0,115,16,0,0, - 0,0,3,16,1,12,1,10,1,2,1,14,1,12,1,12, - 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,39,0,0,0,78,41,7,114,2,0,0,0,114,54, - 0,0,0,114,3,1,0,0,114,8,0,0,0,114,48,1, - 0,0,218,8,75,101,121,69,114,114,111,114,114,52,1,0, - 0,41,3,114,193,0,0,0,114,43,0,0,0,114,50,1, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,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,247,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,50,1,0,0,114,140,0,0,0,114,141,0,0,0,114, - 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,16,95,108,101,103,97,99,121,95,103,101,116, - 95,115,112,101,99,13,5,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,54,1,0,0,114,128,0,0,0,114,203,0, - 0,0,114,55,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,43,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,50,1,0,0,114,187,0,0,0,114,141,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,25,1,0,0,114,26,1,0,0,114,27,1,0, + 0,114,23,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,24,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,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 114,101,99,97,108,99,117,108,97,116,101,143,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,114,6,1,0,0,114,32,1,0,0,114,246,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,9,95,103,101,116,95,115,112,101,99,28,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,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,100,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,92,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,110,4,124,4,83,0, - 100,1,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,8,0,0,0,114,43,0, - 0,0,114,58,1,0,0,114,140,0,0,0,114,178,0,0, - 0,114,181,0,0,0,114,22,1,0,0,41,6,114,193,0, - 0,0,114,139,0,0,0,114,43,0,0,0,114,202,0,0, - 0,114,187,0,0,0,114,57,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,60, - 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, - 6,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,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,206,0,0, - 0,84,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,3,0,0,0,79, - 0,0,0,115,24,0,0,0,100,1,100,2,108,0,109,1, - 125,3,1,0,124,3,106,2,124,1,124,2,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,72,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,59,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,59,1,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,60,1,0,0,97,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,46,1,0, - 0,114,52,1,0,0,114,54,1,0,0,114,55,1,0,0, - 114,58,1,0,0,114,203,0,0,0,114,206,0,0,0,114, - 60,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,45,1,0,0,220,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,45,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,3,0,0,0,114, - 16,1,0,0,169,1,114,140,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,19,1,0,0,126,5,0,0,115,4, - 0,0,0,4,0,2,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, - 70,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,43,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,43,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,3, - 0,0,0,114,62,1,0,0,114,6,0,0,0,114,209,0, - 0,0,120,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,64,1,0,0,114,246,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,46,1,0, - 0,134,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,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,137,0, - 0,0,140,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,43,0,0,0,90,4,115,109,115,108,114,202, - 0,0,0,114,140,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,58,1,0,0,152,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,96,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,216,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,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, - 113,148,116,17,124,8,131,1,125,3,124,0,106,14,68,0, - 93,82,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,222,116,15,124,12,131,1,114,222,124,0,160,16, - 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, - 83,0,113,222,124,3,144,1,114,92,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,70,0,0,0,114,27,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,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, - 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, - 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, - 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, - 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, - 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,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,17,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,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 203,0,0,0,157,5,0,0,115,74,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,26,4,8,2,14,1,16,1,16, - 1,12,1,8,1,10,1,2,0,2,255,10,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,70,0,0,0,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,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,3,0,0,0,41,1,114,105,0,0,0,41,2,114,31, - 0,0,0,90,2,102,110,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,9,60,115,101,116,99,111,109,112, - 62,234,5,0,0,115,4,0,0,0,6,0,2,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,43,0,0, - 0,114,2,0,0,0,114,7,1,0,0,114,54,0,0,0, - 114,3,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,8,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,65,1,0,0,114,66, - 1,0,0,114,100,0,0,0,114,61,0,0,0,114,105,0, - 0,0,218,3,97,100,100,114,11,0,0,0,114,67,1,0, - 0,41,9,114,118,0,0,0,114,43,0,0,0,114,8,1, - 0,0,90,21,108,111,119,101,114,95,115,117,102,102,105,120, - 95,99,111,110,116,101,110,116,115,114,41,1,0,0,114,116, - 0,0,0,114,29,1,0,0,114,17,1,0,0,90,8,110, - 101,119,95,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,69,1,0,0,205,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,47,0,0, - 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, - 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, - 0,0,0,114,6,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,246,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,3,0,0,0,41,3, - 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, - 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, - 112,97,116,104,95,104,111,111,107,236,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, + 218,8,95,95,105,116,101,114,95,95,156,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, + 32,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, + 101,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,159,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,24,1,0,0,41,3,114, + 118,0,0,0,114,35,1,0,0,114,43,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, + 95,115,101,116,105,116,101,109,95,95,162,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,22,0,0,0,114,32,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,7,95,95,108,101,110,95,95,165,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,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,61,0, - 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, - 254,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,46, - 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, - 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, - 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,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,61,0,0,0,114,24,1,0,0,114,246,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 8,95,95,114,101,112,114,95,95,168,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,34,1,0, + 0,169,2,114,118,0,0,0,218,4,105,116,101,109,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 95,99,111,110,116,97,105,110,115,95,95,171,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,24,1,0,0,114,186,0, + 0,0,114,40,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,186,0,0,0,174,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,30,1,0,0,114,25, + 1,0,0,114,32,1,0,0,114,33,1,0,0,114,36,1, + 0,0,114,37,1,0,0,114,38,1,0,0,114,39,1,0, + 0,114,42,1,0,0,114,186,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 22,1,0,0,116,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,22,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,22,1,0,0,114,24,1,0,0,114,28,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,209,0,0,0,180,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,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,61,0,0,0,114, + 125,0,0,0,41,2,114,193,0,0,0,114,216,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 11,109,111,100,117,108,101,95,114,101,112,114,183,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,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,182,0,0,0,192,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,39,0,0,0,114,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,229,0,0,0,195,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,39,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,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,213,0,0,0,198,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,3,0,0,0, + 114,211,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,212,0,0,0,201,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,3,0,0,0, + 114,253,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,217,0,0,0,204,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,24,1,0,0,114,218,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,220,0,0,0,207,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,0,0,114,124, + 0,0,0,114,126,0,0,0,114,209,0,0,0,114,207,0, + 0,0,114,44,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,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,43,1,0,0,179,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,43,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,8,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,46,1,0,0,41,3,114,193,0,0,0,114,116,0, + 0,0,218,6,102,105,110,100,101,114,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,46,1,0,0,225,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,82,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, + 42,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,113,34,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,8,0, + 0,0,218,10,112,97,116,104,95,104,111,111,107,115,114,74, + 0,0,0,114,75,0,0,0,114,138,0,0,0,114,117,0, + 0,0,41,3,114,193,0,0,0,114,43,0,0,0,90,4, + 104,111,111,107,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,95,112,97,116,104,95,104,111,111,107,115, + 235,4,0,0,115,16,0,0,0,0,3,16,1,12,1,10, + 1,2,1,14,1,12,1,12,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,39,0,0,0,78,41, + 7,114,2,0,0,0,114,54,0,0,0,114,3,1,0,0, + 114,8,0,0,0,114,48,1,0,0,218,8,75,101,121,69, + 114,114,111,114,114,52,1,0,0,41,3,114,193,0,0,0, + 114,43,0,0,0,114,50,1,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,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,248, + 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,50,1,0,0,114,140,0, + 0,0,114,141,0,0,0,114,187,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,16,95,108,101, + 103,97,99,121,95,103,101,116,95,115,112,101,99,14,5,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,54,1,0,0, + 114,128,0,0,0,114,203,0,0,0,114,55,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,43,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,50,1,0,0,114, + 187,0,0,0,114,141,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,9,95,103,101,116,95,115, + 112,101,99,29,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, + 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,100,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,92,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,110,4,124,4,83,0,100,1,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,8,0,0,0,114,43,0,0,0,114,58,1,0,0,114, + 140,0,0,0,114,178,0,0,0,114,181,0,0,0,114,22, + 1,0,0,41,6,114,193,0,0,0,114,139,0,0,0,114, + 43,0,0,0,114,202,0,0,0,114,187,0,0,0,114,57, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,203,0,0,0,61,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,6,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,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,206,0,0,0,85,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,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,72,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,59,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,59, + 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,60,1,0,0,98,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,46,1,0,0,114,52,1, + 0,0,114,54,1,0,0,114,55,1,0,0,114,58,1,0, + 0,114,203,0,0,0,114,206,0,0,0,114,60,1,0,0, 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,61,1,0,0,111,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,61,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,62,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,15,1,0,0, - 114,9,1,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, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,14, - 95,102,105,120,95,117,112,95,109,111,100,117,108,101,4,6, - 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,81,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,9,1,0,0,114,101,0,0,0,114, - 15,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,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,184,0,0,0,27,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, - 12,0,0,0,9,0,0,0,67,0,0,0,115,176,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,68,0,93, - 48,125,2,124,2,116,1,106,3,118,1,114,56,116,0,160, - 5,124,2,161,1,125,3,110,10,116,1,106,3,124,2,25, - 0,125,3,116,6,124,1,124,2,124,3,131,3,1,0,113, - 30,100,2,100,3,103,1,102,2,100,4,100,5,100,3,103, - 2,102,2,102,2,125,4,124,4,68,0,93,108,92,2,125, - 5,125,6,116,7,100,6,100,7,132,0,124,6,68,0,131, - 1,131,1,115,136,74,0,130,1,124,6,100,8,25,0,125, - 7,124,5,116,1,106,3,118,0,114,170,116,1,106,3,124, - 5,25,0,125,8,1,0,113,224,113,106,122,20,116,0,160, - 5,124,5,161,1,125,8,87,0,1,0,113,224,87,0,113, - 106,4,0,116,8,121,212,1,0,1,0,1,0,89,0,113, - 106,89,0,113,106,48,0,113,106,116,8,100,9,131,1,130, - 1,116,6,124,1,100,10,124,8,131,3,1,0,116,6,124, - 1,100,11,124,7,131,3,1,0,116,6,124,1,100,12,100, - 13,160,9,124,6,161,1,131,3,1,0,116,6,124,1,100, - 14,100,15,100,16,132,0,124,6,68,0,131,1,131,3,1, - 0,116,0,160,5,100,17,161,1,125,9,116,6,124,1,100, - 17,124,9,131,3,1,0,116,0,160,5,100,18,161,1,125, - 10,116,6,124,1,100,18,124,10,131,3,1,0,124,5,100, - 4,107,2,144,1,114,108,116,0,160,5,100,19,161,1,125, - 11,116,6,124,1,100,20,124,11,131,3,1,0,116,6,124, - 1,100,21,116,10,131,0,131,3,1,0,116,11,160,12,116, - 2,160,13,161,0,161,1,1,0,124,5,100,4,107,2,144, - 1,114,172,116,14,160,15,100,22,161,1,1,0,100,23,116, - 11,118,0,144,1,114,172,100,24,116,16,95,17,100,25,83, - 0,41,26,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,41,4,114,63,0,0,0,114,74,0,0,0,218,8, - 98,117,105,108,116,105,110,115,114,160,0,0,0,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,38,0,0,0,78,41,1, - 114,22,0,0,0,41,2,114,31,0,0,0,114,94,0,0, + 6,0,0,0,114,45,1,0,0,221,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,45,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,3,0,0,0,114,16,1,0,0, + 169,1,114,140,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,19,1,0,0,127,5,0,0,115,4,0,0,0,4, + 0,2,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,70,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,43,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,43,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,3,0,0,0,114, + 62,1,0,0,114,6,0,0,0,114,209,0,0,0,121,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, + 64,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,46,1,0,0,135,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,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,137,0,0,0,141,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, + 43,0,0,0,90,4,115,109,115,108,114,202,0,0,0,114, + 140,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,58,1,0,0,153,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,96,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,216, + 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,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,113,148,116,17, + 124,8,131,1,125,3,124,0,106,14,68,0,93,82,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,222, + 116,15,124,12,131,1,114,222,124,0,160,16,124,10,124,1, + 124,12,100,8,124,2,161,5,2,0,1,0,83,0,113,222, + 124,3,144,1,114,92,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,70,0,0,0,114,27,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,40,0,0, + 0,114,48,0,0,0,114,43,0,0,0,114,2,0,0,0, + 114,54,0,0,0,114,10,1,0,0,114,49,0,0,0,114, + 64,1,0,0,218,11,95,102,105,108,108,95,99,97,99,104, + 101,114,7,0,0,0,114,67,1,0,0,114,105,0,0,0, + 114,66,1,0,0,114,37,0,0,0,114,63,1,0,0,114, + 53,0,0,0,114,58,1,0,0,114,55,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,17,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,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,203,0,0,0, + 158,5,0,0,115,74,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,26,4,8,2,14,1,16,1,16,1,12,1,8, + 1,10,1,2,0,2,255,10,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,70,0,0,0,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,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,3,0,0, + 0,41,1,114,105,0,0,0,41,2,114,31,0,0,0,90, + 2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,9,60,115,101,116,99,111,109,112,62,235,5,0, + 0,115,4,0,0,0,6,0,2,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,43,0,0,0,114,2,0, + 0,0,114,7,1,0,0,114,54,0,0,0,114,3,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,8,0,0,0,114,9,0,0,0, + 114,10,0,0,0,114,65,1,0,0,114,66,1,0,0,114, + 100,0,0,0,114,61,0,0,0,114,105,0,0,0,218,3, + 97,100,100,114,11,0,0,0,114,67,1,0,0,41,9,114, + 118,0,0,0,114,43,0,0,0,114,8,1,0,0,90,21, + 108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110, + 116,101,110,116,115,114,41,1,0,0,114,116,0,0,0,114, + 29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110, + 97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,69,1,0,0,206,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,47,0,0,0,41,2,114, + 55,0,0,0,114,117,0,0,0,114,47,0,0,0,169,2, + 114,193,0,0,0,114,68,1,0,0,114,3,0,0,0,114, + 6,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,247,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,3,0,0,0,41,3,114,193,0,0, + 0,114,68,1,0,0,114,75,1,0,0,114,3,0,0,0, + 114,74,1,0,0,114,6,0,0,0,218,9,112,97,116,104, + 95,104,111,111,107,237,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,61,0,0,0,114,43, + 0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,39,1,0,0,255,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,46,1,0,0,114, + 143,0,0,0,114,206,0,0,0,114,137,0,0,0,114,58, + 1,0,0,114,203,0,0,0,114,69,1,0,0,114,207,0, + 0,0,114,76,1,0,0,114,39,1,0,0,114,3,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,19,1,0,0,63,6,0,0,115,4,0,0,0,4,0, - 2,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,72,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,2,0,0,0,114,34,0,0,0,114,30,0,0, - 0,114,39,0,0,0,114,57,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,73,0,0,0,114,3,0,0,0,41,2,114,31,0, - 0,0,218,1,115,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,114,70,1,0,0,79,6,0,0,115,4,0, - 0,0,6,0,2,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,90,7,95,116,104,114,101,97,100,90,8,95,119,101,97, - 107,114,101,102,90,6,119,105,110,114,101,103,114,192,0,0, - 0,114,7,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,8,0, - 0,0,114,163,0,0,0,114,31,1,0,0,114,125,0,0, - 0,90,18,95,98,117,105,108,116,105,110,95,102,114,111,109, - 95,110,97,109,101,114,129,0,0,0,218,3,97,108,108,114, - 117,0,0,0,114,35,0,0,0,114,13,0,0,0,114,21, - 1,0,0,114,167,0,0,0,114,82,1,0,0,114,101,0, - 0,0,114,186,0,0,0,114,191,0,0,0,114,195,0,0, - 0,41,12,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,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,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,30,0,0,0,114,34, - 0,0,0,90,9,111,115,95,109,111,100,117,108,101,90,13, - 116,104,114,101,97,100,95,109,111,100,117,108,101,90,14,119, - 101,97,107,114,101,102,95,109,111,100,117,108,101,90,13,119, - 105,110,114,101,103,95,109,111,100,117,108,101,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,6,95,115,101, - 116,117,112,38,6,0,0,115,78,0,0,0,0,8,4,1, - 6,1,6,3,10,1,8,1,10,1,12,2,10,1,14,3, - 22,1,12,2,22,1,8,1,10,1,10,1,6,2,2,1, - 10,1,10,1,12,1,12,2,8,1,12,1,12,1,18,1, - 22,3,10,1,12,3,10,1,12,3,10,1,10,1,12,3, - 14,1,14,1,10,1,10,1,10,1,114,89,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, - 89,1,0,0,114,184,0,0,0,114,8,0,0,0,114,51, - 1,0,0,114,167,0,0,0,114,61,1,0,0,114,76,1, - 0,0,218,9,109,101,116,97,95,112,97,116,104,114,186,0, - 0,0,114,45,1,0,0,41,2,114,88,1,0,0,90,17, - 115,117,112,112,111,114,116,101,100,95,108,111,97,100,101,114, + 114,61,1,0,0,112,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,61,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,62,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,15,1,0,0,114,9,1,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,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120, + 95,117,112,95,109,111,100,117,108,101,5,6,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,81,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,9,1,0,0,114,101,0,0,0,114,15,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,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,184,0,0,0,28,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,12,0,0,0, + 9,0,0,0,67,0,0,0,115,176,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,68,0,93,48,125,2,124, + 2,116,1,106,3,118,1,114,56,116,0,160,5,124,2,161, + 1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116, + 6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100, + 3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102, + 2,125,4,124,4,68,0,93,108,92,2,125,5,125,6,116, + 7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115, + 136,74,0,130,1,124,6,100,8,25,0,125,7,124,5,116, + 1,106,3,118,0,114,170,116,1,106,3,124,5,25,0,125, + 8,1,0,113,224,113,106,122,20,116,0,160,5,124,5,161, + 1,125,8,87,0,1,0,113,224,87,0,113,106,4,0,116, + 8,121,212,1,0,1,0,1,0,89,0,113,106,89,0,113, + 106,48,0,113,106,116,8,100,9,131,1,130,1,116,6,124, + 1,100,10,124,8,131,3,1,0,116,6,124,1,100,11,124, + 7,131,3,1,0,116,6,124,1,100,12,100,13,160,9,124, + 6,161,1,131,3,1,0,116,6,124,1,100,14,100,15,100, + 16,132,0,124,6,68,0,131,1,131,3,1,0,116,0,160, + 5,100,17,161,1,125,9,116,6,124,1,100,17,124,9,131, + 3,1,0,116,0,160,5,100,18,161,1,125,10,116,6,124, + 1,100,18,124,10,131,3,1,0,124,5,100,4,107,2,144, + 1,114,108,116,0,160,5,100,19,161,1,125,11,116,6,124, + 1,100,20,124,11,131,3,1,0,116,6,124,1,100,21,116, + 10,131,0,131,3,1,0,116,11,160,12,116,2,160,13,161, + 0,161,1,1,0,124,5,100,4,107,2,144,1,114,172,116, + 14,160,15,100,22,161,1,1,0,100,23,116,11,118,0,144, + 1,114,172,100,24,116,16,95,17,100,25,83,0,41,26,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,41,4, + 114,63,0,0,0,114,74,0,0,0,218,8,98,117,105,108, + 116,105,110,115,114,160,0,0,0,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,38,0,0,0,78,41,1,114,22,0,0, + 0,41,2,114,31,0,0,0,114,94,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,19,1,0, + 0,64,6,0,0,115,4,0,0,0,4,0,2,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,72,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,2, + 0,0,0,114,34,0,0,0,114,30,0,0,0,114,39,0, + 0,0,114,57,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,73,0, + 0,0,114,3,0,0,0,41,2,114,31,0,0,0,218,1, 115,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,95,105,110,115,116,97,108,108,103,6,0,0,115,8, - 0,0,0,0,2,8,1,6,1,20,1,114,91,1,0,0, - 41,1,114,59,0,0,0,41,1,78,41,3,78,78,78,41, - 2,114,72,0,0,0,114,72,0,0,0,41,1,84,41,1, - 78,41,1,78,41,63,114,127,0,0,0,114,12,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,11,0,0,0,114,13,0,0, - 0,114,20,0,0,0,114,26,0,0,0,114,28,0,0,0, - 114,37,0,0,0,114,46,0,0,0,114,48,0,0,0,114, - 52,0,0,0,114,53,0,0,0,114,55,0,0,0,114,58, - 0,0,0,114,68,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,18,0, - 0,0,114,148,0,0,0,114,17,0,0,0,114,23,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,9,1,0, - 0,114,15,1,0,0,114,21,1,0,0,114,252,0,0,0, - 114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114, - 61,1,0,0,114,81,1,0,0,114,184,0,0,0,114,89, - 1,0,0,114,91,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,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,19,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,72,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,65, + 114,70,1,0,0,80,6,0,0,115,4,0,0,0,6,0, + 2,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,90,7,95, + 116,104,114,101,97,100,90,8,95,119,101,97,107,114,101,102, + 90,6,119,105,110,114,101,103,114,192,0,0,0,114,7,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,8,0,0,0,114,163, + 0,0,0,114,31,1,0,0,114,125,0,0,0,90,18,95, + 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, + 101,114,129,0,0,0,218,3,97,108,108,114,117,0,0,0, + 114,35,0,0,0,114,13,0,0,0,114,21,1,0,0,114, + 167,0,0,0,114,82,1,0,0,114,101,0,0,0,114,186, + 0,0,0,114,191,0,0,0,114,195,0,0,0,41,12,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, + 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,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,30,0,0,0,114,34,0,0,0,90, + 9,111,115,95,109,111,100,117,108,101,90,13,116,104,114,101, + 97,100,95,109,111,100,117,108,101,90,14,119,101,97,107,114, + 101,102,95,109,111,100,117,108,101,90,13,119,105,110,114,101, + 103,95,109,111,100,117,108,101,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,6,95,115,101,116,117,112,39, + 6,0,0,115,78,0,0,0,0,8,4,1,6,1,6,3, + 10,1,8,1,10,1,12,2,10,1,14,3,22,1,12,2, + 22,1,8,1,10,1,10,1,6,2,2,1,10,1,10,1, + 12,1,12,2,8,1,12,1,12,1,18,1,22,3,10,1, + 12,3,10,1,12,3,10,1,10,1,12,3,14,1,14,1, + 10,1,10,1,10,1,114,89,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,89,1,0,0, + 114,184,0,0,0,114,8,0,0,0,114,51,1,0,0,114, + 167,0,0,0,114,61,1,0,0,114,76,1,0,0,218,9, + 109,101,116,97,95,112,97,116,104,114,186,0,0,0,114,45, + 1,0,0,41,2,114,88,1,0,0,90,17,115,117,112,112, + 111,114,116,101,100,95,108,111,97,100,101,114,115,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,105, + 110,115,116,97,108,108,104,6,0,0,115,8,0,0,0,0, + 2,8,1,6,1,20,1,114,91,1,0,0,41,1,114,59, + 0,0,0,41,1,78,41,3,78,78,78,41,2,114,72,0, + 0,0,114,72,0,0,0,41,1,84,41,1,78,41,1,78, + 41,63,114,127,0,0,0,114,12,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,11,0,0,0,114,13,0,0,0,114,20,0, + 0,0,114,26,0,0,0,114,28,0,0,0,114,37,0,0, + 0,114,46,0,0,0,114,48,0,0,0,114,52,0,0,0, + 114,53,0,0,0,114,55,0,0,0,114,58,0,0,0,114, + 68,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,18,0,0,0,114,148, + 0,0,0,114,17,0,0,0,114,23,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,9,1,0,0,114,15,1, + 0,0,114,21,1,0,0,114,252,0,0,0,114,22,1,0, + 0,114,43,1,0,0,114,45,1,0,0,114,61,1,0,0, + 114,81,1,0,0,114,184,0,0,0,114,89,1,0,0,114, + 91,1,0,0,114,3,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,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,20,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,72,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,65, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index d413bab0de4..538fdbe3e0b 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -149,8 +149,8 @@ static void *opcode_targets[256] = { &&TARGET_MAP_ADD, &&TARGET_LOAD_CLASSDEREF, &&_unknown_opcode, - &&TARGET_BUILD_MAP_UNPACK, - &&TARGET_BUILD_MAP_UNPACK_WITH_CALL, + &&_unknown_opcode, + &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, &&TARGET_SETUP_ASYNC_WITH, @@ -163,8 +163,8 @@ static void *opcode_targets[256] = { &&TARGET_CALL_METHOD, &&TARGET_LIST_EXTEND, &&TARGET_SET_UPDATE, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_DICT_MERGE, + &&TARGET_DICT_UPDATE, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, From 997443c14cc29e5616b9f3d7c337e89fda60de11 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Mon, 27 Jan 2020 04:08:39 -0800 Subject: [PATCH 215/380] Fix so that test.test_distutils can be executed by unittest and not just regrtest (GH-13480) --- Lib/test/test_distutils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Lib/test/test_distutils.py b/Lib/test/test_distutils.py index d613abe453b..a37f1179175 100644 --- a/Lib/test/test_distutils.py +++ b/Lib/test/test_distutils.py @@ -10,9 +10,15 @@ import test.support def test_main(): + # used by regrtest test.support.run_unittest(distutils.tests.test_suite()) test.support.reap_children() +def load_tests(*_): + # used by unittest + return distutils.tests.test_suite() + + if __name__ == "__main__": test_main() From c7dd3c7d87d6961756d99b57aa13db7c7a03e1f8 Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Mon, 27 Jan 2020 14:11:19 +0000 Subject: [PATCH 216/380] Use relative imports in mock and its tests to help backporting (GH-18197) * asyncio.run only available in 3.8+ * iscoroutinefunction has important bungfixes in 3.8 * IsolatedAsyncioTestCase only available in 3.8+ --- Lib/unittest/mock.py | 17 +-- Lib/unittest/test/testmock/testasync.py | 134 +++++++++--------- .../test/testmock/testmagicmethods.py | 10 +- 3 files changed, 82 insertions(+), 79 deletions(-) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 1acafc51df1..a3d8b6eab41 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -30,6 +30,7 @@ import inspect import pprint import sys import builtins +from asyncio import iscoroutinefunction from types import CodeType, ModuleType, MethodType from unittest.util import safe_repr from functools import wraps, partial @@ -48,12 +49,12 @@ def _is_async_obj(obj): return False if hasattr(obj, '__func__'): obj = getattr(obj, '__func__') - return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj) + return iscoroutinefunction(obj) or inspect.isawaitable(obj) def _is_async_func(func): if getattr(func, '__code__', None): - return asyncio.iscoroutinefunction(func) + return iscoroutinefunction(func) else: return False @@ -488,7 +489,7 @@ class NonCallableMock(Base): _spec_asyncs = [] for attr in dir(spec): - if asyncio.iscoroutinefunction(getattr(spec, attr, None)): + if iscoroutinefunction(getattr(spec, attr, None)): _spec_asyncs.append(attr) if spec is not None and not _is_list(spec): @@ -2152,7 +2153,7 @@ class AsyncMockMixin(Base): def __init__(self, /, *args, **kwargs): super().__init__(*args, **kwargs) - # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an + # iscoroutinefunction() checks _is_coroutine property to say if an # object is a coroutine. Without this check it looks to see if it is a # function/method, which in this case it is not (since it is an # AsyncMock). @@ -2188,7 +2189,7 @@ class AsyncMockMixin(Base): raise StopAsyncIteration if _is_exception(result): raise result - elif asyncio.iscoroutinefunction(effect): + elif iscoroutinefunction(effect): result = await effect(*args, **kwargs) else: result = effect(*args, **kwargs) @@ -2200,7 +2201,7 @@ class AsyncMockMixin(Base): return self.return_value if self._mock_wraps is not None: - if asyncio.iscoroutinefunction(self._mock_wraps): + if iscoroutinefunction(self._mock_wraps): return await self._mock_wraps(*args, **kwargs) return self._mock_wraps(*args, **kwargs) @@ -2337,7 +2338,7 @@ class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): recognized as an async function, and the result of a call is an awaitable: >>> mock = AsyncMock() - >>> asyncio.iscoroutinefunction(mock) + >>> iscoroutinefunction(mock) True >>> inspect.isawaitable(mock()) True @@ -2710,7 +2711,7 @@ def create_autospec(spec, spec_set=False, instance=False, _parent=None, skipfirst = _must_skip(spec, entry, is_type) kwargs['_eat_self'] = skipfirst - if asyncio.iscoroutinefunction(original): + if iscoroutinefunction(original): child_klass = AsyncMock else: child_klass = MagicMock diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 43b87498ef3..6cba42727af 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -3,6 +3,8 @@ import inspect import re import unittest +from asyncio import run, iscoroutinefunction +from unittest import IsolatedAsyncioTestCase from unittest.mock import (ANY, call, AsyncMock, patch, MagicMock, Mock, create_autospec, sentinel, _CallList) @@ -54,7 +56,7 @@ class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') def test_async(mock_method): - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() def test_is_async_patch(self): @@ -62,13 +64,13 @@ class AsyncPatchDecoratorTest(unittest.TestCase): def test_async(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) @patch(f'{async_foo_name}.async_method') def test_no_parent_attribute(mock_method): m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() test_no_parent_attribute() @@ -107,7 +109,7 @@ class AsyncPatchDecoratorTest(unittest.TestCase): self.assertEqual(await async_func(), 1) self.assertEqual(await async_func_args(1, 2, c=3), 2) - asyncio.run(test_async()) + run(test_async()) self.assertTrue(inspect.iscoroutinefunction(async_func)) @@ -115,7 +117,7 @@ class AsyncPatchCMTest(unittest.TestCase): def test_is_async_function_cm(self): def test_async(): with patch.object(AsyncClass, 'async_method') as mock_method: - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) test_async() @@ -124,7 +126,7 @@ class AsyncPatchCMTest(unittest.TestCase): with patch.object(AsyncClass, 'async_method') as mock_method: m = mock_method() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) test_async() @@ -141,31 +143,31 @@ class AsyncPatchCMTest(unittest.TestCase): self.assertIsInstance(async_func, AsyncMock) self.assertTrue(inspect.iscoroutinefunction(async_func)) - asyncio.run(test_async()) + run(test_async()) class AsyncMockTest(unittest.TestCase): def test_iscoroutinefunction_default(self): mock = AsyncMock() - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) def test_iscoroutinefunction_function(self): async def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_isawaitable(self): mock = AsyncMock() m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) self.assertIn('assert_awaited', dir(mock)) def test_iscoroutinefunction_normal_function(self): def foo(): pass mock = AsyncMock(foo) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertTrue(inspect.iscoroutinefunction(mock)) def test_future_isfuture(self): @@ -211,9 +213,9 @@ class AsyncAutospecTest(unittest.TestCase): self.assertEqual(spec.await_args_list, []) spec.assert_not_awaited() - asyncio.run(main()) + run(main()) - self.assertTrue(asyncio.iscoroutinefunction(spec)) + self.assertTrue(iscoroutinefunction(spec)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertEqual(spec.await_count, 1) self.assertEqual(spec.await_args, call(1, 2, c=3)) @@ -234,7 +236,7 @@ class AsyncAutospecTest(unittest.TestCase): awaitable = mock_method(1, 2, c=3) self.assertIsInstance(mock_method.mock, AsyncMock) - self.assertTrue(asyncio.iscoroutinefunction(mock_method)) + self.assertTrue(iscoroutinefunction(mock_method)) self.assertTrue(asyncio.iscoroutine(awaitable)) self.assertTrue(inspect.isawaitable(awaitable)) @@ -259,7 +261,7 @@ class AsyncAutospecTest(unittest.TestCase): self.assertIsNone(mock_method.await_args) self.assertEqual(mock_method.await_args_list, []) - asyncio.run(test_async()) + run(test_async()) class AsyncSpecTest(unittest.TestCase): @@ -313,14 +315,14 @@ class AsyncSpecTest(unittest.TestCase): self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_as_normal_positional_AsyncMock(self): mock = AsyncMock(normal_func) self.assertIsInstance(mock, AsyncMock) m = mock() self.assertTrue(inspect.isawaitable(m)) - asyncio.run(m) + run(m) def test_spec_async_mock(self): @patch.object(AsyncClass, 'async_method', spec=True) @@ -370,13 +372,13 @@ class AsyncSpecSetTest(unittest.TestCase): def test_is_async_AsyncMock(self): mock = AsyncMock(spec_set=AsyncClass.async_method) - self.assertTrue(asyncio.iscoroutinefunction(mock)) + self.assertTrue(iscoroutinefunction(mock)) self.assertIsInstance(mock, AsyncMock) def test_is_child_AsyncMock(self): mock = MagicMock(spec_set=AsyncClass) - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) - self.assertFalse(asyncio.iscoroutinefunction(mock.normal_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) + self.assertFalse(iscoroutinefunction(mock.normal_method)) self.assertIsInstance(mock.async_method, AsyncMock) self.assertIsInstance(mock.normal_method, MagicMock) self.assertIsInstance(mock, MagicMock) @@ -389,7 +391,7 @@ class AsyncSpecSetTest(unittest.TestCase): self.assertIsInstance(cm, MagicMock) -class AsyncArguments(unittest.IsolatedAsyncioTestCase): +class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): async def addition(self, var): return var + 1 @@ -536,8 +538,8 @@ class AsyncMagicMethods(unittest.TestCase): self.assertIsInstance(m_mock.__aenter__, AsyncMock) self.assertIsInstance(m_mock.__aexit__, AsyncMock) # AsyncMocks are also coroutine functions - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aenter__)) - self.assertTrue(asyncio.iscoroutinefunction(m_mock.__aexit__)) + self.assertTrue(iscoroutinefunction(m_mock.__aenter__)) + self.assertTrue(iscoroutinefunction(m_mock.__aexit__)) class AsyncContextManagerTest(unittest.TestCase): @@ -574,7 +576,7 @@ class AsyncContextManagerTest(unittest.TestCase): response.json = AsyncMock(return_value={'json': 123}) cm.__aenter__.return_value = response pc.session.post.return_value = cm - result = asyncio.run(pc.main()) + result = run(pc.main()) self.assertEqual(result, {'json': 123}) for mock_type in [AsyncMock, MagicMock]: @@ -593,7 +595,7 @@ class AsyncContextManagerTest(unittest.TestCase): called = True return result - cm_result = asyncio.run(use_context_manager()) + cm_result = run(use_context_manager()) self.assertTrue(called) self.assertTrue(cm_mock.__aenter__.called) self.assertTrue(cm_mock.__aexit__.called) @@ -618,7 +620,7 @@ class AsyncContextManagerTest(unittest.TestCase): async with mock_instance as result: return result - self.assertIs(asyncio.run(use_context_manager()), expected_result) + self.assertIs(run(use_context_manager()), expected_result) def test_mock_customize_async_context_manager_with_coroutine(self): enter_called = False @@ -642,7 +644,7 @@ class AsyncContextManagerTest(unittest.TestCase): async with mock_instance: pass - asyncio.run(use_context_manager()) + run(use_context_manager()) self.assertTrue(enter_called) self.assertTrue(exit_called) @@ -654,7 +656,7 @@ class AsyncContextManagerTest(unittest.TestCase): instance = self.WithAsyncContextManager() mock_instance = MagicMock(instance) with self.assertRaises(TypeError): - asyncio.run(raise_in(mock_instance)) + run(raise_in(mock_instance)) class AsyncIteratorTest(unittest.TestCase): @@ -678,7 +680,7 @@ class AsyncIteratorTest(unittest.TestCase): mock_iter.__aiter__.return_value = [1, 2, 3] async def main(): return [i async for i in mock_iter] - result = asyncio.run(main()) + result = run(main()) self.assertEqual(result, [1, 2, 3]) def test_mock_aiter_and_anext_asyncmock(self): @@ -687,11 +689,11 @@ class AsyncIteratorTest(unittest.TestCase): mock_instance = mock_type(instance) # Check that the mock and the real thing bahave the same # __aiter__ is not actually async, so not a coroutinefunction - self.assertFalse(asyncio.iscoroutinefunction(instance.__aiter__)) - self.assertFalse(asyncio.iscoroutinefunction(mock_instance.__aiter__)) + self.assertFalse(iscoroutinefunction(instance.__aiter__)) + self.assertFalse(iscoroutinefunction(mock_instance.__aiter__)) # __anext__ is async - self.assertTrue(asyncio.iscoroutinefunction(instance.__anext__)) - self.assertTrue(asyncio.iscoroutinefunction(mock_instance.__anext__)) + self.assertTrue(iscoroutinefunction(instance.__anext__)) + self.assertTrue(iscoroutinefunction(mock_instance.__anext__)) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"test aiter and anext corourtine with {mock_type}"): @@ -709,18 +711,18 @@ class AsyncIteratorTest(unittest.TestCase): expected = ["FOO", "BAR", "BAZ"] def test_default(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) - self.assertEqual(asyncio.run(iterate(mock_instance)), []) + self.assertEqual(run(iterate(mock_instance)), []) def test_set_return_value(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = expected[:] - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) def test_set_return_value_iter(mock_type): mock_instance = mock_type(self.WithAsyncIterator()) mock_instance.__aiter__.return_value = iter(expected[:]) - self.assertEqual(asyncio.run(iterate(mock_instance)), expected) + self.assertEqual(run(iterate(mock_instance)), expected) for mock_type in [AsyncMock, MagicMock]: with self.subTest(f"default value with {mock_type}"): @@ -748,7 +750,7 @@ class AsyncMockAssert(unittest.TestCase): with self.assertWarns(RuntimeWarning): # Will raise a warning because never awaited mock.async_method() - self.assertTrue(asyncio.iscoroutinefunction(mock.async_method)) + self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() mock.async_method.assert_called_once() mock.async_method.assert_called_once_with() @@ -766,7 +768,7 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() - asyncio.run(self._await_coroutine(mock_coroutine)) + run(self._await_coroutine(mock_coroutine)) # Assert we haven't re-called the function mock.async_method.assert_called_once() mock.async_method.assert_awaited() @@ -780,7 +782,7 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_called() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_called_once() self.mock.assert_awaited_once() @@ -794,7 +796,7 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): mock.async_method.assert_awaited() mock.async_method.assert_called() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() mock.async_method.assert_awaited_once() @@ -802,10 +804,10 @@ class AsyncMockAssert(unittest.TestCase): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() mock.async_method.assert_called_once() - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) with self.assertRaises(RuntimeError): # Cannot reuse already awaited coroutine - asyncio.run(self._await_coroutine(coroutine)) + run(self._await_coroutine(coroutine)) mock.async_method.assert_awaited() def test_assert_awaited_but_not_called(self): @@ -815,7 +817,7 @@ class AsyncMockAssert(unittest.TestCase): self.mock.assert_called() with self.assertRaises(TypeError): # You cannot await an AsyncMock, it must be a coroutine - asyncio.run(self._await_coroutine(self.mock)) + run(self._await_coroutine(self.mock)) with self.assertRaises(AssertionError): self.mock.assert_awaited() @@ -909,17 +911,17 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited() def test_assert_awaited_once(self): with self.assertRaises(AssertionError): self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) self.mock.assert_awaited_once() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_awaited_once() @@ -928,15 +930,15 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test()) + run(self._runnable_test()) msg = 'expected await not found' with self.assertRaisesRegex(AssertionError, msg): self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_with('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) with self.assertRaises(AssertionError): self.mock.assert_awaited_with('foo') @@ -944,10 +946,10 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_awaited_once_with('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_awaited_once_with('foo') @@ -955,14 +957,14 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_any_await('foo') - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_any_await('foo') def test_assert_has_awaits_no_order(self): @@ -972,25 +974,25 @@ class AsyncMockAssert(unittest.TestCase): self.mock.assert_has_awaits(calls) self.assertEqual(len(cm.exception.args), 1) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) self.mock.assert_has_awaits(calls) - asyncio.run(self._runnable_test('SomethingElse')) + run(self._runnable_test('SomethingElse')) self.mock.assert_has_awaits(calls) def test_awaits_asserts_with_any(self): class Foo: def __eq__(self, other): pass - asyncio.run(self._runnable_test(Foo(), 1)) + run(self._runnable_test(Foo(), 1)) self.mock.assert_has_awaits([call(ANY, 1)]) self.mock.assert_awaited_with(ANY, 1) @@ -1005,7 +1007,7 @@ class AsyncMockAssert(unittest.TestCase): async def _custom_mock_runnable_test(*args): await mock_with_spec(*args) - asyncio.run(_custom_mock_runnable_test(Foo(), 1)) + run(_custom_mock_runnable_test(Foo(), 1)) mock_with_spec.assert_has_awaits([call(ANY, 1)]) mock_with_spec.assert_awaited_with(ANY, 1) mock_with_spec.assert_any_await(ANY, 1) @@ -1015,24 +1017,24 @@ class AsyncMockAssert(unittest.TestCase): with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('baz')) + run(self._runnable_test('baz')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('bamf')) + run(self._runnable_test('bamf')) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('foo')) + run(self._runnable_test('foo')) self.mock.assert_has_awaits(calls, any_order=True) - asyncio.run(self._runnable_test('qux')) + run(self._runnable_test('qux')) self.mock.assert_has_awaits(calls, any_order=True) def test_assert_not_awaited(self): self.mock.assert_not_awaited() - asyncio.run(self._runnable_test()) + run(self._runnable_test()) with self.assertRaises(AssertionError): self.mock.assert_not_awaited() @@ -1040,7 +1042,7 @@ class AsyncMockAssert(unittest.TestCase): async def f(x=None): pass self.mock = AsyncMock(spec=f) - asyncio.run(self._runnable_test(1)) + run(self._runnable_test(1)) with self.assertRaisesRegex( AssertionError, diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 76b3a560de0..5690f7a6bbb 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,8 +1,8 @@ -import asyncio import math import unittest import os import sys +from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -286,8 +286,8 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) @@ -312,8 +312,8 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(math.trunc(mock), mock.__trunc__()) self.assertEqual(math.floor(mock), mock.__floor__()) self.assertEqual(math.ceil(mock), mock.__ceil__()) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aexit__)) - self.assertTrue(asyncio.iscoroutinefunction(mock.__aenter__)) + self.assertTrue(iscoroutinefunction(mock.__aexit__)) + self.assertTrue(iscoroutinefunction(mock.__aenter__)) self.assertIsInstance(mock.__aenter__, AsyncMock) self.assertIsInstance(mock.__aexit__, AsyncMock) From a46575a8f2ded8b49e26c25bb67192e1500e76ca Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Mon, 27 Jan 2020 14:55:56 +0000 Subject: [PATCH 217/380] Clarify and fix assertions that mocks have not been awaited (GH-18196) - The gc.collect is needed for other implementations, such as pypy - Using context managers over multiple lines will only catch the warning from the first line in the context! - remove a skip for a test that no longer fails on pypy --- Lib/unittest/test/testmock/testasync.py | 55 ++++++++++--------- .../test/testmock/testmagicmethods.py | 2 - 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 6cba42727af..992076db787 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -1,7 +1,9 @@ import asyncio +import gc import inspect import re import unittest +from contextlib import contextmanager from asyncio import run, iscoroutinefunction from unittest import IsolatedAsyncioTestCase @@ -52,6 +54,15 @@ async_foo_name = f'{__name__}.AsyncClass' normal_foo_name = f'{__name__}.NormalClass' +@contextmanager +def assertNeverAwaited(test): + with test.assertWarnsRegex(RuntimeWarning, "was never awaited$"): + yield + # In non-CPython implementations of Python, this is needed because timely + # deallocation is not guaranteed by the garbage collector. + gc.collect() + + class AsyncPatchDecoratorTest(unittest.TestCase): def test_is_coroutine_function_patch(self): @patch.object(AsyncClass, 'async_method') @@ -284,8 +295,7 @@ class AsyncSpecTest(unittest.TestCase): def inner_test(mock_type): async_mock = mock_type(spec=async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(spec=normal_func) @@ -299,8 +309,7 @@ class AsyncSpecTest(unittest.TestCase): def inner_test(mock_type): async_mock = mock_type(async_func) self.assertIsInstance(async_mock, mock_type) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.assertTrue(inspect.isawaitable(async_mock())) sync_mock = mock_type(normal_func) @@ -747,8 +756,7 @@ class AsyncMockAssert(unittest.TestCase): def test_assert_called_but_not_awaited(self): mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): mock.async_method() self.assertTrue(iscoroutinefunction(mock.async_method)) mock.async_method.assert_called() @@ -789,9 +797,9 @@ class AsyncMockAssert(unittest.TestCase): def test_assert_called_twice_and_awaited_once(self): mock = AsyncMock(AsyncClass) coroutine = mock.async_method() - with self.assertWarns(RuntimeWarning): - # The first call will be awaited so no warning there - # But this call will never get awaited, so it will warn here + # The first call will be awaited so no warning there + # But this call will never get awaited, so it will warn here + with assertNeverAwaited(self): mock.async_method() with self.assertRaises(AssertionError): mock.async_method.assert_awaited() @@ -826,38 +834,34 @@ class AsyncMockAssert(unittest.TestCase): def test_assert_has_calls_not_awaits(self): kalls = [call('foo')] - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') self.mock.assert_has_calls(kalls) with self.assertRaises(AssertionError): self.mock.assert_has_awaits(kalls) def test_assert_has_mock_calls_on_async_mock_no_spec(self): - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock() kalls_empty = [('', (), {})] self.assertEqual(self.mock.mock_calls, kalls_empty) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): self.mock('foo') + with assertNeverAwaited(self): self.mock('baz') mock_kalls = ([call(), call('foo'), call('baz')]) self.assertEqual(self.mock.mock_calls, mock_kalls) def test_assert_has_mock_calls_on_async_mock_with_spec(self): a_class_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method() kalls_empty = [('', (), {})] self.assertEqual(a_class_mock.async_method.mock_calls, kalls_empty) self.assertEqual(a_class_mock.mock_calls, [call.async_method()]) - with self.assertWarns(RuntimeWarning): - # Will raise a warning because never awaited + with assertNeverAwaited(self): a_class_mock.async_method(1, 2, 3, a=4, b=5) method_kalls = [call(), call(1, 2, 3, a=4, b=5)] mock_kalls = [call.async_method(), call.async_method(1, 2, 3, a=4, b=5)] @@ -865,9 +869,9 @@ class AsyncMockAssert(unittest.TestCase): self.assertEqual(a_class_mock.mock_calls, mock_kalls) def test_async_method_calls_recorded(self): - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock.something(3, fish=None) + with assertNeverAwaited(self): self.mock.something_else.something(6, cake=sentinel.Cake) self.assertEqual(self.mock.method_calls, [ @@ -889,19 +893,20 @@ class AsyncMockAssert(unittest.TestCase): self.assertEqual(attr, []) assert_attrs(self.mock) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): self.mock() + with assertNeverAwaited(self): self.mock(1, 2) + with assertNeverAwaited(self): self.mock(a=3) self.mock.reset_mock() assert_attrs(self.mock) a_mock = AsyncMock(AsyncClass) - with self.assertWarns(RuntimeWarning): - # Will raise warnings because never awaited + with assertNeverAwaited(self): a_mock.async_method() + with assertNeverAwaited(self): a_mock.async_method(1, a=3) a_mock.reset_mock() diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 5690f7a6bbb..a4feae7e9d3 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,7 +1,6 @@ import math import unittest import os -import sys from asyncio import iscoroutinefunction from unittest.mock import AsyncMock, Mock, MagicMock, _magics @@ -429,7 +428,6 @@ class TestMockingMagicMethods(unittest.TestCase): self.assertEqual(dir(mock), ['foo']) - @unittest.skipIf('PyPy' in sys.version, "This fails differently on pypy") def test_bound_methods(self): m = Mock() From 4dbf2d8c6789a9b7299b142033073213604b8fdc Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 28 Jan 2020 00:02:23 +0900 Subject: [PATCH 218/380] bpo-39453: Make list.__contains__ hold strong references to avoid crashes (GH-18181) --- Lib/test/test_list.py | 5 +++++ .../2020-01-25-23-51-17.bpo-39453.xCOkYk.rst | 2 ++ Objects/listobject.c | 7 ++++++- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 6e3c4c10930..33a55f76d9b 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -221,6 +221,11 @@ class ListTest(list_tests.CommonTest): with self.assertRaises(ValueError): lst.remove(lst) + # bpo-39453: list.__contains__ was not holding strong references + # to list elements while calling PyObject_RichCompareBool(). + lst = [X(), X()] + 3 in lst + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst new file mode 100644 index 00000000000..8c2e49f9474 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-25-23-51-17.bpo-39453.xCOkYk.rst @@ -0,0 +1,2 @@ +Fixed a possible crash in :meth:`list.__contains__` when a list is changed +during comparing items. Patch by Dong-hee Na. diff --git a/Objects/listobject.c b/Objects/listobject.c index a4e90dbf90c..38055d5f5f3 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -445,11 +445,16 @@ list_length(PyListObject *a) static int list_contains(PyListObject *a, PyObject *el) { + PyObject *item; Py_ssize_t i; int cmp; - for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) + for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { + item = PyList_GET_ITEM(a, i); + Py_INCREF(item); cmp = PyObject_RichCompareBool(PyList_GET_ITEM(a, i), el, Py_EQ); + Py_DECREF(item); + } return cmp; } From 7023288dc500008609e7a4d12ae710c2093c3fc6 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Tue, 28 Jan 2020 02:05:03 +1000 Subject: [PATCH 219/380] Ignore NEWS snippets in code coverage stats (GH-18194) --- .github/codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index 9d97dfbc43f..ea504f48672 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -5,7 +5,7 @@ codecov: comment: off ignore: - "Doc/**/*" - - "Misc/*" + - "Misc/**/*" - "Mac/**/*" - "PC/**/*" - "PCbuild/**/*" From 9e1ed518a576897f914227bf538bac426a02a081 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 28 Jan 2020 02:04:25 +0900 Subject: [PATCH 220/380] bpo-39453: Add testcase for bpo-39453 (GH-18202) https://bugs.python.org/issue39453 Automerge-Triggered-By: @pablogsal Automerge-Triggered-By: @pablogsal --- Lib/test/test_list.py | 2 ++ Objects/listobject.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py index 33a55f76d9b..3c8d82958fd 100644 --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -225,6 +225,8 @@ class ListTest(list_tests.CommonTest): # to list elements while calling PyObject_RichCompareBool(). lst = [X(), X()] 3 in lst + lst = [X(), X()] + X() in lst if __name__ == "__main__": diff --git a/Objects/listobject.c b/Objects/listobject.c index 38055d5f5f3..2c07ceb0d41 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -452,7 +452,7 @@ list_contains(PyListObject *a, PyObject *el) for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) { item = PyList_GET_ITEM(a, i); Py_INCREF(item); - cmp = PyObject_RichCompareBool(PyList_GET_ITEM(a, i), el, Py_EQ); + cmp = PyObject_RichCompareBool(item, el, Py_EQ); Py_DECREF(item); } return cmp; From 4a46adc7746930c4589ee483cad88d3f8504c045 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 18:06:42 +0100 Subject: [PATCH 221/380] bpo-39459: test.pythoninfo logs effective uid/gid (GH-18203) Fix also umask formatting: use octal prefix. --- Lib/test/pythoninfo.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index eab82c3631f..cc230dd2297 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -199,11 +199,19 @@ def collect_os(info_add): ) copy_attributes(info_add, os, 'os.%s', attributes, formatter=format_attr) - call_func(info_add, 'os.getcwd', os, 'getcwd') - - call_func(info_add, 'os.getuid', os, 'getuid') - call_func(info_add, 'os.getgid', os, 'getgid') - call_func(info_add, 'os.uname', os, 'uname') + for func in ( + 'cpu_count', + 'getcwd', + 'getegid', + 'geteuid', + 'getgid', + 'getloadavg', + 'getresgid', + 'getresuid', + 'getuid', + 'uname', + ): + call_func(info_add, 'os.%s' % func, os, func) def format_groups(groups): return ', '.join(map(str, groups)) @@ -220,9 +228,6 @@ def collect_os(info_add): else: info_add("os.login", login) - call_func(info_add, 'os.cpu_count', os, 'cpu_count') - call_func(info_add, 'os.getloadavg', os, 'getloadavg') - # Environment variables used by the stdlib and tests. Don't log the full # environment: filter to list to not leak sensitive information. # @@ -303,7 +308,7 @@ def collect_os(info_add): if hasattr(os, 'umask'): mask = os.umask(0) os.umask(mask) - info_add("os.umask", '%03o' % mask) + info_add("os.umask", '0o%03o' % mask) def collect_pwd(info_add): From a94c6b61aa5c09237b8105e5aee638cd54197b6f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 22:37:05 +0100 Subject: [PATCH 222/380] bpo-38631: Avoid Py_FatalError() in PyModule_Create2() (GH-18212) If PyModule_Create2() is called when the Python import machinery is not initialized, it now raises a SystemError and returns NULL, instead of calling Py_FatalError() which aborts the process. The caller must be prepared to handle NULL anyway. --- Objects/moduleobject.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 03c7381311a..912c2584015 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -173,8 +173,11 @@ _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) PyObject * PyModule_Create2(struct PyModuleDef* module, int module_api_version) { - if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) - Py_FatalError("Python import machinery not initialized"); + if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) { + PyErr_SetString(PyExc_SystemError, + "Python import machinery not initialized"); + return NULL; + } return _PyModule_CreateInitialized(module, module_api_version); } From 47ee8a6063c22ec272fe7a2d95d12f7811ebb48b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 22:37:44 +0100 Subject: [PATCH 223/380] bpo-38631: Avoid Py_FatalError() in _memory_release() (GH-18214) If the export count is negative, _memory_release() now raises a SystemError and returns -1, rather than calling Py_FatalError() which aborts the process. --- Objects/memoryobject.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 66920eaf947..d9dd11733ef 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1048,7 +1048,8 @@ _memory_release(PyMemoryViewObject *self) return -1; } - Py_FatalError("_memory_release(): negative export count"); + PyErr_SetString(PyExc_SystemError, + "_memory_release(): negative export count"); return -1; } From 2528a6c3d0660c03ae43d796628462ccf8e58190 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Mon, 27 Jan 2020 14:04:56 -0800 Subject: [PATCH 224/380] Add test.test_import.data.unwritable package to makefile (#18211) --- Makefile.pre.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.pre.in b/Makefile.pre.in index cfe42b4f21e..d430dc30bb6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1336,6 +1336,7 @@ LIBSUBDIRS= tkinter tkinter/test tkinter/test/test_tkinter \ test/test_import/data/circular_imports/subpkg \ test/test_import/data/package \ test/test_import/data/package2 \ + test/test_import/data/unwritable \ importlib \ importlib/metadata \ test/test_importlib \ From dd023ad1619b6f1ab313986e8953eea32c18f50c Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Mon, 27 Jan 2020 17:15:56 -0500 Subject: [PATCH 225/380] bpo-30780: Add IDLE configdialog tests (#3592) Expose dialog buttons to test code and complete their test coverage. Complete test coverage for highlights and keys tabs. Co-authored-by: Terry Jan Reedy --- Lib/idlelib/NEWS.txt | 3 + Lib/idlelib/configdialog.py | 18 +- Lib/idlelib/idle_test/test_configdialog.py | 158 +++++++++++++++--- .../2020-01-27-16-44-29.bpo-30780.nR80qu.rst | 1 + 4 files changed, 149 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index eda7c278876..2b543985b37 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-30780: Add remaining configdialog tests for buttons and +highlights and keys tabs. + bpo-39388: Settings dialog Cancel button cancels pending changes. bpo-39050: Settings dialog Help button again displays help text. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 2f95c9ccaa0..22359735874 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -149,17 +149,19 @@ class ConfigDialog(Toplevel): else: padding_args = {'padding': (6, 3)} outer = Frame(self, padding=2) - buttons = Frame(outer, padding=2) + buttons_frame = Frame(outer, padding=2) + self.buttons = {} for txt, cmd in ( ('Ok', self.ok), ('Apply', self.apply), ('Cancel', self.cancel), ('Help', self.help)): - Button(buttons, text=txt, command=cmd, takefocus=FALSE, - **padding_args).pack(side=LEFT, padx=5) + self.buttons[txt] = Button(buttons_frame, text=txt, command=cmd, + takefocus=FALSE, **padding_args) + self.buttons[txt].pack(side=LEFT, padx=5) # Add space above buttons. Frame(outer, height=2, borderwidth=0).pack(side=TOP) - buttons.pack(side=BOTTOM) + buttons_frame.pack(side=BOTTOM) return outer def ok(self): @@ -205,7 +207,6 @@ class ConfigDialog(Toplevel): Attributes accessed: note - Methods: view_text: Method from textview module. """ @@ -852,6 +853,7 @@ class HighPage(Frame): text.configure( font=('courier', 12, ''), cursor='hand2', width=1, height=1, takefocus=FALSE, highlightthickness=0, wrap=NONE) + # Prevent perhaps invisible selection of word or slice. text.bind('', lambda e: 'break') text.bind('', lambda e: 'break') string_tags=( @@ -1284,8 +1286,7 @@ class HighPage(Frame): theme_name - string, the name of the new theme theme - dictionary containing the new theme """ - if not idleConf.userCfg['highlight'].has_section(theme_name): - idleConf.userCfg['highlight'].add_section(theme_name) + idleConf.userCfg['highlight'].AddSection(theme_name) for element in theme: value = theme[element] idleConf.userCfg['highlight'].SetOption(theme_name, element, value) @@ -1730,8 +1731,7 @@ class KeysPage(Frame): keyset_name - string, the name of the new key set keyset - dictionary containing the new keybindings """ - if not idleConf.userCfg['keys'].has_section(keyset_name): - idleConf.userCfg['keys'].add_section(keyset_name) + idleConf.userCfg['keys'].AddSection(keyset_name) for event in keyset: value = keyset[event] idleConf.userCfg['keys'].SetOption(keyset_name, event, value) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 817a35217bf..1fea6d41df8 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -8,7 +8,7 @@ requires('gui') import unittest from unittest import mock from idlelib.idle_test.mock_idle import Func -from tkinter import Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL +from tkinter import (Tk, StringVar, IntVar, BooleanVar, DISABLED, NORMAL) from idlelib import config from idlelib.configdialog import idleConf, changes, tracers @@ -30,6 +30,7 @@ highpage = changes['highlight'] keyspage = changes['keys'] extpage = changes['extensions'] + def setUpModule(): global root, dialog idleConf.userCfg = testcfg @@ -37,6 +38,7 @@ def setUpModule(): # root.withdraw() # Comment out, see issue 30870 dialog = configdialog.ConfigDialog(root, 'Test', _utest=True) + def tearDownModule(): global root, dialog idleConf.userCfg = usercfg @@ -48,22 +50,56 @@ def tearDownModule(): root = dialog = None -class DialogTest(unittest.TestCase): +class ConfigDialogTest(unittest.TestCase): - @mock.patch(__name__+'.dialog.destroy', new_callable=Func) - def test_cancel(self, destroy): + def test_deactivate_current_config(self): + pass + + def activate_config_changes(self): + pass + + +class ButtonTest(unittest.TestCase): + + def test_click_ok(self): + d = dialog + apply = d.apply = mock.Mock() + destroy = d.destroy = mock.Mock() + d.buttons['Ok'].invoke() + apply.assert_called_once() + destroy.assert_called_once() + del d.destroy, d.apply + + def test_click_apply(self): + d = dialog + deactivate = d.deactivate_current_config = mock.Mock() + save_ext = d.save_all_changed_extensions = mock.Mock() + activate = d.activate_config_changes = mock.Mock() + d.buttons['Apply'].invoke() + deactivate.assert_called_once() + save_ext.assert_called_once() + activate.assert_called_once() + del d.save_all_changed_extensions + del d.activate_config_changes, d.deactivate_current_config + + def test_click_cancel(self): + d = dialog + d.destroy = Func() changes['main']['something'] = 1 - dialog.cancel() + d.buttons['Cancel'].invoke() self.assertEqual(changes['main'], {}) - self.assertEqual(destroy.called, 1) + self.assertEqual(d.destroy.called, 1) + del d.destroy - @mock.patch('idlelib.configdialog.view_text', new_callable=Func) - def test_help(self, view): + def test_click_help(self): dialog.note.select(dialog.keyspage) - dialog.help() - s = view.kwds['contents'] - self.assertTrue(s.startswith('When you click') and - s.endswith('a different name.\n')) + with mock.patch.object(configdialog, 'view_text', + new_callable=Func) as view: + dialog.buttons['Help'].invoke() + title, contents = view.kwds['title'], view.kwds['contents'] + self.assertEqual(title, 'Help for IDLE preferences') + self.assertTrue(contents.startswith('When you click') and + contents.endswith('a different name.\n')) class FontPageTest(unittest.TestCase): @@ -438,6 +474,48 @@ class HighPageTest(unittest.TestCase): eq(d.highlight_target.get(), elem[tag]) eq(d.set_highlight_target.called, count) + def test_highlight_sample_double_click(self): + # Test double click on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + # Test binding from configdialog. + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + # Double click is a sequence of two clicks in a row. + for _ in range(2): + hs.event_generate('', x=0, y=0) + hs.event_generate('', x=0, y=0) + + eq(hs.tag_ranges('sel'), ()) + + def test_highlight_sample_b1_motion(self): + # Test button motion on highlight_sample. + eq = self.assertEqual + d = self.page + + hs = d.highlight_sample + hs.focus_force() + hs.see(1.0) + hs.update_idletasks() + + x, y, dx, dy, offset = hs.dlineinfo('1.0') + + # Test binding from configdialog. + hs.event_generate('') + hs.event_generate('') + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=x, y=y) + hs.event_generate('', x=dx, y=dy) + hs.event_generate('', x=dx, y=dy) + + eq(hs.tag_ranges('sel'), ()) + def test_set_theme_type(self): eq = self.assertEqual d = self.page @@ -666,8 +744,13 @@ class HighPageTest(unittest.TestCase): idleConf.userCfg['highlight'].SetOption(theme_name, 'name', 'value') highpage[theme_name] = {'option': 'True'} + theme_name2 = 'other theme' + idleConf.userCfg['highlight'].SetOption(theme_name2, 'name', 'value') + highpage[theme_name2] = {'option': 'False'} + # Force custom theme. - d.theme_source.set(False) + d.custom_theme_on.state(('!disabled',)) + d.custom_theme_on.invoke() d.custom_name.set(theme_name) # Cancel deletion. @@ -675,7 +758,7 @@ class HighPageTest(unittest.TestCase): d.button_delete_custom.invoke() eq(yesno.called, 1) eq(highpage[theme_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'highlight'), ['spam theme']) + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name, theme_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_theme_type.called, 0) @@ -685,13 +768,26 @@ class HighPageTest(unittest.TestCase): d.button_delete_custom.invoke() eq(yesno.called, 2) self.assertNotIn(theme_name, highpage) - eq(idleConf.GetSectionList('user', 'highlight'), []) - eq(d.custom_theme_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom themes -') + eq(idleConf.GetSectionList('user', 'highlight'), [theme_name2]) + eq(d.custom_theme_on.state(), ()) + eq(d.custom_name.get(), theme_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_theme_type.called, 1) + # Confirm deletion of second theme - empties list. + d.custom_name.set(theme_name2) + yesno.result = True + d.button_delete_custom.invoke() + eq(yesno.called, 3) + self.assertNotIn(theme_name, highpage) + eq(idleConf.GetSectionList('user', 'highlight'), []) + eq(d.custom_theme_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom themes -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_theme_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno @@ -1059,8 +1155,13 @@ class KeysPageTest(unittest.TestCase): idleConf.userCfg['keys'].SetOption(keyset_name, 'name', 'value') keyspage[keyset_name] = {'option': 'True'} + keyset_name2 = 'other key set' + idleConf.userCfg['keys'].SetOption(keyset_name2, 'name', 'value') + keyspage[keyset_name2] = {'option': 'False'} + # Force custom keyset. - d.keyset_source.set(False) + d.custom_keyset_on.state(('!disabled',)) + d.custom_keyset_on.invoke() d.custom_name.set(keyset_name) # Cancel deletion. @@ -1068,7 +1169,7 @@ class KeysPageTest(unittest.TestCase): d.button_delete_custom_keys.invoke() eq(yesno.called, 1) eq(keyspage[keyset_name], {'option': 'True'}) - eq(idleConf.GetSectionList('user', 'keys'), ['spam key set']) + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name, keyset_name2]) eq(dialog.deactivate_current_config.called, 0) eq(dialog.activate_config_changes.called, 0) eq(d.set_keys_type.called, 0) @@ -1078,13 +1179,26 @@ class KeysPageTest(unittest.TestCase): d.button_delete_custom_keys.invoke() eq(yesno.called, 2) self.assertNotIn(keyset_name, keyspage) - eq(idleConf.GetSectionList('user', 'keys'), []) - eq(d.custom_keyset_on.state(), ('disabled',)) - eq(d.custom_name.get(), '- no custom keys -') + eq(idleConf.GetSectionList('user', 'keys'), [keyset_name2]) + eq(d.custom_keyset_on.state(), ()) + eq(d.custom_name.get(), keyset_name2) eq(dialog.deactivate_current_config.called, 1) eq(dialog.activate_config_changes.called, 1) eq(d.set_keys_type.called, 1) + # Confirm deletion of second keyset - empties list. + d.custom_name.set(keyset_name2) + yesno.result = True + d.button_delete_custom_keys.invoke() + eq(yesno.called, 3) + self.assertNotIn(keyset_name, keyspage) + eq(idleConf.GetSectionList('user', 'keys'), []) + eq(d.custom_keyset_on.state(), ('disabled',)) + eq(d.custom_name.get(), '- no custom keys -') + eq(dialog.deactivate_current_config.called, 2) + eq(dialog.activate_config_changes.called, 2) + eq(d.set_keys_type.called, 2) + del dialog.activate_config_changes, dialog.deactivate_current_config del d.askyesno diff --git a/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst new file mode 100644 index 00000000000..2f65a00a5af --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-01-27-16-44-29.bpo-30780.nR80qu.rst @@ -0,0 +1 @@ +Add remaining configdialog tests for buttons and highlights and keys tabs. From d3a1de22705cc79d7e8a0f44c4f00255e58c8b20 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 23:23:12 +0100 Subject: [PATCH 226/380] bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217) _PyCodecRegistry_Init() now reports exceptions to the caller, rather than calling Py_FatalError(). --- Python/codecs.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/Python/codecs.c b/Python/codecs.c index 08e9b916f20..10d76969a51 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -1494,32 +1494,37 @@ static int _PyCodecRegistry_Init(void) PyInterpreterState *interp = _PyInterpreterState_Get(); PyObject *mod; - unsigned i; if (interp->codec_search_path != NULL) return 0; interp->codec_search_path = PyList_New(0); - interp->codec_search_cache = PyDict_New(); - interp->codec_error_registry = PyDict_New(); - - if (interp->codec_error_registry) { - for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); - int res; - if (!func) - Py_FatalError("can't initialize codec error registry"); - res = PyCodec_RegisterError(methods[i].name, func); - Py_DECREF(func); - if (res) - Py_FatalError("can't initialize codec error registry"); - } + if (interp->codec_search_path == NULL) { + return -1; } - if (interp->codec_search_path == NULL || - interp->codec_search_cache == NULL || - interp->codec_error_registry == NULL) - Py_FatalError("can't initialize codec registry"); + interp->codec_search_cache = PyDict_New(); + if (interp->codec_search_cache == NULL) { + return -1; + } + + interp->codec_error_registry = PyDict_New(); + if (interp->codec_error_registry == NULL) { + return -1; + } + + for (size_t i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); + if (!func) { + return -1; + } + + int res = PyCodec_RegisterError(methods[i].name, func); + Py_DECREF(func); + if (res) { + return -1; + } + } mod = PyImport_ImportModuleNoBlock("encodings"); if (mod == NULL) { From a27831351873bd7eff10863353d475c29fb0d7bb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 23:24:13 +0100 Subject: [PATCH 227/380] bpo-38631: Avoid Py_FatalError() in PyCode_New() (GH-18215) intern_strings() now raises a SystemError, rather than calling Py_FatalError(). intern_string_constants() now reports exceptions to the caller, rather than ignoring silently exceptions. --- Objects/codeobject.c | 72 ++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 522e1a9f2a4..c6759c9be22 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -38,7 +38,7 @@ all_name_chars(PyObject *o) return 1; } -static void +static int intern_strings(PyObject *tuple) { Py_ssize_t i; @@ -46,60 +46,70 @@ intern_strings(PyObject *tuple) for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (v == NULL || !PyUnicode_CheckExact(v)) { - Py_FatalError("non-string found in code slot"); + PyErr_SetString(PyExc_SystemError, + "non-string found in code slot"); + return -1; } PyUnicode_InternInPlace(&_PyTuple_ITEMS(tuple)[i]); } + return 0; } /* Intern selected string constants */ static int -intern_string_constants(PyObject *tuple) +intern_string_constants(PyObject *tuple, int *modified) { - int modified = 0; - Py_ssize_t i; - - for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { + for (Py_ssize_t i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { PyObject *v = PyTuple_GET_ITEM(tuple, i); if (PyUnicode_CheckExact(v)) { if (PyUnicode_READY(v) == -1) { - PyErr_Clear(); - continue; + return -1; } + if (all_name_chars(v)) { PyObject *w = v; PyUnicode_InternInPlace(&v); if (w != v) { PyTuple_SET_ITEM(tuple, i, v); - modified = 1; + if (modified) { + *modified = 1; + } } } } else if (PyTuple_CheckExact(v)) { - intern_string_constants(v); + if (intern_string_constants(v, NULL) < 0) { + return -1; + } } else if (PyFrozenSet_CheckExact(v)) { PyObject *w = v; PyObject *tmp = PySequence_Tuple(v); if (tmp == NULL) { - PyErr_Clear(); - continue; + return -1; } - if (intern_string_constants(tmp)) { + int tmp_modified = 0; + if (intern_string_constants(tmp, &tmp_modified) < 0) { + Py_DECREF(tmp); + return -1; + } + if (tmp_modified) { v = PyFrozenSet_New(tmp); if (v == NULL) { - PyErr_Clear(); + Py_DECREF(tmp); + return -1; } - else { - PyTuple_SET_ITEM(tuple, i, v); - Py_DECREF(w); - modified = 1; + + PyTuple_SET_ITEM(tuple, i, v); + Py_DECREF(w); + if (modified) { + *modified = 1; } } Py_DECREF(tmp); } } - return modified; + return 0; } PyCodeObject * @@ -139,11 +149,21 @@ PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, return NULL; } - intern_strings(names); - intern_strings(varnames); - intern_strings(freevars); - intern_strings(cellvars); - intern_string_constants(consts); + if (intern_strings(names) < 0) { + return NULL; + } + if (intern_strings(varnames) < 0) { + return NULL; + } + if (intern_strings(freevars) < 0) { + return NULL; + } + if (intern_strings(cellvars) < 0) { + return NULL; + } + if (intern_string_constants(consts, NULL) < 0) { + return NULL; + } /* Check for any inner or outer closure references */ n_cellvars = PyTuple_GET_SIZE(cellvars); @@ -513,7 +533,7 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw) ourvarnames, ourfreevars, ourcellvars, filename, name, firstlineno, lnotab); - cleanup: + cleanup: Py_XDECREF(ournames); Py_XDECREF(ourvarnames); Py_XDECREF(ourfreevars); From 2824c45a0a020f12f27da7e7162e8636c21bf869 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 27 Jan 2020 18:41:18 -0500 Subject: [PATCH 228/380] bpo-39392: Turtle overlap fill depends on OS (#18223) Whether or not overlap regions for self-intersecting polygons or multiple shapes are filled depends on the operating system graphics, typeof overlap, and number of overlaps. --- Doc/library/turtle.rst | 5 +++++ .../Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst | 1 + 2 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index 7f9f0c34386..fed85045435 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -1051,6 +1051,11 @@ Filling Fill the shape drawn after the last call to :func:`begin_fill`. + Whether or not overlap regions for self-intersecting polygons + or multiple shapes are filled depends on the operating system graphics, + type of overlap, and number of overlaps. For example, the Turtle star + above may be either all yellow or have some white regions. + .. doctest:: :skipif: _tkinter is None diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst new file mode 100644 index 00000000000..715874981f7 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-18-18-42.bpo-39392.oiqcLO.rst @@ -0,0 +1 @@ +Explain that when filling with turtle, overlap regions may be left unfilled. From 884eb89d4a5cc8e023deaa65001dfa74a436694c Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Mon, 27 Jan 2020 16:50:37 -0800 Subject: [PATCH 229/380] bpo-39205: Tests that highlight a hang on ProcessPoolExecutor shutdown (#18221) --- Lib/test/test_concurrent_futures.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index c97351636e8..c8fa35e9eea 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -342,6 +342,26 @@ class ExecutorShutdownTest: for f in fs: f.result() + def test_hang_issue39205(self): + """shutdown(wait=False) doesn't hang at exit with running futures. + + See https://bugs.python.org/issue39205. + """ + if self.executor_type == futures.ProcessPoolExecutor: + raise unittest.SkipTest( + "Hangs due to https://bugs.python.org/issue39205") + + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import {executor_type} + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = {executor_type}(max_workers=3) + t.submit(sleep_and_print, 1.0, "apple") + t.shutdown(wait=False) + """.format(executor_type=self.executor_type.__name__)) + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase): def _prime_executor(self): From 01bf2196d842fc20667c5336e0a7a77eb4fdc25c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Mon, 27 Jan 2020 18:31:46 -0800 Subject: [PATCH 230/380] bpo-36018: Minor fixes to the NormalDist() examples and recipes. (GH-18226) * Change the source for the SAT data to a primary source. * Fix typo in the standard deviation * Clarify that the binomial probabalities are just for the Python room. --- Doc/library/statistics.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index 09b02cabf21..026f4aa462d 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -734,10 +734,10 @@ of applications in statistics. :class:`NormalDist` readily solves classic probability problems. For example, given `historical data for SAT exams -`_ showing that scores -are normally distributed with a mean of 1060 and a standard deviation of 192, -determine the percentage of students with test scores between 1100 and -1200, after rounding to the nearest whole number: +`_ showing +that scores are normally distributed with a mean of 1060 and a standard +deviation of 195, determine the percentage of students with test scores +between 1100 and 1200, after rounding to the nearest whole number: .. doctest:: @@ -781,7 +781,7 @@ For example, an open source conference has 750 attendees and two rooms with a 500 person capacity. There is a talk about Python and another about Ruby. In previous conferences, 65% of the attendees preferred to listen to Python talks. Assuming the population preferences haven't changed, what is the -probability that the rooms will stay within their capacity limits? +probability that the Python room will stay within its capacity limits? .. doctest:: From 61f4db8c56ca4b7e60050d96ecc255cfb03d92a0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 28 Jan 2020 03:37:45 +0100 Subject: [PATCH 231/380] bpo-38644: Pass tstate in ceval.c (GH-18222) Pass explicitly the Python thread state (tstate) in ceval.c. --- Python/ceval.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 673b401e6ab..2c0a23dfdd2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2138,7 +2138,7 @@ main_loop: PyObject *val = POP(); PyObject *tb = POP(); assert(PyExceptionClass_Check(exc)); - PyErr_Restore(exc, val, tb); + _PyErr_Restore(tstate, exc, val, tb); goto exception_unwind; } @@ -2640,7 +2640,7 @@ main_loop: if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable))) { - PyErr_Clear(); + _PyErr_Clear(tstate); _PyErr_Format(tstate, PyExc_TypeError, "Value after * must be an iterable, not %.200s", Py_TYPE(iterable)->tp_name); @@ -4340,7 +4340,7 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause) } _PyErr_SetObject(tstate, type, value); - /* PyErr_SetObject incref's its arguments */ + /* _PyErr_SetObject incref's its arguments */ Py_DECREF(value); Py_DECREF(type); return 0; @@ -5208,7 +5208,7 @@ check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) /* check_args_iterable() may be called with a live exception: * clear it to prevent calling _PyObject_FunctionStr() with an * exception set. */ - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { _PyErr_Format(tstate, PyExc_TypeError, @@ -5231,7 +5231,7 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) * is not a mapping. */ if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { _PyErr_Format( @@ -5245,7 +5245,7 @@ format_kwargs_error(PyThreadState *tstate, PyObject *func, PyObject *kwargs) PyObject *exc, *val, *tb; _PyErr_Fetch(tstate, &exc, &val, &tb); if (val && PyTuple_Check(val) && PyTuple_GET_SIZE(val) == 1) { - PyErr_Clear(); + _PyErr_Clear(tstate); PyObject *funcstr = _PyObject_FunctionStr(func); if (funcstr != NULL) { PyObject *key = PyTuple_GET_ITEM(val, 0); From c45a2aa9e255b5c7c211faa79f6b23895b64ab27 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Tue, 28 Jan 2020 10:41:50 +0100 Subject: [PATCH 232/380] bpo-38883: Don't use POSIX `$HOME` in `pathlib.Path.home/expanduser` on Windows (GH-17961) In bpo-36264 os.path.expanduser was changed to ignore HOME on Windows. Path.expanduser/home still honored HOME despite being documented as behaving the same as os.path.expanduser. This makes them also ignore HOME so that both implementations behave the same way again. --- Lib/pathlib.py | 4 +--- Lib/test/test_pathlib.py | 22 ++++++++++++------- .../2020-01-11-22-53-55.bpo-38883.X7FRaN.rst | 5 +++++ 3 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 7d1d1150b0d..a5f3313902e 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -253,9 +253,7 @@ class _WindowsFlavour(_Flavour): return 'file:' + urlquote_from_bytes(path.as_posix().encode('utf-8')) def gethomedir(self, username): - if 'HOME' in os.environ: - userhome = os.environ['HOME'] - elif 'USERPROFILE' in os.environ: + if 'USERPROFILE' in os.environ: userhome = os.environ['USERPROFILE'] elif 'HOMEPATH' in os.environ: try: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 3232649f554..a50dce01718 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1383,8 +1383,16 @@ class _BasePathTest(object): self.assertTrue(p.is_absolute()) def test_home(self): - p = self.cls.home() - self._test_home(p) + with support.EnvironmentVarGuard() as env: + self._test_home(self.cls.home()) + + env.clear() + env['USERPROFILE'] = os.path.join(BASE, 'userprofile') + self._test_home(self.cls.home()) + + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = os.path.join(BASE, 'home') + self._test_home(self.cls.home()) def test_samefile(self): fileA_path = os.path.join(BASE, 'fileA') @@ -2448,12 +2456,6 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase): self.assertEqual(p5.expanduser(), p5) self.assertEqual(p6.expanduser(), p6) - # Test the first lookup key in the env vars. - env['HOME'] = 'C:\\Users\\alice' - check() - - # Test that HOMEPATH is available instead. - env.pop('HOME', None) env['HOMEPATH'] = 'C:\\Users\\alice' check() @@ -2466,6 +2468,10 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase): env['USERPROFILE'] = 'C:\\Users\\alice' check() + # bpo-38883: ignore `HOME` when set on windows + env['HOME'] = 'C:\\Users\\eve' + check() + class CompatiblePathTest(unittest.TestCase): """ diff --git a/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst new file mode 100644 index 00000000000..c552e850a36 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-11-22-53-55.bpo-38883.X7FRaN.rst @@ -0,0 +1,5 @@ +:meth:`~pathlib.Path.home()` and :meth:`~pathlib.Path.expanduser()` on Windows +now prefer :envvar:`USERPROFILE` and no longer use :envvar:`HOME`, which is not +normally set for regular user accounts. This makes them again behave like +:func:`os.path.expanduser`, which was changed to ignore :envvar:`HOME` in 3.8, +see :issue:`36264`. From 13c1c3556f2c12d0be2af890fabfbf44280b845c Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 28 Jan 2020 02:42:43 -0700 Subject: [PATCH 233/380] bpo-39393: Misleading error message on dependent DLL resolution failure (GH-18093) --- .../next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst | 2 ++ Modules/_ctypes/callproc.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst diff --git a/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst new file mode 100644 index 00000000000..025b7e96a6e --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-20-23-42-53.bpo-39393.gWlJDG.rst @@ -0,0 +1,2 @@ +Improve the error message when attempting to load a DLL with unresolved +dependencies. diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 7b13fa041a2..65c6eb15a29 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1311,8 +1311,9 @@ static PyObject *load_library(PyObject *self, PyObject *args) if (err == ERROR_MOD_NOT_FOUND) { PyErr_Format(PyExc_FileNotFoundError, - ("Could not find module '%.500S'. Try using " - "the full path with constructor syntax."), + ("Could not find module '%.500S' (or one of its " + "dependencies). Try using the full path with " + "constructor syntax."), nameobj); return NULL; } else if (err) { From 148610d88a2785751ed435a4e60f07a9f1bc50a6 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Tue, 28 Jan 2020 19:12:31 +0900 Subject: [PATCH 234/380] bpo-39287: Doc: Add UTF-8 mode section in using/windows. (GH-17935) Co-Authored-By: Kyle Stanley --- Doc/using/cmdline.rst | 2 -- Doc/using/windows.rst | 44 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 146003b1471..fb88673d30b 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -929,8 +929,6 @@ conflict. Also available as the :option:`-X` ``utf8`` option. - .. availability:: \*nix. - .. versionadded:: 3.7 See :pep:`540` for more details. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 4912048a1ab..97e9cdfeb09 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -602,6 +602,50 @@ existed):: C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9 +.. _win-utf8-mode: + +UTF-8 mode +========== + +.. versionadded:: 3.7 + +Windows still uses legacy encodings for the system encoding (the ANSI Code +Page). Python uses it for the default encoding of text files (e.g. +:func:`locale.getpreferredencoding`). + +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. + +Note that adding ``PYTHONUTF8=1`` to the default environment variables +will affect all Python 3.7+ applications on your system. +If you have any Python 3.7+ applications which rely on the legacy +system encoding, it is recommended to set the environment variable +temporarily or use the ``-X utf8`` command line option. + +.. note:: + Even when UTF-8 mode is disabled, Python uses UTF-8 by default + on Windows for: + + * Console I/O including standard I/O (see :pep:`528` for details). + * The filesystem encoding (see :pep:`529` for details). + + .. _launcher: Python Launcher for Windows From 0be3246d4f9c8eddcd55491901d95b09fe163f15 Mon Sep 17 00:00:00 2001 From: Adam Meily Date: Tue, 28 Jan 2020 05:34:23 -0500 Subject: [PATCH 235/380] bpo-39439: Fix multiprocessing spawn path in a venv on Windows (GH-18158) --- Lib/multiprocessing/spawn.py | 2 +- .../next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index 075f3455478..7cc129e2610 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -36,7 +36,7 @@ else: if WINSERVICE: _python_exe = os.path.join(sys.exec_prefix, 'python.exe') else: - _python_exe = sys._base_executable + _python_exe = sys.executable def set_executable(exe): global _python_exe diff --git a/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst new file mode 100644 index 00000000000..d677c4c3e02 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-24-03-15-05.bpo-39439.sFxGfR.rst @@ -0,0 +1 @@ +Honor the Python path when a virtualenv is active on Windows. \ No newline at end of file From 2cca8efe46935c39c445f585bce54954fad2485b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Lapeyre?= Date: Tue, 28 Jan 2020 13:47:03 +0100 Subject: [PATCH 236/380] bpo-36350: inspect: Replace OrderedDict with dict. (GH-12412) --- Doc/library/inspect.rst | 22 +++++++---- Lib/inspect.py | 39 +++++++++---------- Lib/test/test_inspect.py | 5 +++ .../2019-03-18-16-17-59.bpo-36350.udRSWE.rst | 2 + 4 files changed, 39 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index bab2c41e4e2..9b9bc99f43d 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -624,15 +624,18 @@ function. .. attribute:: Signature.parameters - An ordered mapping of parameters' names to the corresponding - :class:`Parameter` objects. Parameters appear in strict definition - order, including keyword-only parameters. + An dictionary of :class:`Parameter` objects. Parameters appear in strict + definition order, including keyword-only parameters. .. versionchanged:: 3.7 Python only explicitly guaranteed that it preserved the declaration order of keyword-only parameters as of version 3.7, although in practice this order had always been preserved in Python 3. + .. versionchanged:: 3.9 + :attr:`parameters` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: Signature.return_annotation The "return" annotation for the callable. If the callable has no "return" @@ -821,10 +824,9 @@ function. .. attribute:: BoundArguments.arguments - An ordered, mutable mapping (:class:`collections.OrderedDict`) of - parameters' names to arguments' values. Contains only explicitly bound - arguments. Changes in :attr:`arguments` will reflect in :attr:`args` and - :attr:`kwargs`. + An ordered, mutable mapping of parameters' names to arguments' values. + Contains only explicitly bound arguments. Changes in :attr:`arguments` + will reflect in :attr:`args` and :attr:`kwargs`. Should be used in conjunction with :attr:`Signature.parameters` for any argument processing purposes. @@ -836,6 +838,10 @@ function. However, if needed, use :meth:`BoundArguments.apply_defaults` to add them. + .. versionchanged:: 3.9 + :attr:`arguments` is now of type :class:`dict`. Formerly, it was of + type :class:`collections.OrderedDict`. + .. attribute:: BoundArguments.args A tuple of positional arguments values. Dynamically computed from the @@ -866,7 +872,7 @@ function. >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments - OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())]) + {'a': 'spam', 'b': 'ham', 'args': ()} .. versionadded:: 3.5 diff --git a/Lib/inspect.py b/Lib/inspect.py index 608ca955116..950bdb22179 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -48,7 +48,7 @@ import warnings import functools import builtins from operator import attrgetter -from collections import namedtuple, OrderedDict +from collections import namedtuple # Create constants for the compiler flags in Include/code.h # We try to get them from dis to avoid duplication @@ -1727,7 +1727,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): """ old_params = wrapped_sig.parameters - new_params = OrderedDict(old_params.items()) + new_params = {} partial_args = partial.args or () partial_keywords = partial.keywords or {} @@ -1743,6 +1743,7 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): transform_to_kwonly = False + kwonly_params = {} # Keyword only parameters are moved to end. for param_name, param in old_params.items(): try: arg_value = ba.arguments[param_name] @@ -1752,7 +1753,6 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): if param.kind is _POSITIONAL_ONLY: # If positional-only parameter is bound by partial, # it effectively disappears from the signature - new_params.pop(param_name) continue if param.kind is _POSITIONAL_OR_KEYWORD: @@ -1771,28 +1771,26 @@ def _signature_get_partial(wrapped_sig, partial, extra_args=()): # multiple values. transform_to_kwonly = True # Set the new default value - new_params[param_name] = param.replace(default=arg_value) + param = param.replace(default=arg_value) else: # was passed as a positional argument - new_params.pop(param.name) continue if param.kind is _KEYWORD_ONLY: # Set the new default value - new_params[param_name] = param.replace(default=arg_value) + param = param.replace(default=arg_value) if transform_to_kwonly: assert param.kind is not _POSITIONAL_ONLY if param.kind is _POSITIONAL_OR_KEYWORD: - new_param = new_params[param_name].replace(kind=_KEYWORD_ONLY) - new_params[param_name] = new_param - new_params.move_to_end(param_name) + kwonly_params[param_name] = param.replace(kind=_KEYWORD_ONLY) elif param.kind in (_KEYWORD_ONLY, _VAR_KEYWORD): - new_params.move_to_end(param_name) - elif param.kind is _VAR_POSITIONAL: - new_params.pop(param.name) + kwonly_params[param_name] = param + else: + new_params[param_name] = param + new_params.update(kwonly_params) return wrapped_sig.replace(parameters=new_params.values()) @@ -2602,7 +2600,7 @@ class BoundArguments: Has the following public attributes: - * arguments : OrderedDict + * arguments : dict An ordered mutable mapping of parameters' names to arguments' values. Does not contain arguments' default values. * signature : Signature @@ -2702,7 +2700,7 @@ class BoundArguments: # Signature.bind_partial(). continue new_arguments.append((name, val)) - self.arguments = OrderedDict(new_arguments) + self.arguments = dict(new_arguments) def __eq__(self, other): if self is other: @@ -2733,7 +2731,7 @@ class Signature: A Signature object has the following public attributes and methods: - * parameters : OrderedDict + * parameters : dict An ordered mapping of parameters' names to the corresponding Parameter objects (keyword-only arguments are in the same order as listed in `code.co_varnames`). @@ -2763,14 +2761,14 @@ class Signature: """ if parameters is None: - params = OrderedDict() + params = {} else: if __validate_parameters__: - params = OrderedDict() + params = {} top_kind = _POSITIONAL_ONLY kind_defaults = False - for idx, param in enumerate(parameters): + for param in parameters: kind = param.kind name = param.name @@ -2805,8 +2803,7 @@ class Signature: params[name] = param else: - params = OrderedDict(((param.name, param) - for param in parameters)) + params = {param.name: param for param in parameters} self._parameters = types.MappingProxyType(params) self._return_annotation = return_annotation @@ -2888,7 +2885,7 @@ class Signature: def _bind(self, args, kwargs, *, partial=False): """Private method. Don't use directly.""" - arguments = OrderedDict() + arguments = {} parameters = iter(self.parameters.values()) parameters_ex = () diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index d95e742c8dd..8a2efc87932 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -2077,6 +2077,7 @@ class TestSignatureObject(unittest.TestCase): P = inspect.Parameter self.assertEqual(str(S()), '()') + self.assertEqual(repr(S().parameters), 'mappingproxy({})') def test(po, pk, pod=42, pkd=100, *args, ko, **kwargs): pass @@ -3681,6 +3682,10 @@ class TestBoundArguments(unittest.TestCase): ba.apply_defaults() self.assertEqual(list(ba.arguments.items()), [('a', 'spam')]) + def test_signature_bound_arguments_arguments_type(self): + def foo(a): pass + ba = inspect.signature(foo).bind(1) + self.assertIs(type(ba.arguments), dict) class TestSignaturePrivateHelpers(unittest.TestCase): def test_signature_get_bound_param(self): diff --git a/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst b/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst new file mode 100644 index 00000000000..43363fce165 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-18-16-17-59.bpo-36350.udRSWE.rst @@ -0,0 +1,2 @@ +`inspect.Signature.parameters` and `inspect.BoundArguments.arguments` are +now dicts instead of OrderedDicts. Patch contributed by Rémi Lapeyre. From aabdeb766b7fa581e7de01f3c953b12792f0736d Mon Sep 17 00:00:00 2001 From: David Carlier Date: Tue, 28 Jan 2020 12:53:32 +0000 Subject: [PATCH 237/380] bpo-38960: DTrace build fix for FreeBSD. (GH-17451) DTrace build fix for FreeBSD. - allowing passing an extra flag as it need to define the arch size. - casting some probe's arguments. --- .../2019-12-03-16-41-22.bpo-38960.kvoFM0.rst | 1 + Python/ceval.c | 6 +++--- Python/import.c | 4 ++-- Python/sysmodule.c | 2 +- configure | 3 +-- configure.ac | 3 +-- 6 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst new file mode 100644 index 00000000000..50d4b6c2868 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-03-16-41-22.bpo-38960.kvoFM0.rst @@ -0,0 +1 @@ +Fix DTrace build issues on FreeBSD. Patch by David Carlier. diff --git a/Python/ceval.c b/Python/ceval.c index 2c0a23dfdd2..2770dc6d08d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5447,7 +5447,7 @@ dtrace_function_entry(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); + PyDTrace_FUNCTION_ENTRY((char *)filename, (char *)funcname, lineno); } static void @@ -5461,7 +5461,7 @@ dtrace_function_return(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); + PyDTrace_FUNCTION_RETURN((char *)filename, (char *)funcname, lineno); } /* DTrace equivalent of maybe_call_line_trace. */ @@ -5493,7 +5493,7 @@ maybe_dtrace_line(PyFrameObject *frame, co_name = PyUnicode_AsUTF8(frame->f_code->co_name); if (!co_name) co_name = "?"; - PyDTrace_LINE(co_filename, co_name, line); + PyDTrace_LINE((char *)co_filename, (char *)co_name, line); } *instr_prev = frame->f_lasti; } diff --git a/Python/import.c b/Python/import.c index 045b6d0a9bf..2e5f78382ed 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1762,14 +1762,14 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name) } if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED()) - PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name)); + PyDTrace_IMPORT_FIND_LOAD_START((char *)PyUnicode_AsUTF8(abs_name)); mod = _PyObject_CallMethodIdObjArgs(interp->importlib, &PyId__find_and_load, abs_name, interp->import_func, NULL); if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED()) - PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name), + PyDTrace_IMPORT_FIND_LOAD_DONE((char *)PyUnicode_AsUTF8(abs_name), mod != NULL); if (import_time) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 9f866a2a3d2..17e79603c29 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -204,7 +204,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) /* Dtrace USDT point */ if (dtrace) { - PyDTrace_AUDIT(event, (void *)eventArgs); + PyDTrace_AUDIT((char *)event, (void *)eventArgs); } /* Call interpreter hooks */ diff --git a/configure b/configure index 85120e498d1..595c129814d 100755 --- a/configure +++ b/configure @@ -11386,7 +11386,6 @@ $as_echo "$with_dtrace" >&6; } DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -11452,7 +11451,7 @@ if ${ac_cv_dtrace_link+:} false; then : else ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" "$DFLAGS" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes fi diff --git a/configure.ac b/configure.ac index ab8e1b7d27a..fee605eec2a 100644 --- a/configure.ac +++ b/configure.ac @@ -3500,7 +3500,6 @@ AC_SUBST(DFLAGS) AC_SUBST(DTRACE_HEADERS) AC_SUBST(DTRACE_OBJS) DTRACE= -DFLAGS= DTRACE_HEADERS= DTRACE_OBJS= @@ -3521,7 +3520,7 @@ then [ac_cv_dtrace_link], [dnl ac_cv_dtrace_link=no echo 'BEGIN{}' > conftest.d - "$DTRACE" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ + "$DTRACE" "$DFLAGS" -G -s conftest.d -o conftest.o > /dev/null 2>&1 && \ ac_cv_dtrace_link=yes ]) if test "$ac_cv_dtrace_link" = "yes"; then From 0cd5bff6b7da3118d0c5a88fc2b80f80eb7c3059 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Tue, 28 Jan 2020 13:24:12 -0800 Subject: [PATCH 238/380] bpo-39459: include missing test files in windows installer Adds missing test files to Windows installer to wrap up bpo-39459 --- PCbuild/lib.pyproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PCbuild/lib.pyproj b/PCbuild/lib.pyproj index 401e207ae57..d4351dec3be 100644 --- a/PCbuild/lib.pyproj +++ b/PCbuild/lib.pyproj @@ -1125,6 +1125,8 @@ + + From 6a65eba44bfd82ccc8bed4b5c6dd6637549955d5 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 29 Jan 2020 13:46:33 +1100 Subject: [PATCH 239/380] bpo-39401: Avoid unsafe DLL load on Windows 7 and earlier (GH-18231) As Windows 7 is not supported by Python 3.9, we just replace the dynamic load with a static import. Backports will have a different fix to ensure they continue to behave the same. --- .../2020-01-28-20-54-09.bpo-39401.he7h_A.rst | 1 + PC/getpathp.c | 55 ++----------------- PCbuild/pythoncore.vcxproj | 2 +- 3 files changed, 7 insertions(+), 51 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst diff --git a/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst new file mode 100644 index 00000000000..78274acfcb7 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-28-20-54-09.bpo-39401.he7h_A.rst @@ -0,0 +1 @@ +Avoid unsafe DLL load at startup on Windows 7 and earlier. diff --git a/PC/getpathp.c b/PC/getpathp.c index 085caf195a9..3b65b35ce61 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -91,6 +91,7 @@ #endif #include +#include #include #ifdef HAVE_SYS_TYPES_H @@ -242,42 +243,14 @@ ismodule(wchar_t *filename, int update_filename) stuff as fits will be appended. */ -static int _PathCchCombineEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCombineEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, PCWSTR pszMore, - unsigned long dwFlags); -static PPathCchCombineEx _PathCchCombineEx; - static void join(wchar_t *buffer, const wchar_t *stuff) { - if (_PathCchCombineEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); - if (pathapi) { - _PathCchCombineEx = (PPathCchCombineEx)GetProcAddress(pathapi, "PathCchCombineEx"); - } - else { - _PathCchCombineEx = NULL; - } - _PathCchCombineEx_Initialized = 1; - } - - if (_PathCchCombineEx) { - if (FAILED(_PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } - } else { - if (!PathCombineW(buffer, buffer, stuff)) { - Py_FatalError("buffer overflow in getpathp.c's join()"); - } + if (FAILED(PathCchCombineEx(buffer, MAXPATHLEN+1, buffer, stuff, 0))) { + Py_FatalError("buffer overflow in getpathp.c's join()"); } } -static int _PathCchCanonicalizeEx_Initialized = 0; -typedef HRESULT(__stdcall *PPathCchCanonicalizeEx) (PWSTR pszPathOut, size_t cchPathOut, - PCWSTR pszPathIn, unsigned long dwFlags); -static PPathCchCanonicalizeEx _PathCchCanonicalizeEx; - /* Call PathCchCanonicalizeEx(path): remove navigation elements such as "." and ".." to produce a direct, well-formed path. */ static PyStatus @@ -287,26 +260,8 @@ canonicalize(wchar_t *buffer, const wchar_t *path) return _PyStatus_NO_MEMORY(); } - if (_PathCchCanonicalizeEx_Initialized == 0) { - HMODULE pathapi = LoadLibraryW(L"api-ms-win-core-path-l1-1-0.dll"); - if (pathapi) { - _PathCchCanonicalizeEx = (PPathCchCanonicalizeEx)GetProcAddress(pathapi, "PathCchCanonicalizeEx"); - } - else { - _PathCchCanonicalizeEx = NULL; - } - _PathCchCanonicalizeEx_Initialized = 1; - } - - if (_PathCchCanonicalizeEx) { - if (FAILED(_PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { - return INIT_ERR_BUFFER_OVERFLOW(); - } - } - else { - if (!PathCanonicalizeW(buffer, path)) { - return INIT_ERR_BUFFER_OVERFLOW(); - } + if (FAILED(PathCchCanonicalizeEx(buffer, MAXPATHLEN + 1, path, 0))) { + return INIT_ERR_BUFFER_OVERFLOW(); } return _PyStatus_OK(); } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index f5be8aa4051..cfab2fa4e18 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -106,7 +106,7 @@ _Py_HAVE_ZLIB;%(PreprocessorDefinitions) - version.lib;shlwapi.lib;ws2_32.lib;%(AdditionalDependencies) + version.lib;shlwapi.lib;ws2_32.lib;pathcch.lib;%(AdditionalDependencies) From d07d9f4c43bc85a77021bcc7d77643f8ebb605cf Mon Sep 17 00:00:00 2001 From: Bruce Merry Date: Wed, 29 Jan 2020 09:09:24 +0200 Subject: [PATCH 240/380] bpo-36051: Drop GIL during large bytes.join() (GH-17757) Improve multi-threaded performance by dropping the GIL in the fast path of bytes.join. To avoid increasing overhead for small joins, it is only done if the output size exceeds a threshold. --- Lib/test/test_bytes.py | 8 ++- Misc/ACKS | 1 + .../2019-12-30-15-56-07.bpo-36051.imaVlq.rst | 1 + Objects/stringlib/join.h | 57 +++++++++++++------ 4 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index ddcf367f38f..770e2c5592c 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -547,9 +547,13 @@ class BaseBytesTest: self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") # Stress it with many items - seq = [b"abc"] * 1000 - expected = b"abc" + b".:abc" * 999 + seq = [b"abc"] * 100000 + expected = b"abc" + b".:abc" * 99999 self.assertEqual(dot_join(seq), expected) + # Stress test with empty separator + seq = [b"abc"] * 100000 + expected = b"abc" * 100000 + self.assertEqual(self.type2test(b"").join(seq), expected) self.assertRaises(TypeError, self.type2test(b" ").join, None) # Error handling and cleanup when some item in the middle of the # sequence has the wrong type. diff --git a/Misc/ACKS b/Misc/ACKS index 7e4b81bfdee..f3e36807812 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1106,6 +1106,7 @@ Ezio Melotti Doug Mennella Dimitri Merejkowsky Brian Merrell +Bruce Merry Alexis Métaireau Luke Mewburn Carl Meyer diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst new file mode 100644 index 00000000000..f9d449216eb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-30-15-56-07.bpo-36051.imaVlq.rst @@ -0,0 +1 @@ +Drop the GIL during large ``bytes.join`` operations. Patch by Bruce Merry. diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 6f314e1524e..4d023ed1a85 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -18,6 +18,9 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) Py_buffer *buffers = NULL; #define NB_STATIC_BUFFERS 10 Py_buffer static_buffers[NB_STATIC_BUFFERS]; +#define GIL_THRESHOLD 1048576 + int drop_gil = 1; + PyThreadState *save; seq = PySequence_Fast(iterable, "can only join an iterable"); if (seq == NULL) { @@ -65,12 +68,21 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) buffers[i].buf = PyBytes_AS_STRING(item); buffers[i].len = PyBytes_GET_SIZE(item); } - else if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { - PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected a bytes-like object, " - "%.80s found", - i, Py_TYPE(item)->tp_name); - goto error; + else { + if (PyObject_GetBuffer(item, &buffers[i], PyBUF_SIMPLE) != 0) { + PyErr_Format(PyExc_TypeError, + "sequence item %zd: expected a bytes-like object, " + "%.80s found", + i, Py_TYPE(item)->tp_name); + goto error; + } + /* If the backing objects are mutable, then dropping the GIL + * opens up race conditions where another thread tries to modify + * the object which we hold a buffer on it. Such code has data + * races anyway, but this is a conservative approach that avoids + * changing the behaviour of that data race. + */ + drop_gil = 0; } nbufs = i + 1; /* for error cleanup */ itemlen = buffers[i].len; @@ -102,6 +114,12 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) /* Catenate everything. */ p = STRINGLIB_STR(res); + if (sz < GIL_THRESHOLD) { + drop_gil = 0; /* Benefits are likely outweighed by the overheads */ + } + if (drop_gil) { + save = PyEval_SaveThread(); + } if (!seplen) { /* fast path */ for (i = 0; i < nbufs; i++) { @@ -110,19 +128,23 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) memcpy(p, q, n); p += n; } - goto done; } - for (i = 0; i < nbufs; i++) { - Py_ssize_t n; - char *q; - if (i) { - memcpy(p, sepstr, seplen); - p += seplen; + else { + for (i = 0; i < nbufs; i++) { + Py_ssize_t n; + char *q; + if (i) { + memcpy(p, sepstr, seplen); + p += seplen; + } + n = buffers[i].len; + q = buffers[i].buf; + memcpy(p, q, n); + p += n; } - n = buffers[i].len; - q = buffers[i].buf; - memcpy(p, q, n); - p += n; + } + if (drop_gil) { + PyEval_RestoreThread(save); } goto done; @@ -138,3 +160,4 @@ done: } #undef NB_STATIC_BUFFERS +#undef GIL_THRESHOLD From e1e80002e28e1055f399a20918c49d50d093709e Mon Sep 17 00:00:00 2001 From: Joannah Nanjekye <33177550+nanjekyejoannah@users.noreply.github.com> Date: Wed, 29 Jan 2020 07:20:53 -0400 Subject: [PATCH 241/380] bpo-39153: Clarify C API *SetItem refcounting semantics (GH-18220) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some of the *SetItem methods in the C API steal a reference to the given value. This annotates the better behaved ones to assure the reader that these are not the ones with the inconsistent behaviour. * 📜🤖 Added by blurb_it. * make docs consistent with signature Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Doc/c-api/dict.rst | 9 +++++---- Doc/c-api/mapping.rst | 3 ++- Doc/c-api/object.rst | 3 ++- .../2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst | 5 +++++ 4 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index e7922dc0c73..e48c11d336b 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -62,19 +62,20 @@ Dictionary Objects .. c:function:: int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val) - Insert *value* into the dictionary *p* with a key of *key*. *key* must be + Insert *val* into the dictionary *p* with a key of *key*. *key* must be :term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return - ``0`` on success or ``-1`` on failure. + ``0`` on success or ``-1`` on failure. This function *does not* steal a + reference to *val*. .. c:function:: int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val) .. index:: single: PyUnicode_FromString() - Insert *value* into the dictionary *p* using *key* as a key. *key* should + Insert *val* into the dictionary *p* using *key* as a key. *key* should be a :c:type:`const char\*`. The key object is created using ``PyUnicode_FromString(key)``. Return ``0`` on success or ``-1`` on - failure. + failure. This function *does not* steal a reference to *val*. .. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key) diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 6a80b033b65..682160d1475 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -37,7 +37,8 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and Map the string *key* to the value *v* in object *o*. Returns ``-1`` on failure. This is the equivalent of the Python statement ``o[key] = v``. - See also :c:func:`PyObject_SetItem`. + See also :c:func:`PyObject_SetItem`. This function *does not* steal a + reference to *v*. .. c:function:: int PyMapping_DelItem(PyObject *o, PyObject *key) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index ca9db1aee2f..2905fbbd0f7 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -331,7 +331,8 @@ Object Protocol Map the object *key* to the value *v*. Raise an exception and return ``-1`` on failure; return ``0`` on success. This is the - equivalent of the Python statement ``o[key] = v``. + equivalent of the Python statement ``o[key] = v``. This function *does + not* steal a reference to *v*. .. c:function:: int PyObject_DelItem(PyObject *o, PyObject *key) diff --git a/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst new file mode 100644 index 00000000000..95be00b4b77 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-27-22-24-51.bpo-39153.Pjl8jV.rst @@ -0,0 +1,5 @@ +Clarify refcounting semantics for the following functions: +- PyObject_SetItem +- PyMapping_SetItemString +- PyDict_SetItem +- PyDict_SetItemString \ No newline at end of file From 35eac4500a8bd89b087407f59ba337343b22d403 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Wed, 29 Jan 2020 14:10:54 +0100 Subject: [PATCH 242/380] Doc: Fix external links to functional programming tutorial. (GH-18249) --- Doc/howto/functional.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index f8f2aac70f9..74e861480d2 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -1229,9 +1229,9 @@ Text Processing". Mertz also wrote a 3-part series of articles on functional programming for IBM's DeveloperWorks site; see -`part 1 `__, -`part 2 `__, and -`part 3 `__, +`part 1 `__, +`part 2 `__, and +`part 3 `__, Python documentation From 3cb49b62e61208efcefbc04414e769fc173f205d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 29 Jan 2020 15:23:29 +0100 Subject: [PATCH 243/380] bpo-39460: Fix test_zipfile.test_add_file_after_2107() (GH-18247) XFS filesystem is limited to 32-bit timestamp, but the utimensat() syscall doesn't fail. Moreover, there is a VFS bug which returns a cached timestamp which is different than the value on disk. https://bugzilla.redhat.com/show_bug.cgi?id=1795576 https://bugs.python.org/issue39460#msg360952 --- Lib/test/test_zipfile.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 66f05ac1f3a..4c20bfd7e2c 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -616,6 +616,18 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') + mtime_ns = os.stat(TESTFN).st_mtime_ns + if mtime_ns != (4386268800 * 10**9): + # XFS filesystem is limited to 32-bit timestamp, but the syscall + # didn't fail. Moreover, there is a VFS bug which returns + # a cached timestamp which is different than the value on disk. + # + # Test st_mtime_ns rather than st_mtime to avoid rounding issues. + # + # https://bugzilla.redhat.com/show_bug.cgi?id=1795576 + # https://bugs.python.org/issue39460#msg360952 + self.skipTest(f"Linux VFS/XFS kernel bug detected: {mtime_ns=}") + with zipfile.ZipFile(TESTFN2, "w") as zipfp: self.assertRaises(struct.error, zipfp.write, TESTFN) From a327677905956ae0b239ff430a1346dfe265709e Mon Sep 17 00:00:00 2001 From: Carl Friedrich Bolz-Tereick Date: Wed, 29 Jan 2020 16:43:37 +0100 Subject: [PATCH 244/380] bpo-39485: fix corner-case in method-detection of mock (GH-18252) Replace check for whether something is a method in the mock module. The previous version fails on PyPy, because there no method wrappers exist (everything looks like a regular Python-defined function). Thus the isinstance(getattr(result, '__get__', None), MethodWrapperTypes) check returns True for any descriptor, not just methods. This condition could also return erroneously True in CPython for C-defined descriptors. Instead to decide whether something is a method, just check directly whether it's a function defined on the class. This passes all tests on CPython and fixes the bug on PyPy. --- Lib/unittest/mock.py | 6 +----- .../next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst | 3 +++ 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index a3d8b6eab41..37ea5c7e45c 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2748,7 +2748,7 @@ def _must_skip(spec, entry, is_type): continue if isinstance(result, (staticmethod, classmethod)): return False - elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes): + elif isinstance(result, FunctionTypes): # Normal method => skip if looked up on type # (if looked up on instance, self is already skipped) return is_type @@ -2778,10 +2778,6 @@ FunctionTypes = ( type(ANY.__eq__), ) -MethodWrapperTypes = ( - type(ANY.__eq__.__get__), -) - file_spec = None diff --git a/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst new file mode 100644 index 00000000000..f62c31fc686 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-29-14-58-27.bpo-39485.Zy3ot6.rst @@ -0,0 +1,3 @@ +Fix a bug in :func:`unittest.mock.create_autospec` that would complain about +the wrong number of arguments for custom descriptors defined in an extension +module returning functions. From db5e86adbce12350c26e7ffc2c6673369971a2dc Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Wed, 29 Jan 2020 16:24:54 +0000 Subject: [PATCH 245/380] Get mock coverage back to 100% (GH-18228) * use the `: pass` and `: yield` patterns for code that isn't expected to ever be executed. * The _Call items passed to _AnyComparer are only ever of length two, so assert instead of if/else * fix typo * Fix bug, where stop-without-start patching dict blows up with `TypeError: 'NoneType' object is not iterable`, highlighted by lack of coverage of an except branch. * The fix for bpo-37972 means _Call.count and _Call.index are no longer needed. * add coverage for calling next() on a mock_open with readline.return_value set. * __aiter__ is defined on the Mock so the one on _AsyncIterator is never called. --- Lib/unittest/mock.py | 17 ++----- Lib/unittest/test/testmock/testasync.py | 59 ++++++++----------------- Lib/unittest/test/testmock/testmock.py | 5 +++ Lib/unittest/test/testmock/testpatch.py | 8 ++++ 4 files changed, 35 insertions(+), 54 deletions(-) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 37ea5c7e45c..9e692981a22 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1042,8 +1042,7 @@ class _AnyComparer(list): the left.""" def __contains__(self, item): for _call in self: - if len(item) != len(_call): - continue + assert len(item) == len(_call) if all([ expected == actual for expected, actual in zip(item, _call) @@ -1856,7 +1855,8 @@ class _patch_dict(object): def __exit__(self, *args): """Unpatch the dict.""" - self._unpatch_dict() + if self._original is not None: + self._unpatch_dict() return False @@ -2168,7 +2168,7 @@ class AsyncMockMixin(Base): self.__dict__['__code__'] = code_mock async def _execute_mock_call(self, /, *args, **kwargs): - # This is nearly just like super(), except for sepcial handling + # This is nearly just like super(), except for special handling # of coroutines _call = self.call_args @@ -2541,12 +2541,6 @@ class _Call(tuple): return tuple.__getattribute__(self, attr) - def count(self, /, *args, **kwargs): - return self.__getattr__('count')(*args, **kwargs) - - def index(self, /, *args, **kwargs): - return self.__getattr__('index')(*args, **kwargs) - def _get_call_arguments(self): if len(self) == 2: args, kwargs = self @@ -2917,9 +2911,6 @@ class _AsyncIterator: code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE self.__dict__['__code__'] = code_mock - def __aiter__(self): - return self - async def __anext__(self): try: return next(self.iterator) diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 992076db787..bf936220cca 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -16,38 +16,28 @@ def tearDownModule(): class AsyncClass: - def __init__(self): - pass - async def async_method(self): - pass - def normal_method(self): - pass + def __init__(self): pass + async def async_method(self): pass + def normal_method(self): pass @classmethod - async def async_class_method(cls): - pass + async def async_class_method(cls): pass @staticmethod - async def async_static_method(): - pass + async def async_static_method(): pass class AwaitableClass: - def __await__(self): - yield + def __await__(self): yield -async def async_func(): - pass +async def async_func(): pass -async def async_func_args(a, b, *, c): - pass +async def async_func_args(a, b, *, c): pass -def normal_func(): - pass +def normal_func(): pass class NormalClass(object): - def a(self): - pass + def a(self): pass async_foo_name = f'{__name__}.AsyncClass' @@ -402,8 +392,7 @@ class AsyncSpecSetTest(unittest.TestCase): class AsyncArguments(IsolatedAsyncioTestCase): async def test_add_return_value(self): - async def addition(self, var): - return var + 1 + async def addition(self, var): pass mock = AsyncMock(addition, return_value=10) output = await mock(5) @@ -411,8 +400,7 @@ class AsyncArguments(IsolatedAsyncioTestCase): self.assertEqual(output, 10) async def test_add_side_effect_exception(self): - async def addition(var): - return var + 1 + async def addition(var): pass mock = AsyncMock(addition, side_effect=Exception('err')) with self.assertRaises(Exception): await mock(5) @@ -553,18 +541,14 @@ class AsyncMagicMethods(unittest.TestCase): class AsyncContextManagerTest(unittest.TestCase): class WithAsyncContextManager: - async def __aenter__(self, *args, **kwargs): - return self + async def __aenter__(self, *args, **kwargs): pass - async def __aexit__(self, *args, **kwargs): - pass + async def __aexit__(self, *args, **kwargs): pass class WithSyncContextManager: - def __enter__(self, *args, **kwargs): - return self + def __enter__(self, *args, **kwargs): pass - def __exit__(self, *args, **kwargs): - pass + def __exit__(self, *args, **kwargs): pass class ProductionCode: # Example real-world(ish) code @@ -673,16 +657,9 @@ class AsyncIteratorTest(unittest.TestCase): def __init__(self): self.items = ["foo", "NormalFoo", "baz"] - def __aiter__(self): - return self + def __aiter__(self): pass - async def __anext__(self): - try: - return self.items.pop() - except IndexError: - pass - - raise StopAsyncIteration + async def __anext__(self): pass def test_aiter_set_return_value(self): mock_iter = AsyncMock(name="tester") diff --git a/Lib/unittest/test/testmock/testmock.py b/Lib/unittest/test/testmock/testmock.py index 677346725bd..9b9e066cc54 100644 --- a/Lib/unittest/test/testmock/testmock.py +++ b/Lib/unittest/test/testmock/testmock.py @@ -1868,6 +1868,11 @@ class MockTest(unittest.TestCase): with self.assertRaises(StopIteration): next(f1) + def test_mock_open_next_with_readline_with_return_value(self): + mopen = mock.mock_open(read_data='foo\nbarn') + mopen.return_value.readline.return_value = 'abc' + self.assertEqual('abc', next(mopen())) + def test_mock_open_write(self): # Test exception in file writing write() mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV')) diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 438dfd8cfbc..f1bc0e1cd40 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -770,6 +770,14 @@ class PatchTest(unittest.TestCase): self.assertEqual(d, original) + def test_patch_dict_stop_without_start(self): + d = {'foo': 'bar'} + original = d.copy() + patcher = patch.dict(d, [('spam', 'eggs')], clear=True) + self.assertEqual(patcher.stop(), False) + self.assertEqual(d, original) + + def test_patch_dict_class_decorator(self): this = self d = {'spam': 'eggs'} From 5428f48b6308c7fd71636077f2ebc307c9a53d03 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 29 Jan 2020 19:22:11 +0100 Subject: [PATCH 246/380] Remove deadcode in _Py_inc_count() (GH-18257) (tp->tp_next != NULL) check became redundant with commit 45294a9562e5c360ee8ef8498d8792e05a6eb25e (merged in 2006). --- Objects/object.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index 6fc114621c1..14533dba16d 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -182,8 +182,6 @@ _Py_inc_count(PyTypeObject *tp) { if (tp->tp_next == NULL && tp->tp_prev == NULL) { /* first time; insert in linked list */ - if (tp->tp_next != NULL) /* sanity check */ - Py_FatalError("XXX _Py_inc_count sanity check"); if (type_list) type_list->tp_prev = tp; tp->tp_next = type_list; From d47d0c8e9f2ca0f9f5d1bf0b35006a9a4d5ca684 Mon Sep 17 00:00:00 2001 From: Bonifacio de Oliveira Date: Wed, 29 Jan 2020 23:23:50 -0300 Subject: [PATCH 247/380] Improve grammar in the import system reference documentation (GH-18209) Replaced the period with a comma. Automerge-Triggered-By: @Mariatta --- 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 20a2ea69e2d..4c36e15dc06 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -857,7 +857,7 @@ 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 +:term:`portion`, the path entry finder sets "loader" on the spec to ``None`` and "submodule_search_locations" to a list containing the portion. From 2e6569b6692298fcc9aae0df3eb3181adb2a5099 Mon Sep 17 00:00:00 2001 From: Shantanu Date: Wed, 29 Jan 2020 18:52:36 -0800 Subject: [PATCH 248/380] bpo-39493: Fix definition of IO.closed in typing.py (#18265) --- Lib/typing.py | 1 + .../NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst | 1 + 2 files changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst diff --git a/Lib/typing.py b/Lib/typing.py index 7de3e346eaa..28c887ed35e 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1831,6 +1831,7 @@ class IO(Generic[AnyStr]): def close(self) -> None: pass + @property @abstractmethod def closed(self) -> bool: pass diff --git a/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst new file mode 100644 index 00000000000..b676629a441 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-01-13-19.bpo-39493.CbFRi7.rst @@ -0,0 +1 @@ +Mark ``typing.IO.closed`` as a property \ No newline at end of file From 188bb5b1e868eecf2342195dc45caa332ac3b6c7 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Wed, 29 Jan 2020 21:12:53 -0700 Subject: [PATCH 249/380] bpo-39494: Remove extra null terminators from kwlist vars (GH-18267) --- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/module.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 45f5865590d..47dbc774741 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -773,7 +773,7 @@ PyObject* pysqlite_cursor_fetchone(pysqlite_Cursor* self, PyObject* args) PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"size", NULL, NULL}; + static char *kwlist[] = {"size", NULL}; PyObject* row; PyObject* list; diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index d5c353ea7be..4d9d3d41c7b 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -105,7 +105,7 @@ RAM instead of on disk."); static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"statement", NULL, NULL}; + static char *kwlist[] = {"statement", NULL}; char* statement; PyObject* result; @@ -135,7 +135,7 @@ Checks if a string contains a complete SQL statement. Non-standard."); static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) { - static char *kwlist[] = {"do_enable", NULL, NULL}; + static char *kwlist[] = {"do_enable", NULL}; int do_enable; int rc; From 5eb8bff7e4aa7e4d8580a30323641388c8ff59a5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 09:01:07 +0100 Subject: [PATCH 250/380] bpo-38631: Replace Py_FatalError() with _PyObject_ASSERT_FAILED_MSG() (GH-18258) Replace Py_FatalError() with _PyObject_ASSERT_FAILED_MSG() in object.c and typeobject.c to also dump the involved Python object on a fatal error. It should ease debug when such fatal error occurs. If the double linked list is inconsistent, _Py_ForgetReference() no longer dumps previous and next objects in the fatal error, it now only dumps the current object. It ensures that the error message is displayed even if dumping the object does crash Python. Enhance _Py_ForgetReference() error messages; _PyObject_ASSERT_FAILED_MSG() logs the "_Py_ForgetReference" function name. --- Objects/object.c | 62 ++++++++++++++++++++++---------------------- Objects/typeobject.c | 4 +-- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index 14533dba16d..aa84114c554 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -315,30 +315,30 @@ PyObject_CallFinalizer(PyObject *self) int PyObject_CallFinalizerFromDealloc(PyObject *self) { - Py_ssize_t refcnt; + if (self->ob_refcnt != 0) { + _PyObject_ASSERT_FAILED_MSG(self, + "PyObject_CallFinalizerFromDealloc called " + "on object with a non-zero refcount"); + } /* Temporarily resurrect the object. */ - if (self->ob_refcnt != 0) { - Py_FatalError("PyObject_CallFinalizerFromDealloc called on " - "object with a non-zero refcount"); - } self->ob_refcnt = 1; PyObject_CallFinalizer(self); - /* Undo the temporary resurrection; can't use DECREF here, it would - * cause a recursive call. - */ _PyObject_ASSERT_WITH_MSG(self, self->ob_refcnt > 0, "refcount is too small"); - if (--self->ob_refcnt == 0) + + /* Undo the temporary resurrection; can't use DECREF here, it would + * cause a recursive call. */ + if (--self->ob_refcnt == 0) { return 0; /* this is the normal path out */ + } /* tp_finalize resurrected it! Make it look like the original Py_DECREF - * never happened. - */ - refcnt = self->ob_refcnt; + * never happened. */ + Py_ssize_t refcnt = self->ob_refcnt; _Py_NewReference(self); self->ob_refcnt = refcnt; @@ -352,8 +352,7 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) * chain, so no more to do there. * If COUNT_ALLOCS, the original decref bumped tp_frees, and * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ + * undone. */ #ifdef COUNT_ALLOCS --Py_TYPE(self)->tp_frees; --Py_TYPE(self)->tp_allocs; @@ -1938,29 +1937,30 @@ _Py_NewReference(PyObject *op) void _Py_ForgetReference(PyObject *op) { + if (op->ob_refcnt < 0) { + _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt"); + } + + if (op == &refchain || + op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) + { + _PyObject_ASSERT_FAILED_MSG(op, "invalid object chain"); + } + #ifdef SLOW_UNREF_CHECK PyObject *p; -#endif - if (op->ob_refcnt < 0) - Py_FatalError("UNREF negative refcnt"); - if (op == &refchain || - op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { - fprintf(stderr, "* ob\n"); - _PyObject_Dump(op); - fprintf(stderr, "* op->_ob_prev->_ob_next\n"); - _PyObject_Dump(op->_ob_prev->_ob_next); - fprintf(stderr, "* op->_ob_next->_ob_prev\n"); - _PyObject_Dump(op->_ob_next->_ob_prev); - Py_FatalError("UNREF invalid object"); - } -#ifdef SLOW_UNREF_CHECK for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { - if (p == op) + if (p == op) { break; + } + } + if (p == &refchain) { + /* Not found */ + _PyObject_ASSERT_FAILED_MSG(op, + "object not found in the objects list"); } - if (p == &refchain) /* Not found */ - Py_FatalError("UNREF unknown object"); #endif + op->_ob_next->_ob_prev = op->_ob_prev; op->_ob_prev->_ob_next = op->_ob_next; op->_ob_next = op->_ob_prev = NULL; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 720363410ce..5773eb7096e 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3570,9 +3570,9 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) for heaptypes. */ if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { char msg[200]; - sprintf(msg, "type_traverse() called for non-heap type '%.100s'", + sprintf(msg, "type_traverse() called on non-heap type '%.100s'", type->tp_name); - Py_FatalError(msg); + _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg); } Py_VISIT(type->tp_dict); From 7a1f6c2da46a04d0ff0acc01542f30bfeaf0e0c7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 09:02:14 +0100 Subject: [PATCH 251/380] bpo-38631: Avoid Py_FatalError() in init_slotdefs() (GH-18263) Rename init_slotdefs() to _PyTypes_InitSlotDefs() and add a return value of type PyStatus. The function is now called exactly once from _PyTypes_Init(). Replace calls to init_slotdefs() with an assertion checking that slotdefs is initialized. --- Include/internal/pycore_pylifecycle.h | 1 + Objects/object.c | 6 +++++ Objects/typeobject.c | 35 +++++++++++++++------------ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 72923498dec..2dd6149a6b3 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -51,6 +51,7 @@ extern int _PyFloat_Init(void); 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); diff --git a/Objects/object.c b/Objects/object.c index aa84114c554..c5d28e5f8d7 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -6,6 +6,7 @@ #include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" +#include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "frameobject.h" #include "interpreteridobject.h" @@ -1841,6 +1842,11 @@ PyObject _Py_NotImplementedStruct = { PyStatus _PyTypes_Init(void) { + PyStatus status = _PyTypes_InitSlotDefs(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + #define INIT_TYPE(TYPE, NAME) \ do { \ if (PyType_Ready(TYPE) < 0) { \ diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 5773eb7096e..b095e2921dc 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2,6 +2,7 @@ #include "Python.h" #include "pycore_call.h" +#include "pycore_initconfig.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" @@ -6932,7 +6933,8 @@ which incorporates the additional structures used for numbers, sequences and mappings. Note that multiple names may map to the same slot (e.g. __eq__, __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with -an all-zero entry. (This table is further initialized in init_slotdefs().) +an all-zero entry. (This table is further initialized in +_PyTypes_InitSlotDefs().) */ typedef struct wrapperbase slotdef; @@ -7423,28 +7425,29 @@ update_slots_callback(PyTypeObject *type, void *data) static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ -static void -init_slotdefs(void) +PyStatus +_PyTypes_InitSlotDefs(void) { - slotdef *p; + if (slotdefs_initialized) { + return _PyStatus_OK(); + } - if (slotdefs_initialized) - return; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ assert(!p[1].name || p->offset <= p[1].offset); p->name_strobj = PyUnicode_InternFromString(p->name); - if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) - Py_FatalError("Out of memory interning slotdef names"); + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) { + return _PyStatus_NO_MEMORY(); + } } slotdefs_initialized = 1; + return _PyStatus_OK(); } -/* Undo init_slotdefs, releasing the interned strings. */ +/* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */ static void clear_slotdefs(void) { - slotdef *p; - for (p = slotdefs; p->name; p++) { + for (slotdef *p = slotdefs; p->name; p++) { Py_CLEAR(p->name_strobj); } slotdefs_initialized = 0; @@ -7462,7 +7465,7 @@ update_slot(PyTypeObject *type, PyObject *name) assert(PyUnicode_CheckExact(name)); assert(PyUnicode_CHECK_INTERNED(name)); - init_slotdefs(); + assert(slotdefs_initialized); pp = ptrs; for (p = slotdefs; p->name; p++) { if (p->name_strobj == name) @@ -7490,7 +7493,7 @@ fixup_slot_dispatchers(PyTypeObject *type) { slotdef *p; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; ) p = update_one_slot(type, p); } @@ -7503,7 +7506,7 @@ update_all_slots(PyTypeObject* type) /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */ PyType_Modified(type); - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { /* update_slot returns int but can't actually fail */ update_slot(type, p->name_strobj); @@ -7663,7 +7666,7 @@ add_operators(PyTypeObject *type) PyObject *descr; void **ptr; - init_slotdefs(); + assert(slotdefs_initialized); for (p = slotdefs; p->name; p++) { if (p->wrapper == NULL) continue; From 2bf127d97bd1d60ead7c20d429b0c61ef61fc554 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 09:02:49 +0100 Subject: [PATCH 252/380] bpo-38631: Replace tp_new_wrapper() fatal error with SystemError (GH-18262) tp_new_wrapper() now raises a SystemError if called with non-type self, rather than calling Py_FatalError() which cannot be catched. --- Objects/typeobject.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index b095e2921dc..8422a3c5a38 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6042,8 +6042,12 @@ tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds) PyTypeObject *type, *subtype, *staticbase; PyObject *arg0, *res; - if (self == NULL || !PyType_Check(self)) - Py_FatalError("__new__() called with non-type 'self'"); + if (self == NULL || !PyType_Check(self)) { + PyErr_Format(PyExc_SystemError, + "__new__() called with non-type 'self'"); + return NULL; + } + type = (PyTypeObject *)self; if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) { PyErr_Format(PyExc_TypeError, From c38fd0df2b4cbc1cc906d8dfe23f63b67cd6965f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 09:56:40 +0100 Subject: [PATCH 253/380] bpo-39353: binascii.crc_hqx() is no longer deprecated (GH-18276) The binascii.crc_hqx() function is no longer deprecated. --- Doc/library/binascii.rst | 2 -- Doc/whatsnew/3.9.rst | 1 - Lib/binhex.py | 6 ++---- Lib/test/test_binascii.py | 3 --- .../next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst | 1 + Modules/binascii.c | 5 ----- 6 files changed, 3 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index aa2a27084c3..2c0c1bce5d7 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -132,8 +132,6 @@ The :mod:`binascii` module defines the following functions: *x*:sup:`16` + *x*:sup:`12` + *x*:sup:`5` + 1, often represented as 0x1021. This CRC is used in the binhex4 format. - .. deprecated:: 3.9 - .. function:: crc32(data[, value]) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a4c4266bfc3..c8f407751ec 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -379,7 +379,6 @@ Deprecated * :func:`~binascii.b2a_hqx`, :func:`~binascii.a2b_hqx` * :func:`~binascii.rlecode_hqx`, :func:`~binascii.rledecode_hqx` - * :func:`~binascii.crc_hqx` (Contributed by Victor Stinner in :issue:`39353`.) diff --git a/Lib/binhex.py b/Lib/binhex.py index 6ff38dd8229..9559f46d5a2 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -200,8 +200,7 @@ class BinHex: self._writecrc() def _write(self, data): - with _ignore_deprecation_warning(): - self.crc = binascii.crc_hqx(data, self.crc) + self.crc = binascii.crc_hqx(data, self.crc) self.ofp.write(data) def _writecrc(self): @@ -396,8 +395,7 @@ class HexBin: def _read(self, len): data = self.ifp.read(len) - with _ignore_deprecation_warning(): - self.crc = binascii.crc_hqx(data, self.crc) + self.crc = binascii.crc_hqx(data, self.crc) return data def _checkcrc(self): diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index 649edbe2954..45327953a77 100644 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -435,9 +435,6 @@ class BinASCIITest(unittest.TestCase): with self.assertWarns(DeprecationWarning): self.assertEqual(binascii.rledecode_hqx(b'a\x90\n'), b'a' * 10) - with self.assertWarns(DeprecationWarning): - self.assertEqual(binascii.crc_hqx(b'abc', 0), 40406) - class ArrayBinASCIITest(BinASCIITest): def type2test(self, s): diff --git a/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst b/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst new file mode 100644 index 00000000000..b6db7c5c588 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-30-09-07-16.bpo-39353.wTl9hc.rst @@ -0,0 +1 @@ +The :func:`binascii.crc_hqx` function is no longer deprecated. diff --git a/Modules/binascii.c b/Modules/binascii.c index c6da3e0a635..e428b0d6f96 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -965,11 +965,6 @@ static PyObject * binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc) /*[clinic end generated code: output=2fde213d0f547a98 input=56237755370a951c]*/ { - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "binascii.crc_hqx() is deprecated", 1) < 0) { - return NULL; - } - const unsigned char *bin_data; Py_ssize_t len; From 1f44e775df8e7ec3ca60a1135cb3279f8b9dca3e Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Thu, 30 Jan 2020 02:39:26 -0700 Subject: [PATCH 254/380] bpo-39497: Remove unused variable from pysqlite_cursor_executescript (GH-18271) --- Modules/_sqlite/cursor.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 47dbc774741..2302ca9edac 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -611,7 +611,6 @@ static PyObject * pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) { PyObject* script_obj; - PyObject* script_str = NULL; const char* script_cstr; sqlite3_stmt* statement; int rc; @@ -685,8 +684,6 @@ pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args) } error: - Py_XDECREF(script_str); - if (PyErr_Occurred()) { return NULL; } else { From 38c878b56cff997de8fb04a586c963039b69b414 Mon Sep 17 00:00:00 2001 From: damani42 <56308939+damani42@users.noreply.github.com> Date: Thu, 30 Jan 2020 11:26:22 +0100 Subject: [PATCH 255/380] bpo-39424: Use assertRaisesRegex instead of assertRaisesRegexp. (GH-18277) --- Lib/test/test_signal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py index 5b072b0c60e..45553a6a42d 100644 --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -1289,7 +1289,7 @@ class PidfdSignalTest(unittest.TestCase): self.assertEqual(cm.exception.errno, errno.EBADF) my_pidfd = os.open(f'/proc/{os.getpid()}', os.O_DIRECTORY) self.addCleanup(os.close, my_pidfd) - with self.assertRaisesRegexp(TypeError, "^siginfo must be None$"): + with self.assertRaisesRegex(TypeError, "^siginfo must be None$"): signal.pidfd_send_signal(my_pidfd, signal.SIGINT, object(), 0) with self.assertRaises(KeyboardInterrupt): signal.pidfd_send_signal(my_pidfd, signal.SIGINT) From ec3c99c8a73650d7833189bd973ec492564aa479 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 12:18:32 +0100 Subject: [PATCH 256/380] bpo-38631: Avoid Py_FatalError() in unicodeobject.c (GH-18281) Replace Py_FatalError() calls with _PyErr_WriteUnraisableMsg(), _PyObject_ASSERT_FAILED_MSG() or Py_UNREACHABLE() in unicode_dealloc() and unicode_release_interned(). --- Objects/unicodeobject.c | 51 ++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 1ec2accdb09..8e1161e5387 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1900,25 +1900,29 @@ unicode_dealloc(PyObject *unicode) case SSTATE_INTERNED_MORTAL: /* revive dead object temporarily for DelItem */ Py_REFCNT(unicode) = 3; - if (PyDict_DelItem(interned, unicode) != 0) - Py_FatalError( - "deletion of interned string failed"); + if (PyDict_DelItem(interned, unicode) != 0) { + _PyErr_WriteUnraisableMsg("deletion of interned string failed", + NULL); + } break; case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned string died."); - /* fall through */ + _PyObject_ASSERT_FAILED_MSG(unicode, "Immortal interned string died"); + break; default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } - if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) + if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) + } + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { PyObject_DEL(_PyUnicode_UTF8(unicode)); - if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) + } + if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) { PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); + } Py_TYPE(unicode)->tp_free(unicode); } @@ -15401,14 +15405,10 @@ PyUnicode_InternFromString(const char *cp) static void unicode_release_interned(void) { - PyObject *keys; - PyObject *s; - Py_ssize_t i, n; - Py_ssize_t immortal_size = 0, mortal_size = 0; - - if (interned == NULL || !PyDict_Check(interned)) + if (interned == NULL || !PyDict_Check(interned)) { return; - keys = PyDict_Keys(interned); + } + PyObject *keys = PyDict_Keys(interned); if (keys == NULL || !PyList_Check(keys)) { PyErr_Clear(); return; @@ -15419,30 +15419,35 @@ unicode_release_interned(void) rather, we give them their stolen references back, and then clear and DECREF the interned dict. */ - n = PyList_GET_SIZE(keys); + Py_ssize_t n = PyList_GET_SIZE(keys); #ifdef INTERNED_STATS fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); + + Py_ssize_t immortal_size = 0, mortal_size = 0; #endif - for (i = 0; i < n; i++) { - s = PyList_GET_ITEM(keys, i); + for (Py_ssize_t i = 0; i < n; i++) { + PyObject *s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { Py_UNREACHABLE(); } switch (PyUnicode_CHECK_INTERNED(s)) { - case SSTATE_NOT_INTERNED: - /* XXX Shouldn't happen */ - break; case SSTATE_INTERNED_IMMORTAL: Py_REFCNT(s) += 1; +#ifdef INTERNED_STATS immortal_size += PyUnicode_GET_LENGTH(s); +#endif break; case SSTATE_INTERNED_MORTAL: Py_REFCNT(s) += 2; +#ifdef INTERNED_STATS mortal_size += PyUnicode_GET_LENGTH(s); +#endif break; + case SSTATE_NOT_INTERNED: + /* fall through */ default: - Py_FatalError("Inconsistent interned string state."); + Py_UNREACHABLE(); } _PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED; } From 17c68b8107e348aeaaa05f7ac5072cacff916022 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 12:20:48 +0100 Subject: [PATCH 257/380] bpo-38631: Replace Py_FatalError() with assert() in ceval.c (GH-18279) Replace a few Py_FatalError() calls if tstate is NULL with assert(tstate != NULL) in ceval.c. PyEval_AcquireThread(), PyEval_ReleaseThread() and PyEval_RestoreThread() must never be called with a NULL tstate. --- Doc/c-api/init.rst | 2 +- Python/ceval.c | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 8913dbfe249..7ea48aec009 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1110,7 +1110,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate) Acquire the global interpreter lock and set the current thread state to - *tstate*, which should not be ``NULL``. The lock must have been created earlier. + *tstate*, which must not be ``NULL``. The lock must have been created earlier. If this thread already has the lock, deadlock ensues. .. note:: diff --git a/Python/ceval.c b/Python/ceval.c index 2770dc6d08d..2bf64eda422 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -302,9 +302,7 @@ PyEval_ReleaseLock(void) void PyEval_AcquireThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_AcquireThread: NULL new thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; @@ -321,9 +319,7 @@ PyEval_AcquireThread(PyThreadState *tstate) void PyEval_ReleaseThread(PyThreadState *tstate) { - if (tstate == NULL) { - Py_FatalError("PyEval_ReleaseThread: NULL thread state"); - } + assert(tstate != NULL); _PyRuntimeState *runtime = tstate->interp->runtime; PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL); @@ -385,12 +381,10 @@ PyEval_SaveThread(void) void PyEval_RestoreThread(PyThreadState *tstate) { + assert(tstate != NULL); + _PyRuntimeState *runtime = tstate->interp->runtime; struct _ceval_runtime_state *ceval = &runtime->ceval; - - if (tstate == NULL) { - Py_FatalError("PyEval_RestoreThread: NULL tstate"); - } assert(gil_created(&ceval->gil)); int err = errno; From 2a4903fcce54c25807d362dbbbcfb32d0b494f9f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 13:09:11 +0100 Subject: [PATCH 258/380] bpo-38631: Add _Py_NO_RETURN to functions calling Py_FatalError() (GH-18278) Add _Py_NO_RETURN to functions calling Py_FatalError(): * _PyObject_AssertFailed() * dummy_dealloc() * faulthandler_fatal_error_thread() * none_dealloc() * notimplemented_dealloc() --- Include/cpython/object.h | 2 +- Modules/faulthandler.c | 16 +--------------- Objects/object.c | 6 +++--- Objects/setobject.c | 2 +- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 75e55995b57..dc8fd6fa898 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -443,7 +443,7 @@ _PyObject_DebugTypeStats(FILE *out); NDEBUG against a Python built with NDEBUG defined. msg, expr and function can be NULL. */ -PyAPI_FUNC(void) _PyObject_AssertFailed( +PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed( PyObject *obj, const char *expr, const char *msg, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index b19401e94d8..555e1afc9f8 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1065,24 +1065,10 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) Py_RETURN_NONE; } -static void +static void _Py_NO_RETURN faulthandler_fatal_error_thread(void *plock) { -#ifndef __clang__ - PyThread_type_lock *lock = (PyThread_type_lock *)plock; -#endif - Py_FatalError("in new thread"); - -#ifndef __clang__ - /* Issue #28152: Py_FatalError() is declared with - __attribute__((__noreturn__)). GCC emits a warning without - "PyThread_release_lock()" (compiler bug?), but Clang is smarter and - emits a warning on the return. */ - - /* notify the caller that we are done */ - PyThread_release_lock(lock); -#endif } static PyObject * diff --git a/Objects/object.c b/Objects/object.c index c5d28e5f8d7..67a6386e2a5 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1646,7 +1646,7 @@ none_repr(PyObject *op) } /* ARGUSED */ -static void +static void _Py_NO_RETURN none_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -1784,7 +1784,7 @@ notimplemented_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) Py_RETURN_NOTIMPLEMENTED; } -static void +static void _Py_NO_RETURN notimplemented_dealloc(PyObject* ignore) { /* This should never get called, but we also don't want to SEGV if @@ -2225,7 +2225,7 @@ _PyTrash_thread_destroy_chain(void) } -void +void _Py_NO_RETURN _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, const char *file, int line, const char *function) { diff --git a/Objects/setobject.c b/Objects/setobject.c index 924885d7505..bb7c0b8f045 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2529,7 +2529,7 @@ dummy_repr(PyObject *op) return PyUnicode_FromString(""); } -static void +static void _Py_NO_RETURN dummy_dealloc(PyObject* ignore) { Py_FatalError("deallocating "); From 8d49f7ceb4f961770ae61fe6a4033c4e61cc3288 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 30 Jan 2020 22:23:15 +0900 Subject: [PATCH 259/380] bpo-39434: Improve float __floordiv__ performance and error message (GH-18147) --- .../2020-01-24-01-07-04.bpo-39434.S5ehj9.rst | 3 + Objects/floatobject.c | 70 +++++++++++-------- 2 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst new file mode 100644 index 00000000000..e5a413323ac --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-24-01-07-04.bpo-39434.S5ehj9.rst @@ -0,0 +1,3 @@ +:term:`floor division` of float operation now has a better performance. Also +the message of :exc:`ZeroDivisionError` for this operation is updated. +Patch by Dong-hee Na. diff --git a/Objects/floatobject.c b/Objects/floatobject.c index d67f17abb5c..89f60b65cd5 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -611,29 +611,22 @@ float_rem(PyObject *v, PyObject *w) return PyFloat_FromDouble(mod); } -static PyObject * -float_divmod(PyObject *v, PyObject *w) +static void +_float_div_mod(double vx, double wx, double *floordiv, double *mod) { - double vx, wx; - double div, mod, floordiv; - CONVERT_TO_DOUBLE(v, vx); - CONVERT_TO_DOUBLE(w, wx); - if (wx == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); - return NULL; - } - mod = fmod(vx, wx); + double div; + *mod = fmod(vx, wx); /* fmod is typically exact, so vx-mod is *mathematically* an exact multiple of wx. But this is fp arithmetic, and fp vx - mod is an approximation; the result is that div may not be an exact integral value after the division, although it will always be very close to one. */ - div = (vx - mod) / wx; - if (mod) { + div = (vx - *mod) / wx; + if (*mod) { /* ensure the remainder has the same sign as the denominator */ - if ((wx < 0) != (mod < 0)) { - mod += wx; + if ((wx < 0) != (*mod < 0)) { + *mod += wx; div -= 1.0; } } @@ -641,34 +634,49 @@ float_divmod(PyObject *v, PyObject *w) /* the remainder is zero, and in the presence of signed zeroes fmod returns different results across platforms; ensure it has the same sign as the denominator. */ - mod = copysign(0.0, wx); + *mod = copysign(0.0, wx); } /* snap quotient to nearest integral value */ if (div) { - floordiv = floor(div); - if (div - floordiv > 0.5) - floordiv += 1.0; + *floordiv = floor(div); + if (div - *floordiv > 0.5) { + *floordiv += 1.0; + } } else { /* div is zero - get the same sign as the true quotient */ - floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ + *floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */ } - return Py_BuildValue("(dd)", floordiv, mod); +} + +static PyObject * +float_divmod(PyObject *v, PyObject *w) +{ + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return Py_BuildValue("(dd)", floordiv, mod); } static PyObject * float_floor_div(PyObject *v, PyObject *w) { - PyObject *t, *r; - - t = float_divmod(v, w); - if (t == NULL || t == Py_NotImplemented) - return t; - assert(PyTuple_CheckExact(t)); - r = PyTuple_GET_ITEM(t, 0); - Py_INCREF(r); - Py_DECREF(t); - return r; + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return PyFloat_FromDouble(floordiv); } /* determine whether x is an odd integer or not; assumes that From c232c9110cfefa0935cbf158e35e91746a8a9361 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Jan 2020 15:47:53 +0100 Subject: [PATCH 260/380] bpo-39502: Skip test_zipfile.test_add_file_after_2107() on AIX (GH-18282) Skip test_zipfile.test_add_file_after_2107() if time.localtime() fails with OverflowError. It is the case on AIX 6.1 for example. --- Lib/test/test_zipfile.py | 7 ++++++- .../next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 4c20bfd7e2c..c334715f3d8 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -611,8 +611,13 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, def test_add_file_after_2107(self): # Set atime and mtime to 2108-12-30 + ts = 4386268800 try: - os.utime(TESTFN, (4386268800, 4386268800)) + time.localtime(ts) + except OverflowError: + self.skipTest(f'time.localtime({ts}) raises OverflowError') + try: + os.utime(TESTFN, (ts, ts)) except OverflowError: self.skipTest('Host fs cannot set timestamp to required value.') diff --git a/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst new file mode 100644 index 00000000000..0a13746e347 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-01-30-15-04-54.bpo-39502.chbpII.rst @@ -0,0 +1,2 @@ +Skip test_zipfile.test_add_file_after_2107() if :func:`time.localtime` fails +with :exc:`OverflowError`. It is the case on AIX 6.1 for example. From 46874c26ee1fc752e2e6930efa1d223b2351edb8 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Thu, 30 Jan 2020 17:20:25 -0600 Subject: [PATCH 261/380] bpo-39487: Merge duplicated _Py_IDENTIFIER identifiers in C code (GH-18254) Moving repetitive `_Py_IDENTIFIER` instances to a global location helps identify them more easily in regards to sub-interpreter support. --- Objects/bytesobject.c | 4 ++-- Objects/descrobject.c | 4 ++-- Objects/fileobject.c | 4 ++-- Objects/iterobject.c | 4 ++-- Objects/moduleobject.c | 11 ++++------- Objects/odictobject.c | 5 ++--- Objects/rangeobject.c | 4 ++-- Objects/typeobject.c | 3 +-- Python/_warnings.c | 5 ++--- Python/ceval.c | 3 +-- Python/errors.c | 4 +--- Python/import.c | 7 +++---- 12 files changed, 24 insertions(+), 34 deletions(-) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index f9823f18e86..5fd92f72a53 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -25,6 +25,8 @@ Py_ssize_t _Py_null_strings, _Py_one_strings; static PyBytesObject *characters[UCHAR_MAX + 1]; static PyBytesObject *nullstring; +_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. @@ -543,7 +545,6 @@ static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { PyObject *func, *result; - _Py_IDENTIFIER(__bytes__); /* is it a bytes object? */ if (PyBytes_Check(v)) { *pbuf = PyBytes_AS_STRING(v); @@ -2485,7 +2486,6 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *func; Py_ssize_t size; static char *kwlist[] = {"source", "encoding", "errors", 0}; - _Py_IDENTIFIER(__bytes__); if (type != &PyBytes_Type) return bytes_subtype_new(type, args, kwds); diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 342b993e090..b9b16d6d0a3 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -6,6 +6,8 @@ #include "pycore_tupleobject.h" #include "structmember.h" /* Why is this not included in Python.h? */ +_Py_IDENTIFIER(getattr); + /*[clinic input] class mappingproxy "mappingproxyobject *" "&PyDictProxy_Type" class property "propertyobject *" "&PyProperty_Type" @@ -571,7 +573,6 @@ descr_get_qualname(PyDescrObject *descr, void *Py_UNUSED(ignored)) static PyObject * descr_reduce(PyDescrObject *descr, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), PyDescr_TYPE(descr), PyDescr_NAME(descr)); } @@ -1240,7 +1241,6 @@ wrapper_repr(wrapperobject *wp) static PyObject * wrapper_reduce(wrapperobject *wp, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(getattr); return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_getattr), wp->self, PyDescr_NAME(wp->descr)); } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 3ec5a00f30f..527693c8099 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -25,6 +25,8 @@ extern "C" { #endif +_Py_IDENTIFIER(open); + /* External C interface */ PyObject * @@ -32,7 +34,6 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c const char *errors, const char *newline, int closefd) { PyObject *io, *stream; - _Py_IDENTIFIER(open); /* import _io in case we are being used to open io.py */ io = PyImport_ImportModule("_io"); @@ -547,7 +548,6 @@ PyObject * PyFile_OpenCodeObject(PyObject *path) { PyObject *iomod, *f = NULL; - _Py_IDENTIFIER(open); if (!PyUnicode_Check(path)) { PyErr_Format(PyExc_TypeError, "'path' must be 'str', not '%.200s'", diff --git a/Objects/iterobject.c b/Objects/iterobject.c index da89298edc5..fe1de7e211c 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -11,6 +11,8 @@ typedef struct { PyObject *it_seq; /* Set to NULL when iterator is exhausted */ } seqiterobject; +_Py_IDENTIFIER(iter); + PyObject * PySeqIter_New(PyObject *seq) { @@ -104,7 +106,6 @@ PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list( static PyObject * iter_reduce(seqiterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_seq != NULL) return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter), it->it_seq, it->it_index); @@ -244,7 +245,6 @@ calliter_iternext(calliterobject *it) static PyObject * calliter_reduce(calliterobject *it, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); if (it->it_callable != NULL && it->it_sentinel != NULL) return Py_BuildValue("N(OO)", _PyEval_GetBuiltinId(&PyId_iter), it->it_callable, it->it_sentinel); diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 912c2584015..49cfd574d56 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -7,6 +7,10 @@ static Py_ssize_t max_module_number; +_Py_IDENTIFIER(__doc__); +_Py_IDENTIFIER(__name__); +_Py_IDENTIFIER(__spec__); + typedef struct { PyObject_HEAD PyObject *md_dict; @@ -58,11 +62,8 @@ static int module_init_dict(PyModuleObject *mod, PyObject *md_dict, PyObject *name, PyObject *doc) { - _Py_IDENTIFIER(__name__); - _Py_IDENTIFIER(__doc__); _Py_IDENTIFIER(__package__); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__spec__); if (md_dict == NULL) return -1; @@ -461,7 +462,6 @@ int PyModule_SetDocString(PyObject *m, const char *doc) { PyObject *v; - _Py_IDENTIFIER(__doc__); v = PyUnicode_FromString(doc); if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) { @@ -488,7 +488,6 @@ PyModule_GetDict(PyObject *m) PyObject* PyModule_GetNameObject(PyObject *m) { - _Py_IDENTIFIER(__name__); PyObject *d; PyObject *name; if (!PyModule_Check(m)) { @@ -741,10 +740,8 @@ module_getattro(PyModuleObject *m, PyObject *name) if (getattr) { return _PyObject_CallOneArg(getattr, name); } - _Py_IDENTIFIER(__name__); mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { - _Py_IDENTIFIER(__spec__); Py_INCREF(mod_name); PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__); Py_XINCREF(spec); diff --git a/Objects/odictobject.c b/Objects/odictobject.c index dfbd30a976c..45e089be287 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -526,6 +526,8 @@ struct _odictnode { #define _odict_FOREACH(od, node) \ for (node = _odict_FIRST(od); node != NULL; node = _odictnode_NEXT(node)) +_Py_IDENTIFIER(items); + /* Return the index into the hash table, regardless of a valid node. */ static Py_ssize_t _odict_get_index_raw(PyODictObject *od, PyObject *key, Py_hash_t hash) @@ -896,7 +898,6 @@ static PyObject * odict_reduce(register PyODictObject *od, PyObject *Py_UNUSED(ignored)) { _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(items); PyObject *dict = NULL, *result = NULL; PyObject *items_iter, *items, *args = NULL; @@ -1375,7 +1376,6 @@ static PyObject * odict_repr(PyODictObject *self) { int i; - _Py_IDENTIFIER(items); PyObject *pieces = NULL, *result = NULL; if (PyODict_SIZE(self) == 0) @@ -2195,7 +2195,6 @@ mutablemapping_update(PyObject *self, PyObject *args, PyObject *kwargs) { int res = 0; Py_ssize_t len; - _Py_IDENTIFIER(items); _Py_IDENTIFIER(keys); /* first handle args, if any */ diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 9311f8b1f17..e7168209324 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -18,6 +18,8 @@ typedef struct { PyObject *length; } rangeobject; +_Py_IDENTIFIER(iter); + /* Helper function for validating step. Always returns a new reference or NULL on error. */ @@ -757,7 +759,6 @@ PyDoc_STRVAR(length_hint_doc, static PyObject * rangeiter_reduce(rangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *start=NULL, *stop=NULL, *step=NULL; PyObject *range; @@ -915,7 +916,6 @@ longrangeiter_len(longrangeiterobject *r, PyObject *no_args) static PyObject * longrangeiter_reduce(longrangeiterobject *r, PyObject *Py_UNUSED(ignored)) { - _Py_IDENTIFIER(iter); PyObject *product, *stop=NULL; PyObject *range; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8422a3c5a38..01def837803 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -74,6 +74,7 @@ _Py_IDENTIFIER(__new__); _Py_IDENTIFIER(__set_name__); _Py_IDENTIFIER(__setitem__); _Py_IDENTIFIER(builtins); +_Py_IDENTIFIER(mro); static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -310,7 +311,6 @@ type_mro_modified(PyTypeObject *type, PyObject *bases) { return; if (custom) { - _Py_IDENTIFIER(mro); mro_meth = lookup_maybe_method( (PyObject *)type, &PyId_mro, &unbound); if (mro_meth == NULL) @@ -1891,7 +1891,6 @@ mro_invoke(PyTypeObject *type) int custom = (Py_TYPE(type) != &PyType_Type); if (custom) { - _Py_IDENTIFIER(mro); int unbound; PyObject *mro_meth = lookup_method((PyObject *)type, &PyId_mro, &unbound); diff --git a/Python/_warnings.c b/Python/_warnings.c index b8585d20478..602211c02ef 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -24,6 +24,8 @@ 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. */ static WarningsState * _Warnings_GetState() @@ -484,7 +486,6 @@ show_warning(PyObject *filename, int lineno, PyObject *text, PyObject *f_stderr; PyObject *name; char lineno_str[128]; - _Py_IDENTIFIER(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); @@ -818,7 +819,6 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno, PyObject **module, PyObject **registry) { _Py_IDENTIFIER(__warningregistry__); - _Py_IDENTIFIER(__name__); PyObject *globals; /* Setup globals, filename and lineno. */ @@ -969,7 +969,6 @@ get_source_line(PyObject *module_globals, int lineno) { _Py_IDENTIFIER(get_source); _Py_IDENTIFIER(__loader__); - _Py_IDENTIFIER(__name__); PyObject *loader; PyObject *module_name; PyObject *get_source; diff --git a/Python/ceval.c b/Python/ceval.c index 2bf64eda422..892d668816a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -39,6 +39,7 @@ # error "ceval.c must be build with Py_BUILD_CORE define for best performance" #endif +_Py_IDENTIFIER(__name__); /* Forward declarations */ Py_LOCAL_INLINE(PyObject *) call_function( @@ -5032,7 +5033,6 @@ static PyObject * import_from(PyThreadState *tstate, PyObject *v, PyObject *name) { PyObject *x; - _Py_IDENTIFIER(__name__); PyObject *fullmodname, *pkgname, *pkgpath, *pkgname_or_unknown, *errmsg; if (_PyObject_LookupAttr(v, name, &x) != 0) { @@ -5108,7 +5108,6 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) { _Py_IDENTIFIER(__all__); _Py_IDENTIFIER(__dict__); - _Py_IDENTIFIER(__name__); PyObject *all, *dict, *name, *value; int skip_leading_underscores = 0; int pos, err; diff --git a/Python/errors.c b/Python/errors.c index 18ea9c5652a..652f4c9de7a 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -24,11 +24,11 @@ extern char *strerror(int); extern "C" { #endif +_Py_IDENTIFIER(__module__); _Py_IDENTIFIER(builtins); _Py_IDENTIFIER(stderr); _Py_IDENTIFIER(flush); - /* Forward declarations */ static PyObject * _PyErr_FormatV(PyThreadState *tstate, PyObject *exception, @@ -1009,7 +1009,6 @@ PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) { PyThreadState *tstate = _PyThreadState_GET(); - _Py_IDENTIFIER(__module__); PyObject *modulename = NULL; PyObject *classname = NULL; PyObject *mydict = NULL; @@ -1235,7 +1234,6 @@ write_unraisable_exc_file(PyThreadState *tstate, PyObject *exc_type, } } - _Py_IDENTIFIER(__module__); PyObject *moduleName = _PyObject_GetAttrId(exc_type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); diff --git a/Python/import.c b/Python/import.c index 2e5f78382ed..9838c3fa045 100644 --- a/Python/import.c +++ b/Python/import.c @@ -39,6 +39,9 @@ extern struct _inittab _PyImport_Inittab[]; struct _inittab *PyImport_Inittab = _PyImport_Inittab; static struct _inittab *inittab_copy = NULL; +_Py_IDENTIFIER(__path__); +_Py_IDENTIFIER(__spec__); + /*[clinic input] module _imp [clinic start generated code]*/ @@ -383,7 +386,6 @@ import_ensure_initialized(PyThreadState *tstate, PyObject *mod, PyObject *name) PyInterpreterState *interp = tstate->interp; PyObject *spec; - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(_lock_unlock_module); /* Optimization: only call _bootstrap._lock_unlock_module() if @@ -1566,9 +1568,7 @@ done: static PyObject * resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level) { - _Py_IDENTIFIER(__spec__); _Py_IDENTIFIER(__package__); - _Py_IDENTIFIER(__path__); _Py_IDENTIFIER(__name__); _Py_IDENTIFIER(parent); PyObject *abs_name; @@ -1930,7 +1930,6 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, } } else { - _Py_IDENTIFIER(__path__); PyObject *path; if (_PyObject_LookupAttrId(mod, &PyId___path__, &path) < 0) { goto error; From bfdeaa37b3df7466624c17f9450d2bd1c3d95edf Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Thu, 30 Jan 2020 18:55:42 -0700 Subject: [PATCH 262/380] bpo-38792: Remove IDLE shell calltip before new prompt. (#17150) Previously, a calltip might be left after SyntaxError, KeyboardInterrupt, or Shell Restart. Co-authored-by: Terry Jan Reedy Co-authored-by: Tal Einat --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/calltip.py | 4 ++-- Lib/idlelib/editor.py | 2 +- Lib/idlelib/pyshell.py | 1 + .../NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst | 2 ++ 5 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 2b543985b37..d57ba7e6bac 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. + bpo-30780: Add remaining configdialog tests for buttons and highlights and keys tabs. diff --git a/Lib/idlelib/calltip.py b/Lib/idlelib/calltip.py index a3dda2678bd..2e0db60d476 100644 --- a/Lib/idlelib/calltip.py +++ b/Lib/idlelib/calltip.py @@ -33,7 +33,7 @@ class Calltip: # See __init__ for usage return calltip_w.CalltipWindow(self.text) - def _remove_calltip_window(self, event=None): + def remove_calltip_window(self, event=None): if self.active_calltip: self.active_calltip.hidetip() self.active_calltip = None @@ -55,7 +55,7 @@ class Calltip: self.open_calltip(False) def open_calltip(self, evalfuncs): - self._remove_calltip_window() + self.remove_calltip_window() hp = HyperParser(self.editwin, "insert") sur_paren = hp.get_surrounding_brackets('(') diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py index c9f1a1625ca..04c786dc523 100644 --- a/Lib/idlelib/editor.py +++ b/Lib/idlelib/editor.py @@ -328,7 +328,7 @@ class EditorWindow(object): text.bind("<>", scriptbinding.run_module_event) text.bind("<>", scriptbinding.run_custom_event) text.bind("<>", self.Rstrip(self).do_rstrip) - ctip = self.Calltip(self) + self.ctip = ctip = self.Calltip(self) text.bind("<>", ctip.try_open_calltip_event) #refresh-calltip must come after paren-closed to work right text.bind("<>", ctip.refresh_calltip_event) diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py index 065122dec7a..d5b310ffd7a 100755 --- a/Lib/idlelib/pyshell.py +++ b/Lib/idlelib/pyshell.py @@ -1292,6 +1292,7 @@ class PyShell(OutputWindow): self.text.insert("end-1c", "\n") self.text.mark_set("iomark", "end-1c") self.set_line_and_column() + self.ctip.remove_calltip_window() def write(self, s, tags=()): try: diff --git a/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst new file mode 100644 index 00000000000..9aa2f0ffddf --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-13-23-51-39.bpo-38792.xhTC5a.rst @@ -0,0 +1,2 @@ +Close an IDLE shell calltip if a :exc:`KeyboardInterrupt` +or shell restart occurs. Patch by Zackery Spytz. From 58a4054760bffbb20aff90290dd0f3554f7bea42 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Fri, 31 Jan 2020 10:50:14 +0100 Subject: [PATCH 263/380] Doc: Fix s/pseudo random/pseudo-random/ (GH-18289) --- Doc/library/random.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 933da3f8fcf..1eb39bbda42 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -343,8 +343,8 @@ Alternative Generator Notes on Reproducibility ------------------------ -Sometimes it is useful to be able to reproduce the sequences given by a pseudo -random number generator. By re-using a seed value, the same sequence should be +Sometimes it is useful to be able to reproduce the sequences given by a +pseudo-random number generator. By re-using a seed value, the same sequence should be reproducible from run to run as long as multiple threads are not running. Most of the random module's algorithms and seeding functions are subject to From f03a8f8d5001963ad5b5b28dbd95497e9cc15596 Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Fri, 31 Jan 2020 15:07:09 -0500 Subject: [PATCH 264/380] bpo-37224: Improve test__xxsubinterpreters.DestroyTests (GH-18058) Adds an additional assertion check based on a race condition for `test__xxsubinterpreters.DestroyTests.test_still_running` discovered in the bpo issue. https://bugs.python.org/issue37224 --- Lib/test/test__xxsubinterpreters.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__xxsubinterpreters.py index 207b5db5d8f..30f8f98acc9 100644 --- a/Lib/test/test__xxsubinterpreters.py +++ b/Lib/test/test__xxsubinterpreters.py @@ -759,7 +759,11 @@ class DestroyTests(TestBase): main, = interpreters.list_all() interp = interpreters.create() with _running(interp): - with self.assertRaises(RuntimeError): + self.assertTrue(interpreters.is_running(interp), + msg=f"Interp {interp} should be running before destruction.") + + with self.assertRaises(RuntimeError, + msg=f"Should not be able to destroy interp {interp} while it's still running."): interpreters.destroy(interp) self.assertTrue(interpreters.is_running(interp)) From 7dc140126e918cc7c6e65aea321b7255f0020798 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 1 Feb 2020 01:25:59 +0100 Subject: [PATCH 265/380] bpo-39511: Fix multiprocessing semlock_acquire() (GH-18298) The Python C API must not be used when the GIL is released: only access Py_None when the GIL is hold. --- Modules/_multiprocessing/semaphore.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Modules/_multiprocessing/semaphore.c b/Modules/_multiprocessing/semaphore.c index 4be2deae377..ee490256d2a 100644 --- a/Modules/_multiprocessing/semaphore.c +++ b/Modules/_multiprocessing/semaphore.c @@ -268,11 +268,8 @@ static PyObject * semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) { int blocking = 1, res, err = 0; - double timeout; PyObject *timeout_obj = Py_None; struct timespec deadline = {0}; - struct timeval now; - long sec, nsec; static char *kwlist[] = {"block", "timeout", NULL}; @@ -285,19 +282,23 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) Py_RETURN_TRUE; } - if (timeout_obj != Py_None) { - timeout = PyFloat_AsDouble(timeout_obj); - if (PyErr_Occurred()) + int use_deadline = (timeout_obj != Py_None); + if (use_deadline) { + double timeout = PyFloat_AsDouble(timeout_obj); + if (PyErr_Occurred()) { return NULL; - if (timeout < 0.0) + } + if (timeout < 0.0) { timeout = 0.0; + } + struct timeval now; if (gettimeofday(&now, NULL) < 0) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } - sec = (long) timeout; - nsec = (long) (1e9 * (timeout - sec) + 0.5); + long sec = (long) timeout; + long nsec = (long) (1e9 * (timeout - sec) + 0.5); deadline.tv_sec = now.tv_sec + sec; deadline.tv_nsec = now.tv_usec * 1000 + nsec; deadline.tv_sec += (deadline.tv_nsec / 1000000000); @@ -315,7 +316,7 @@ semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) /* Couldn't acquire immediately, need to block */ do { Py_BEGIN_ALLOW_THREADS - if (timeout_obj == Py_None) { + if (!use_deadline) { res = sem_wait(self->handle); } else { From 4d96b4635aeff1b8ad41d41422ce808ce0b971c8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 1 Feb 2020 02:30:25 +0100 Subject: [PATCH 266/380] bpo-39511: PyThreadState_Clear() calls on_delete (GH-18296) PyThreadState.on_delete is a callback used to notify Python when a thread completes. _thread._set_sentinel() function creates a lock which is released when the thread completes. It sets on_delete callback to the internal release_sentinel() function. This lock is known as Threading._tstate_lock in the threading module. The release_sentinel() function uses the Python C API. The problem is that on_delete is called late in the Python finalization, when the C API is no longer fully working. The PyThreadState_Clear() function now calls the PyThreadState.on_delete callback. Previously, that happened in PyThreadState_Delete(). The release_sentinel() function is now called when the C API is still fully working. --- Doc/c-api/init.rst | 4 ++++ .../next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst | 3 +++ Python/pystate.c | 8 +++++--- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 7ea48aec009..14049ee6420 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -1048,6 +1048,10 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Reset all information in a thread state object. The global interpreter lock must be held. + .. versionchanged:: 3.9 + This function now calls the :c:member:`PyThreadState.on_delete` callback. + Previously, that happened in :c:func:`PyThreadState_Delete`. + .. c:function:: void PyThreadState_Delete(PyThreadState *tstate) diff --git a/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst b/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst new file mode 100644 index 00000000000..14a04875a88 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-31-16-35-21.bpo-39511.nv9yEn.rst @@ -0,0 +1,3 @@ +The :c:func:`PyThreadState_Clear` function now calls the +:c:member:`PyThreadState.on_delete` callback. Previously, that happened in +:c:func:`PyThreadState_Delete`. diff --git a/Python/pystate.c b/Python/pystate.c index d792380de46..ebc17ea5a72 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -806,6 +806,10 @@ PyThreadState_Clear(PyThreadState *tstate) Py_CLEAR(tstate->async_gen_finalizer); Py_CLEAR(tstate->context); + + if (tstate->on_delete != NULL) { + tstate->on_delete(tstate->on_delete_data); + } } @@ -830,9 +834,7 @@ tstate_delete_common(PyThreadState *tstate, if (tstate->next) tstate->next->prev = tstate->prev; HEAD_UNLOCK(runtime); - if (tstate->on_delete != NULL) { - tstate->on_delete(tstate->on_delete_data); - } + PyMem_RawFree(tstate); if (gilstate->autoInterpreterState && From abb9a448dee3e18c69080231fbeba980bf048211 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Sat, 1 Feb 2020 03:08:34 -0800 Subject: [PATCH 267/380] Update sum comment. (#18240) --- Python/bltinmodule.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 4f833c1f462..5818eb9e38f 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2440,7 +2440,11 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) empty = [] sum([[x] for x in range(10)], empty) - would change the value of empty. */ + would change the value of empty. In fact, using + in-place addition rather that binary addition for + any of the steps introduces subtle behavior changes: + + https://bugs.python.org/issue18305 */ temp = PyNumber_Add(result, item); Py_DECREF(result); Py_DECREF(item); From 90d9ba6ef10af32e8dfe0649789c3a8ccf419e95 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sat, 1 Feb 2020 13:12:52 +0200 Subject: [PATCH 268/380] bpo-34793: Drop old-style context managers in asyncio.locks (GH-17533) --- Doc/library/asyncio-sync.rst | 4 +- Doc/whatsnew/3.9.rst | 5 + Lib/asyncio/locks.py | 83 --------- Lib/test/test_asyncio/test_locks.py | 165 ++++-------------- Lib/test/test_asyncio/test_pep492.py | 13 +- .../2019-12-09-17-24-29.bpo-34793.D82Dyu.rst | 3 + 6 files changed, 50 insertions(+), 223 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-09-17-24-29.bpo-34793.D82Dyu.rst diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index f080b03bc7c..84a52cb2d57 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -347,8 +347,8 @@ BoundedSemaphore --------- -.. deprecated:: 3.7 +.. versionchanged:: 3.9 Acquiring a lock using ``await lock`` or ``yield from lock`` and/or :keyword:`with` statement (``with await lock``, ``with (yield from - lock)``) is deprecated. Use ``async with lock`` instead. + lock)``) was removed. Use ``async with lock`` instead. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index c8f407751ec..ee37b5a5b72 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -470,6 +470,11 @@ Removed :exc:`DeprecationWarning` since Python 3.8. (Contributed by Inada Naoki in :issue:`39377`) +* ``with (await asyncio.lock):`` and ``with (yield from asyncio.lock):`` statements are + not longer supported, use ``async with lock`` instead. The same is correct for + ``asyncio.Condition`` and ``asyncio.Semaphore``. + (Contributed by Andrew Svetlov in :issue:`34793`.) + Porting to Python 3.9 ===================== diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d94daeb5a17..f1ce7324785 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -3,96 +3,13 @@ __all__ = ('Lock', 'Event', 'Condition', 'Semaphore', 'BoundedSemaphore') import collections -import types import warnings from . import events -from . import futures from . import exceptions -from .import coroutines - - -class _ContextManager: - """Context manager. - - This enables the following idiom for acquiring and releasing a - lock around a block: - - with (yield from lock): - - - while failing loudly when accidentally using: - - with lock: - - - Deprecated, use 'async with' statement: - async with lock: - - """ - - def __init__(self, lock): - self._lock = lock - - def __enter__(self): - # We have no use for the "as ..." clause in the with - # statement for locks. - return None - - def __exit__(self, *args): - try: - self._lock.release() - finally: - self._lock = None # Crudely prevent reuse. class _ContextManagerMixin: - def __enter__(self): - raise RuntimeError( - '"yield from" should be used as context manager expression') - - def __exit__(self, *args): - # This must exist because __enter__ exists, even though that - # always raises; that's how the with-statement works. - pass - - @types.coroutine - def __iter__(self): - # This is not a coroutine. It is meant to enable the idiom: - # - # with (yield from lock): - # - # - # as an alternative to: - # - # yield from lock.acquire() - # try: - # - # finally: - # lock.release() - # Deprecated, use 'async with' statement: - # async with lock: - # - warnings.warn("'with (yield from lock)' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - yield from self.acquire() - return _ContextManager(self) - - # The flag is needed for legacy asyncio.iscoroutine() - __iter__._is_coroutine = coroutines._is_coroutine - - async def __acquire_ctx(self): - await self.acquire() - return _ContextManager(self) - - def __await__(self): - warnings.warn("'with await lock' is deprecated " - "use 'async with lock' instead", - DeprecationWarning, stacklevel=2) - # To make "with await lock" work. - return self.__acquire_ctx().__await__() - async def __aenter__(self): await self.acquire() # We have no use for the "as ..." clause in the with diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py index 9468e740b3c..8c93fae2b51 100644 --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -47,13 +47,7 @@ class LockTests(test_utils.TestCase): self.assertTrue(repr(lock).endswith('[unlocked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - yield from lock - - self.loop.run_until_complete(acquire_lock()) + self.loop.run_until_complete(lock.acquire()) self.assertTrue(repr(lock).endswith('[locked]>')) self.assertTrue(RGX_REPR.match(repr(lock))) @@ -61,18 +55,16 @@ class LockTests(test_utils.TestCase): with self.assertWarns(DeprecationWarning): lock = asyncio.Lock(loop=self.loop) - @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + return (yield from lock) - res = self.loop.run_until_complete(acquire_lock()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + self.loop.run_until_complete(acquire_lock()) - self.assertTrue(res) - self.assertTrue(lock.locked()) - - lock.release() self.assertFalse(lock.locked()) def test_lock_by_with_statement(self): @@ -90,13 +82,13 @@ class LockTests(test_utils.TestCase): def test(lock): yield from asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with (yield from lock) as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - yield from asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "object is not iterable" + ): + with (yield from lock): + pass + self.assertFalse(lock.locked()) for primitive in primitives: loop.run_until_complete(test(primitive)) @@ -302,52 +294,16 @@ class LockTests(test_utils.TestCase): self.assertFalse(lock.locked()) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) + async def f(): + lock = asyncio.Lock() + self.assertFalse(lock.locked()) - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) + async with lock: + self.assertTrue(lock.locked()) - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(lock.locked()) + self.assertFalse(lock.locked()) - self.assertFalse(lock.locked()) - - def test_context_manager_cant_reuse(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from lock) - - # This spells "yield from lock" outside a generator. - cm = self.loop.run_until_complete(acquire_lock()) - with cm: - self.assertTrue(lock.locked()) - - self.assertFalse(lock.locked()) - - with self.assertRaises(AttributeError): - with cm: - pass - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - lock = asyncio.Lock(loop=self.loop) - - try: - with lock: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertFalse(lock.locked()) + self.loop.run_until_complete(f()) class EventTests(test_utils.TestCase): @@ -809,33 +765,14 @@ class ConditionTests(test_utils.TestCase): self.assertTrue(RGX_REPR.match(repr(cond))) def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) + async def f(): + cond = asyncio.Condition() + self.assertFalse(cond.locked()) + async with cond: + self.assertTrue(cond.locked()) + self.assertFalse(cond.locked()) - with self.assertWarns(DeprecationWarning): - @asyncio.coroutine - def acquire_cond(): - with self.assertWarns(DeprecationWarning): - return (yield from cond) - - with self.loop.run_until_complete(acquire_cond()): - self.assertTrue(cond.locked()) - - self.assertFalse(cond.locked()) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - cond = asyncio.Condition(loop=self.loop) - - try: - with cond: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertFalse(cond.locked()) + self.loop.run_until_complete(f()) def test_explicit_lock(self): with self.assertWarns(DeprecationWarning): @@ -920,16 +857,14 @@ class SemaphoreTests(test_utils.TestCase): with self.assertWarns(DeprecationWarning): @asyncio.coroutine def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) + return (yield from sem) - res = self.loop.run_until_complete(acquire_lock()) + with self.assertRaisesRegex( + TypeError, + "'Semaphore' object is not iterable", + ): + self.loop.run_until_complete(acquire_lock()) - self.assertTrue(res) - self.assertTrue(sem.locked()) - self.assertEqual(0, sem._value) - - sem.release() self.assertFalse(sem.locked()) self.assertEqual(1, sem._value) @@ -1064,38 +999,6 @@ class SemaphoreTests(test_utils.TestCase): sem.release() self.assertFalse(sem.locked()) - def test_context_manager(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - @asyncio.coroutine - def acquire_lock(): - with self.assertWarns(DeprecationWarning): - return (yield from sem) - - with self.loop.run_until_complete(acquire_lock()): - self.assertFalse(sem.locked()) - self.assertEqual(1, sem._value) - - with self.loop.run_until_complete(acquire_lock()): - self.assertTrue(sem.locked()) - - self.assertEqual(2, sem._value) - - def test_context_manager_no_yield(self): - with self.assertWarns(DeprecationWarning): - sem = asyncio.Semaphore(2, loop=self.loop) - - try: - with sem: - self.fail('RuntimeError is not raised in with expression') - except RuntimeError as err: - self.assertEqual( - str(err), - '"yield from" should be used as context manager expression') - - self.assertEqual(2, sem._value) - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py index a1f27dd5721..c5e3a5c1483 100644 --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -77,13 +77,12 @@ class LockTests(BaseTest): async def test(lock): await asyncio.sleep(0.01) self.assertFalse(lock.locked()) - with self.assertWarns(DeprecationWarning): - with await lock as _lock: - self.assertIs(_lock, None) - self.assertTrue(lock.locked()) - await asyncio.sleep(0.01) - self.assertTrue(lock.locked()) - self.assertFalse(lock.locked()) + with self.assertRaisesRegex( + TypeError, + "can't be used in 'await' expression" + ): + with await lock: + pass for primitive in primitives: self.loop.run_until_complete(test(primitive)) diff --git a/Misc/NEWS.d/next/Library/2019-12-09-17-24-29.bpo-34793.D82Dyu.rst b/Misc/NEWS.d/next/Library/2019-12-09-17-24-29.bpo-34793.D82Dyu.rst new file mode 100644 index 00000000000..2089285ecdb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-09-17-24-29.bpo-34793.D82Dyu.rst @@ -0,0 +1,3 @@ +Remove support for ``with (await asyncio.lock):`` and ``with (yield from +asyncio.lock):``. The same is correct for ``asyncio.Condition`` and +``asyncio.Semaphore``. From b94737a4af96b29bd4c025724f671e7bc0f6b6f1 Mon Sep 17 00:00:00 2001 From: James Corbett Date: Sat, 1 Feb 2020 04:31:00 -0800 Subject: [PATCH 269/380] fixes typos in http.client documentation (#18300) --- Doc/library/http.client.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 807dd8bd379..35997db2a9d 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -586,8 +586,8 @@ Here is an example session that shows how to ``POST`` requests:: Client side ``HTTP PUT`` requests are very similar to ``POST`` requests. The difference lies only the server side where HTTP server will allow resources to be created via ``PUT`` request. It should be noted that custom HTTP methods -+are also handled in :class:`urllib.request.Request` by sending the appropriate -+method attribute.Here is an example session that shows how to do ``PUT`` +are also handled in :class:`urllib.request.Request` by setting the appropriate +method attribute. Here is an example session that shows how to send a ``PUT`` request using http.client:: >>> # This creates an HTTP message From 78c7183f470b60a39ac2dd0ad1a94d49d1e0b062 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Sat, 1 Feb 2020 13:45:34 -0700 Subject: [PATCH 270/380] bpo-39496: Remove redundant checks from _sqlite/cursor.c (GH-18270) --- Modules/_sqlite/cursor.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 2302ca9edac..06275ecb268 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -786,17 +786,9 @@ PyObject* pysqlite_cursor_fetchmany(pysqlite_Cursor* self, PyObject* args, PyObj return NULL; } - /* just make sure we enter the loop */ - row = Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); - Py_DECREF(row); - } else { - break; - } + while ((row = pysqlite_cursor_iternext(self))) { + PyList_Append(list, row); + Py_XDECREF(row); if (++counter == maxrows) { break; @@ -821,15 +813,9 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args) return NULL; } - /* just make sure we enter the loop */ - row = (PyObject*)Py_None; - - while (row) { - row = pysqlite_cursor_iternext(self); - if (row) { - PyList_Append(list, row); - Py_DECREF(row); - } + while ((row = pysqlite_cursor_iternext(self))) { + PyList_Append(list, row); + Py_XDECREF(row); } if (PyErr_Occurred()) { From be8147bdc6111a225ec284a4514277304726c3d0 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 2 Feb 2020 11:37:02 +0000 Subject: [PATCH 271/380] Fix 5-space indentation and trailing whitespace (GH-18311) --- Objects/floatobject.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 89f60b65cd5..ab486d4ee3d 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -641,7 +641,7 @@ _float_div_mod(double vx, double wx, double *floordiv, double *mod) *floordiv = floor(div); if (div - *floordiv > 0.5) { *floordiv += 1.0; - } + } } else { /* div is zero - get the same sign as the true quotient */ @@ -652,16 +652,16 @@ _float_div_mod(double vx, double wx, double *floordiv, double *mod) static PyObject * float_divmod(PyObject *v, PyObject *w) { - double vx, wx; - double mod, floordiv; - CONVERT_TO_DOUBLE(v, vx); - CONVERT_TO_DOUBLE(w, wx); - if (wx == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); - return NULL; - } - _float_div_mod(vx, wx, &floordiv, &mod); - return Py_BuildValue("(dd)", floordiv, mod); + double vx, wx; + double mod, floordiv; + CONVERT_TO_DOUBLE(v, vx); + CONVERT_TO_DOUBLE(w, wx); + if (wx == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()"); + return NULL; + } + _float_div_mod(vx, wx, &floordiv, &mod); + return Py_BuildValue("(dd)", floordiv, mod); } static PyObject * From 339fd46cb764277cbbdc3e78dcc5b45b156bb6ae Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Sun, 2 Feb 2020 07:49:00 -0500 Subject: [PATCH 272/380] bpo-39349: Add *cancel_futures* to Executor.shutdown() (GH-18057) --- Doc/library/concurrent.futures.rst | 14 ++++++- Doc/whatsnew/3.9.rst | 9 +++++ Lib/concurrent/futures/process.py | 23 ++++++++++- Lib/concurrent/futures/thread.py | 15 ++++++- Lib/test/test_concurrent_futures.py | 39 +++++++++++++++++++ .../2020-01-19-04-12-34.bpo-39349.7CV-LC.rst | 4 ++ 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-19-04-12-34.bpo-39349.7CV-LC.rst diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index d71f2d80c9e..b21d5594c84 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) + .. 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 @@ -82,6 +82,15 @@ Executor Objects value of *wait*, the entire Python program will not exit until all pending futures are done executing. + If *cancel_futures* is ``True``, this method will cancel all pending + futures that the executor has not started running. Any futures that + are completed or running won't be cancelled, regardless of the value + of *cancel_futures*. + + If both *cancel_futures* and *wait* are ``True``, all futures that the + executor has started running will be completed prior to this method + returning. The remaining futures are cancelled. + You can avoid having to call this method explicitly if you use the :keyword:`with` statement, which will shutdown the :class:`Executor` (waiting as if :meth:`Executor.shutdown` were called with *wait* set to @@ -94,6 +103,9 @@ Executor Objects e.submit(shutil.copy, 'src3.txt', 'dest3.txt') e.submit(shutil.copy, 'src4.txt', 'dest4.txt') + .. versionchanged:: 3.9 + Added *cancel_futures*. + ThreadPoolExecutor ------------------ diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index ee37b5a5b72..931f8bf13fb 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -146,6 +146,15 @@ that schedules a shutdown for the default executor that waits on the Added :class:`asyncio.PidfdChildWatcher`, a Linux-specific child watcher implementation that polls process file descriptors. (:issue:`38692`) +concurrent.futures +------------------ + +Added a new *cancel_futures* parameter to +:meth:`concurrent.futures.Executor.shutdown` that cancels all pending futures +which have not started running, instead of waiting for them to complete before +shutting down the executor. +(Contributed by Kyle Stanley in :issue:`39349`.) + curses ------ diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 9e2ab9db64f..fd9f572b6c7 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -435,6 +435,24 @@ def _queue_management_worker(executor_reference, # is not gc-ed yet. if executor is not None: executor._shutdown_thread = True + # Unless there are pending work items, we have nothing to cancel. + if pending_work_items and executor._cancel_pending_futures: + # Cancel all pending futures and update pending_work_items + # to only have futures that are currently running. + new_pending_work_items = {} + for work_id, work_item in pending_work_items.items(): + if not work_item.future.cancel(): + new_pending_work_items[work_id] = work_item + + pending_work_items = new_pending_work_items + # Drain work_ids_queue since we no longer need to + # add items to the call queue. + while True: + try: + work_ids_queue.get_nowait() + except queue.Empty: + break + # Since no new work items can be added, it is safe to shutdown # this thread if there are no pending work items. if not pending_work_items: @@ -546,6 +564,7 @@ class ProcessPoolExecutor(_base.Executor): self._broken = False self._queue_count = 0 self._pending_work_items = {} + self._cancel_pending_futures = False # Create communication channels for the executor # Make the call queue slightly larger than the number of processes to @@ -660,9 +679,11 @@ class ProcessPoolExecutor(_base.Executor): timeout=timeout) return _chain_from_iterable_of_lists(results) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: + self._cancel_pending_futures = cancel_futures self._shutdown_thread = True + if self._queue_management_thread: # Wake up queue management thread self._queue_management_thread_wakeup.wakeup() diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index b89f8f24d4d..be79161bf85 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -215,9 +215,22 @@ class ThreadPoolExecutor(_base.Executor): if work_item is not None: work_item.future.set_exception(BrokenThreadPool(self._broken)) - def shutdown(self, wait=True): + def shutdown(self, wait=True, *, cancel_futures=False): with self._shutdown_lock: self._shutdown = True + if cancel_futures: + # Drain all work items from the queue, and then cancel their + # associated futures. + while True: + try: + work_item = self._work_queue.get_nowait() + except queue.Empty: + break + if work_item is not None: + work_item.future.cancel() + + # Send a wake-up to prevent threads calling + # _work_queue.get(block=True) from permanently blocking. self._work_queue.put(None) if wait: for t in self._threads: diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index c8fa35e9eea..af77f813419 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -342,6 +342,29 @@ class ExecutorShutdownTest: for f in fs: f.result() + def test_cancel_futures(self): + executor = self.executor_type(max_workers=3) + fs = [executor.submit(time.sleep, .1) for _ in range(50)] + executor.shutdown(cancel_futures=True) + # We can't guarantee the exact number of cancellations, but we can + # guarantee that *some* were cancelled. With setting max_workers to 3, + # most of the submitted futures should have been cancelled. + cancelled = [fut for fut in fs if fut.cancelled()] + self.assertTrue(len(cancelled) >= 35, msg=f"{len(cancelled)=}") + + # Ensure the other futures were able to finish. + # Use "not fut.cancelled()" instead of "fut.done()" to include futures + # that may have been left in a pending state. + others = [fut for fut in fs if not fut.cancelled()] + for fut in others: + self.assertTrue(fut.done(), msg=f"{fut._state=}") + self.assertIsNone(fut.exception()) + + # Similar to the number of cancelled futures, we can't guarantee the + # exact number that completed. But, we can guarantee that at least + # one finished. + self.assertTrue(len(others) > 0, msg=f"{len(others)=}") + def test_hang_issue39205(self): """shutdown(wait=False) doesn't hang at exit with running futures. @@ -422,6 +445,22 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase self.assertRegex(t.name, r'ThreadPoolExecutor-\d+_[0-4]$') t.join() + def test_cancel_futures_wait_false(self): + # Can only be reliably tested for TPE, since PPE often hangs with + # `wait=False` (even without *cancel_futures*). + rc, out, err = assert_python_ok('-c', """if True: + from concurrent.futures import ThreadPoolExecutor + from test.test_concurrent_futures import sleep_and_print + if __name__ == "__main__": + t = ThreadPoolExecutor() + t.submit(sleep_and_print, .1, "apple") + t.shutdown(wait=False, cancel_futures=True) + """.format(executor_type=self.executor_type.__name__)) + # Errors in atexit hooks don't change the process exit code, check + # stderr manually. + self.assertFalse(err) + self.assertEqual(out.strip(), b"apple") + class ProcessPoolShutdownTest(ExecutorShutdownTest): def _prime_executor(self): diff --git a/Misc/NEWS.d/next/Library/2020-01-19-04-12-34.bpo-39349.7CV-LC.rst b/Misc/NEWS.d/next/Library/2020-01-19-04-12-34.bpo-39349.7CV-LC.rst new file mode 100644 index 00000000000..cc52700f670 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-19-04-12-34.bpo-39349.7CV-LC.rst @@ -0,0 +1,4 @@ +Added a new *cancel_futures* parameter to +:meth:`concurrent.futures.Executor.shutdown` that cancels all pending futures +which have not started running, instead of waiting for them to complete before +shutting down the executor. \ No newline at end of file From 0f2f35e15f9fbee44ce042b724348419d8136bc5 Mon Sep 17 00:00:00 2001 From: Pierre Glaser Date: Sun, 2 Feb 2020 19:55:21 +0100 Subject: [PATCH 273/380] bpo-39492: Fix a reference cycle between reducer_override and a Pickler instance (GH-18266) This also needs a backport to 3.8 https://bugs.python.org/issue39492 Automerge-Triggered-By: @pitrou --- Lib/test/pickletester.py | 24 +++++++++++++++++++ .../2020-01-30-01-14-42.bpo-39492.eTuy0F.rst | 1 + Modules/_pickle.c | 22 +++++++++++++---- 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-30-01-14-42.bpo-39492.eTuy0F.rst diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py index 953fd5c5a27..ba893f39c2f 100644 --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -3499,6 +3499,30 @@ class AbstractHookTests(unittest.TestCase): ValueError, 'The reducer just failed'): p.dump(h) + @support.cpython_only + def test_reducer_override_no_reference_cycle(self): + # bpo-39492: reducer_override used to induce a spurious reference cycle + # inside the Pickler object, that could prevent all serialized objects + # from being garbage-collected without explicity invoking gc.collect. + + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + def f(): + pass + + wr = weakref.ref(f) + + bio = io.BytesIO() + p = self.pickler_class(bio, proto) + p.dump(f) + new_f = pickle.loads(bio.getvalue()) + assert new_f == 5 + + del p + del f + + self.assertIsNone(wr()) + class AbstractDispatchTableTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-30-01-14-42.bpo-39492.eTuy0F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-30-01-14-42.bpo-39492.eTuy0F.rst new file mode 100644 index 00000000000..6e8b715c463 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-30-01-14-42.bpo-39492.eTuy0F.rst @@ -0,0 +1 @@ +Fix a reference cycle in the C Pickler that was preventing the garbage collection of deleted, pickled objects. \ No newline at end of file diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 25d5c8da920..fc48d605786 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4455,12 +4455,13 @@ static int dump(PicklerObject *self, PyObject *obj) { const char stop_op = STOP; + int status = -1; PyObject *tmp; _Py_IDENTIFIER(reducer_override); if (_PyObject_LookupAttrId((PyObject *)self, &PyId_reducer_override, &tmp) < 0) { - return -1; + goto error; } /* Cache the reducer_override method, if it exists. */ if (tmp != NULL) { @@ -4477,7 +4478,7 @@ dump(PicklerObject *self, PyObject *obj) assert(self->proto >= 0 && self->proto < 256); header[1] = (unsigned char)self->proto; if (_Pickler_Write(self, header, 2) < 0) - return -1; + goto error; if (self->proto >= 4) self->framing = 1; } @@ -4485,9 +4486,22 @@ dump(PicklerObject *self, PyObject *obj) if (save(self, obj, 0) < 0 || _Pickler_Write(self, &stop_op, 1) < 0 || _Pickler_CommitFrame(self) < 0) - return -1; + goto error; + + // Success + status = 0; + + error: self->framing = 0; - return 0; + + /* Break the reference cycle we generated at the beginning this function + * call when setting the reducer_override attribute of the Pickler instance + * to a bound method of the same instance. This is important as the Pickler + * instance holds a reference to each object it has pickled (through its + * memo): thus, these objects wont be garbage-collected as long as the + * Pickler itself is not collected. */ + Py_CLEAR(self->reducer_override); + return status; } /*[clinic input] From 032de7324e30c6b44ef272cea3be205a3d768759 Mon Sep 17 00:00:00 2001 From: Steve Cirelli Date: Mon, 3 Feb 2020 02:06:50 -0500 Subject: [PATCH 274/380] bpo-39450 Stripped whitespace before parsing the docstring in TestCase.shortDescription (GH-18175) --- Lib/unittest/case.py | 2 +- Lib/unittest/test/test_case.py | 9 +++++++++ .../Library/2020-02-02-14-46-34.bpo-39450.48R274.rst | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-02-14-46-34.bpo-39450.48R274.rst diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index fa64a6ea237..5e5d535dc69 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -512,7 +512,7 @@ class TestCase(object): the specified test method's docstring. """ doc = self._testMethodDoc - return doc and doc.split("\n")[0].strip() or None + return doc.strip().split("\n")[0].strip() if doc else None def id(self): diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index c2401c39b91..f855c4dc00b 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -610,6 +610,15 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing): 'Tests shortDescription() for a method with a longer ' 'docstring.') + def testShortDescriptionWhitespaceTrimming(self): + """ + Tests shortDescription() whitespace is trimmed, so that the first + line of nonwhite-space text becomes the docstring. + """ + self.assertEqual( + self.shortDescription(), + 'Tests shortDescription() whitespace is trimmed, so that the first') + def testAddTypeEqualityFunc(self): class SadSnake(object): """Dummy class for test_addTypeEqualityFunc.""" diff --git a/Misc/NEWS.d/next/Library/2020-02-02-14-46-34.bpo-39450.48R274.rst b/Misc/NEWS.d/next/Library/2020-02-02-14-46-34.bpo-39450.48R274.rst new file mode 100644 index 00000000000..55fed519a2d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-02-14-46-34.bpo-39450.48R274.rst @@ -0,0 +1,2 @@ +Striped whitespace from docstring before returning it from +:func:`unittest.case.shortDescription`. From 869c0c99b94ff9527acc1ca060164ab3d1bdcc53 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Mon, 3 Feb 2020 19:03:34 +0900 Subject: [PATCH 275/380] bpo-36051: Fix compiler warning. (GH-18325) --- Objects/stringlib/join.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/stringlib/join.h b/Objects/stringlib/join.h index 4d023ed1a85..8ad598ad5c9 100644 --- a/Objects/stringlib/join.h +++ b/Objects/stringlib/join.h @@ -20,7 +20,7 @@ STRINGLIB(bytes_join)(PyObject *sep, PyObject *iterable) Py_buffer static_buffers[NB_STATIC_BUFFERS]; #define GIL_THRESHOLD 1048576 int drop_gil = 1; - PyThreadState *save; + PyThreadState *save = NULL; seq = PySequence_Fast(iterable, "can only join an iterable"); if (seq == NULL) { From c6e5c1123bac6cbb4c85265155af5349dcea522e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 3 Feb 2020 15:17:15 +0100 Subject: [PATCH 276/380] bpo-39489: Remove COUNT_ALLOCS special build (GH-18259) Remove: * COUNT_ALLOCS macro * sys.getcounts() function * SHOW_ALLOC_COUNT code in listobject.c * SHOW_TRACK_COUNT code in tupleobject.c * PyConfig.show_alloc_count field * -X showalloccount command line option * @test.support.requires_type_collecting decorator --- Doc/c-api/init_config.rst | 12 +- Doc/c-api/typeobj.rst | 34 ----- Doc/using/cmdline.rst | 5 +- Doc/whatsnew/3.9.rst | 9 ++ Include/cpython/initconfig.h | 1 - Include/cpython/object.h | 11 -- Include/object.h | 20 +-- Lib/subprocess.py | 2 +- Lib/test/support/__init__.py | 3 - Lib/test/test_embed.py | 2 - Lib/test/test_gc.py | 6 +- Lib/test/test_io.py | 2 - Lib/test/test_logging.py | 1 - Lib/test/test_module.py | 4 +- Lib/test/test_support.py | 1 - Lib/test/test_sys.py | 4 - Lib/test/test_threading.py | 5 +- Lib/test/test_traceback.py | 1 - Lib/test/test_warnings/__init__.py | 1 - Lib/test/test_weakref.py | 1 - .../2020-01-29-19-17-02.bpo-39489.HKPzv-.rst | 1 + Misc/SpecialBuilds.txt | 53 +------- Misc/python.man | 4 - Modules/_testcapimodule.c | 10 -- Objects/bytesobject.c | 16 --- Objects/listobject.c | 36 ----- Objects/longobject.c | 10 -- Objects/object.c | 126 ------------------ Objects/tupleobject.c | 46 ------- Programs/_testembed.c | 1 - Python/clinic/sysmodule.c.h | 27 +--- Python/initconfig.c | 8 -- Python/pylifecycle.c | 15 --- Python/sysmodule.c | 15 --- 34 files changed, 24 insertions(+), 469 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2020-01-29-19-17-02.bpo-39489.HKPzv-.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 108bd2c0245..c589a6fe3f0 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -627,14 +627,6 @@ PyConfig ``python3 -m MODULE`` argument. Used by :c:func:`Py_RunMain`. - .. c:member:: int show_alloc_count - - Show allocation counts at exit? - - Set to 1 by :option:`-X showalloccount <-X>` command line option. - - Need a special Python build with ``COUNT_ALLOCS`` macro defined. - .. c:member:: int show_ref_count Show total reference count at exit? @@ -702,6 +694,10 @@ arguments are stripped from ``argv``: see :ref:`Command Line Arguments The ``xoptions`` options are parsed to set other options: see :option:`-X` option. +.. versionchanged:: 3.9 + + The ``show_alloc_count`` field has been removed. + Initialization with PyConfig ---------------------------- diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 7b205c04495..a8a779ef616 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -148,15 +148,6 @@ Quick Reference | :c:member:`~PyTypeObject.tp_vectorcall` | :c:type:`vectorcallfunc` | | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ -If :const:`COUNT_ALLOCS` is defined then the following (internal-only) -fields exist as well: - -* :c:member:`~PyTypeObject.tp_allocs` -* :c:member:`~PyTypeObject.tp_frees` -* :c:member:`~PyTypeObject.tp_maxalloc` -* :c:member:`~PyTypeObject.tp_prev` -* :c:member:`~PyTypeObject.tp_next` - .. [#slots] A slot name in parentheses indicates it is (effectively) deprecated. Names in angle brackets should be treated as read-only. @@ -1904,31 +1895,6 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9) -The remaining fields are only defined if the feature test macro -:const:`COUNT_ALLOCS` is defined, and are for internal use only. They are -documented here for completeness. None of these fields are inherited by -subtypes. - -.. c:member:: Py_ssize_t PyTypeObject.tp_allocs - - Number of allocations. - -.. c:member:: Py_ssize_t PyTypeObject.tp_frees - - Number of frees. - -.. c:member:: Py_ssize_t PyTypeObject.tp_maxalloc - - Maximum simultaneously allocated objects. - -.. c:member:: PyTypeObject* PyTypeObject.tp_prev - - Pointer to the previous type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. - -.. c:member:: PyTypeObject* PyTypeObject.tp_next - - Pointer to the next type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field. - Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from any Python thread, not just the thread which created the object (if the object becomes part of a refcount cycle, that cycle might be collected by a garbage diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index fb88673d30b..2206e5065be 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -434,9 +434,6 @@ Miscellaneous options stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start tracing with a traceback limit of *NFRAME* frames. See the :func:`tracemalloc.start` for more information. - * ``-X showalloccount`` to output the total count of allocated objects for - each type when the program finishes. This only works when Python was built with - ``COUNT_ALLOCS`` defined. * ``-X importtime`` to show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded @@ -479,6 +476,8 @@ Miscellaneous options Using ``-X dev`` option, check *encoding* and *errors* arguments on string encoding and decoding operations. + The ``-X showalloccount`` option has been removed. + Options you shouldn't use ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 931f8bf13fb..3b7a9d105d0 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -348,6 +348,9 @@ Build and C API Changes functions are now required to build Python. (Contributed by Victor Stinner in :issue:`39395`.) +* The ``COUNT_ALLOCS`` special build macro has been removed. + (Contributed by Victor Stinner in :issue:`39489`.) + Deprecated ========== @@ -484,6 +487,12 @@ Removed ``asyncio.Condition`` and ``asyncio.Semaphore``. (Contributed by Andrew Svetlov in :issue:`34793`.) +* The :func:`sys.getcounts` function, the ``-X showalloccount`` command line + option and the ``show_alloc_count`` field of the C structure + :c:type:`PyConfig` have been removed. They required a special Python build by + defining ``COUNT_ALLOCS`` macro. + (Contributed by Victor Stinner in :issue:`39489`.) + Porting to Python 3.9 ===================== diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 54e662347e3..c5fa2b3857e 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -153,7 +153,6 @@ typedef struct { int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ int show_ref_count; /* -X showrefcount */ - int show_alloc_count; /* -X showalloccount */ int dump_refs; /* PYTHONDUMPREFS */ int malloc_stats; /* PYTHONMALLOCSTATS */ diff --git a/Include/cpython/object.h b/Include/cpython/object.h index dc8fd6fa898..5fcad55c5c9 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -255,15 +255,6 @@ typedef struct _typeobject { destructor tp_finalize; vectorcallfunc tp_vectorcall; - -#ifdef COUNT_ALLOCS - /* these must be last and never explicitly initialized */ - Py_ssize_t tp_allocs; - Py_ssize_t tp_frees; - Py_ssize_t tp_maxalloc; - struct _typeobject *tp_prev; - struct _typeobject *tp_next; -#endif } PyTypeObject; /* The *real* layout of a type object when allocated on the heap */ @@ -341,8 +332,6 @@ static inline void _Py_Dealloc_inline(PyObject *op) destructor dealloc = Py_TYPE(op)->tp_dealloc; #ifdef Py_TRACE_REFS _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); #endif (*dealloc)(op); } diff --git a/Include/object.h b/Include/object.h index 7a5f57357b7..1a2e704e93d 100644 --- a/Include/object.h +++ b/Include/object.h @@ -405,20 +405,6 @@ PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); #define _Py_DEC_REFTOTAL #endif /* Py_REF_DEBUG */ -#ifdef COUNT_ALLOCS -PyAPI_FUNC(void) _Py_inc_count(struct _typeobject *); -PyAPI_FUNC(void) _Py_dec_count(struct _typeobject *); -#define _Py_INC_TPALLOCS(OP) _Py_inc_count(Py_TYPE(OP)) -#define _Py_INC_TPFREES(OP) _Py_dec_count(Py_TYPE(OP)) -#define _Py_DEC_TPFREES(OP) Py_TYPE(OP)->tp_frees-- -#define _Py_COUNT_ALLOCS_COMMA , -#else -#define _Py_INC_TPALLOCS(OP) -#define _Py_INC_TPFREES(OP) -#define _Py_DEC_TPFREES(OP) -#define _Py_COUNT_ALLOCS_COMMA -#endif /* COUNT_ALLOCS */ - /* Update the Python traceback of an object. This function must be called when a memory block is reused from a free list. */ PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); @@ -438,15 +424,13 @@ static inline void _Py_NewReference(PyObject *op) if (_Py_tracemalloc_config.tracing) { _PyTraceMalloc_NewReference(op); } - _Py_INC_TPALLOCS(op); _Py_INC_REFTOTAL; Py_REFCNT(op) = 1; } -static inline void _Py_ForgetReference(PyObject *op) +static inline void _Py_ForgetReference(PyObject *Py_UNUSED(op)) { - (void)op; /* may be unused, shut up -Wunused-parameter */ - _Py_INC_TPFREES(op); + /* nothing to do */ } #endif /* !Py_TRACE_REFS */ diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 26a1e69bd38..c8db387091b 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -325,7 +325,7 @@ def _args_from_interpreter_flags(): if dev_mode: args.extend(('-X', 'dev')) for opt in ('faulthandler', 'tracemalloc', 'importtime', - 'showalloccount', 'showrefcount', 'utf8'): + 'showrefcount', 'utf8'): if opt in xoptions: value = xoptions[opt] if value is True: diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 215bab8131a..259c7069bfc 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2512,9 +2512,6 @@ def swap_item(obj, item, new_val): if item in obj: del obj[item] -requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'), - 'types are immortal if COUNT_ALLOCS is defined') - def args_from_interpreter_flags(): """Return a list of command-line arguments reproducing the current settings in sys.flags and sys.warnoptions.""" diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 73ef96265b7..87842b9377a 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -356,7 +356,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'tracemalloc': 0, 'import_time': 0, 'show_ref_count': 0, - 'show_alloc_count': 0, 'dump_refs': 0, 'malloc_stats': 0, @@ -729,7 +728,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'tracemalloc': 2, 'import_time': 1, 'show_ref_count': 1, - 'show_alloc_count': 1, 'malloc_stats': 1, 'stdio_encoding': 'iso8859-1', diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 18f8d10c5ba..acb6391944b 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -2,7 +2,7 @@ import unittest import unittest.mock from test.support import (verbose, refcount_test, run_unittest, cpython_only, start_threads, - temp_dir, requires_type_collecting, TESTFN, unlink, + temp_dir, TESTFN, unlink, import_module) from test.support.script_helper import assert_python_ok, make_script @@ -131,7 +131,6 @@ class GCTests(unittest.TestCase): del a self.assertNotEqual(gc.collect(), 0) - @requires_type_collecting def test_newinstance(self): class A(object): pass @@ -709,7 +708,6 @@ class GCTests(unittest.TestCase): stderr = run_command(code % "gc.DEBUG_SAVEALL") self.assertNotIn(b"uncollectable objects at shutdown", stderr) - @requires_type_collecting def test_gc_main_module_at_shutdown(self): # Create a reference cycle through the __main__ module and check # it gets collected at interpreter shutdown. @@ -723,7 +721,6 @@ class GCTests(unittest.TestCase): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_gc_ordinary_module_at_shutdown(self): # Same as above, but with a non-__main__ module. with temp_dir() as script_dir: @@ -743,7 +740,6 @@ class GCTests(unittest.TestCase): rc, out, err = assert_python_ok('-c', code) self.assertEqual(out.strip(), b'__del__ called') - @requires_type_collecting def test_global_del_SystemExit(self): code = """if 1: class ClassWithDel: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 501e9313963..8a123fa1dc0 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3492,7 +3492,6 @@ class TextIOWrapperTest(unittest.TestCase): """.format(iomod=iomod, kwargs=kwargs) return assert_python_ok("-c", code) - @support.requires_type_collecting def test_create_at_shutdown_without_encoding(self): rc, out, err = self._check_create_at_shutdown() if err: @@ -3502,7 +3501,6 @@ class TextIOWrapperTest(unittest.TestCase): else: self.assertEqual("ok", out.decode().strip()) - @support.requires_type_collecting def test_create_at_shutdown_with_encoding(self): rc, out, err = self._check_create_at_shutdown(encoding='utf-8', errors='strict') diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index c38fdae0338..e223522cc7e 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -4252,7 +4252,6 @@ class ModuleLevelMiscTest(BaseTest): h.close() logging.setLoggerClass(logging.Logger) - @support.requires_type_collecting def test_logging_at_shutdown(self): # Issue #20037 code = """if 1: diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py index efe9a8ed5e5..1d44563579f 100644 --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -1,7 +1,7 @@ # Test the module type import unittest import weakref -from test.support import gc_collect, requires_type_collecting +from test.support import gc_collect from test.support.script_helper import assert_python_ok import sys @@ -101,7 +101,6 @@ class ModuleTests(unittest.TestCase): gc_collect() self.assertEqual(f().__dict__["bar"], 4) - @requires_type_collecting def test_clear_dict_in_ref_cycle(self): destroyed = [] m = ModuleType("foo") @@ -266,7 +265,6 @@ a = A(destroyed)""" self.assertEqual(r[-len(ends_with):], ends_with, '{!r} does not end with {!r}'.format(r, ends_with)) - @requires_type_collecting def test_module_finalization_at_shutdown(self): # Module globals and builtins should still be available during shutdown rc, out, err = assert_python_ok("-c", "from test import final_a") diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 2f347bd540f..175f7c845fe 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -493,7 +493,6 @@ class TestSupport(unittest.TestCase): ['-Wignore', '-X', 'dev'], ['-X', 'faulthandler'], ['-X', 'importtime'], - ['-X', 'showalloccount'], ['-X', 'showrefcount'], ['-X', 'tracemalloc'], ['-X', 'tracemalloc=3'], diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 947c935f347..58701a11f91 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -819,7 +819,6 @@ class SysModuleTest(unittest.TestCase): c = sys.getallocatedblocks() self.assertIn(c, range(b - 50, b + 50)) - @test.support.requires_type_collecting def test_is_finalizing(self): self.assertIs(sys.is_finalizing(), False) # Don't use the atexit module because _Py_Finalizing is only set @@ -841,7 +840,6 @@ class SysModuleTest(unittest.TestCase): rc, stdout, stderr = assert_python_ok('-c', code) self.assertEqual(stdout.rstrip(), b'True') - @test.support.requires_type_collecting def test_issue20602(self): # sys.flags and sys.float_info were wiped during shutdown. code = """if 1: @@ -1295,8 +1293,6 @@ class SizeofTest(unittest.TestCase): # type # static type: PyTypeObject fmt = 'P2nPI13Pl4Pn9Pn11PIPP' - if hasattr(sys, 'getcounts'): - fmt += '3n2P' s = vsize(fmt) check(int, s) # class diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 62f2d54ad0a..a9d31afbe33 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -3,8 +3,7 @@ Tests for the threading module. """ import test.support -from test.support import (verbose, import_module, cpython_only, - requires_type_collecting) +from test.support import verbose, import_module, cpython_only from test.support.script_helper import assert_python_ok, assert_python_failure import random @@ -552,7 +551,6 @@ class ThreadTests(BaseTestCase): self.assertEqual(err, b"") self.assertEqual(data, "Thread-1\nTrue\nTrue\n") - @requires_type_collecting def test_main_thread_during_shutdown(self): # bpo-31516: current_thread() should still point to the main thread # at shutdown @@ -1113,7 +1111,6 @@ class ThreadingExceptionTests(BaseTestCase): self.assertIn("ZeroDivisionError", err) self.assertNotIn("Unhandled exception", err) - @requires_type_collecting def test_print_exception_stderr_is_none_1(self): script = r"""if True: import sys diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 7135d997d54..60e0b582756 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -174,7 +174,6 @@ class TracebackCases(unittest.TestCase): # Issue #18960: coding spec should have no effect do_test("x=0\n# coding: GBK\n", "h\xe9 ho", 'utf-8', 5) - @support.requires_type_collecting def test_print_traceback_at_exit(self): # Issue #22599: Ensure that it is possible to use the traceback module # to display an exception at Python exit diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index c6fb097ae6d..268ecb03f4d 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -1227,7 +1227,6 @@ class BootstrapTest(unittest.TestCase): class FinalizationTest(unittest.TestCase): - @support.requires_type_collecting def test_finalization(self): # Issue #19421: warnings.warn() should not crash # during Python finalization diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py index 228bc17b23c..63c725527d5 100644 --- a/Lib/test/test_weakref.py +++ b/Lib/test/test_weakref.py @@ -649,7 +649,6 @@ class ReferencesTestCase(TestBase): del c1, c2, C, D gc.collect() - @support.requires_type_collecting def test_callback_in_cycle_resurrection(self): import gc diff --git a/Misc/NEWS.d/next/Build/2020-01-29-19-17-02.bpo-39489.HKPzv-.rst b/Misc/NEWS.d/next/Build/2020-01-29-19-17-02.bpo-39489.HKPzv-.rst new file mode 100644 index 00000000000..652a4356e22 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2020-01-29-19-17-02.bpo-39489.HKPzv-.rst @@ -0,0 +1 @@ +Remove ``COUNT_ALLOCS`` special build. diff --git a/Misc/SpecialBuilds.txt b/Misc/SpecialBuilds.txt index d1a032165f8..27369abfb37 100644 --- a/Misc/SpecialBuilds.txt +++ b/Misc/SpecialBuilds.txt @@ -46,9 +46,7 @@ Build option: ``./configure --with-trace-refs``. Turn on heavy reference debugging. This is major surgery. Every PyObject grows two more pointers, to maintain a doubly-linked list of all live heap-allocated objects. Most built-in type objects are not in this list, as they're statically -allocated. Starting in Python 2.3, if COUNT_ALLOCS (see below) is also defined, -a static type object T does appear in this list if at least one object of type T -has been created. +allocated. Note that because the fundamental PyObject layout changes, Python modules compiled with Py_TRACE_REFS are incompatible with modules compiled without it. @@ -165,55 +163,6 @@ by not defining NDEBUG), and some routines do additional sanity checks inside "#ifdef Py_DEBUG" blocks. -COUNT_ALLOCS ------------- - -Each type object grows three new members: - - /* Number of times an object of this type was allocated. */ - int tp_allocs; - - /* Number of times an object of this type was deallocated. */ - int tp_frees; - - /* Highwater mark: the maximum value of tp_allocs - tp_frees so - * far; or, IOW, the largest number of objects of this type alive at - * the same time. - */ - int tp_maxalloc; - -Allocation and deallocation code keeps these counts up to date. Py_FinalizeEx() -displays a summary of the info returned by sys.getcounts() (see below), along -with assorted other special allocation counts (like the number of tuple -allocations satisfied by a tuple free-list, the number of 1-character strings -allocated, etc). - -Before Python 2.2, type objects were immortal, and the COUNT_ALLOCS -implementation relies on that. As of Python 2.2, heap-allocated type/ class -objects can go away. COUNT_ALLOCS can blow up in 2.2 and 2.2.1 because of this; -this was fixed in 2.2.2. Use of COUNT_ALLOCS makes all heap-allocated type -objects immortal, except for those for which no object of that type is ever -allocated. - -Starting with Python 2.3, If Py_TRACE_REFS is also defined, COUNT_ALLOCS -arranges to ensure that the type object for each allocated object appears in the -doubly-linked list of all objects maintained by Py_TRACE_REFS. - -Special gimmicks: - -sys.getcounts() - Return a list of 4-tuples, one entry for each type object for which at least - one object of that type was allocated. Each tuple is of the form: - - (tp_name, tp_allocs, tp_frees, tp_maxalloc) - - Each distinct type object gets a distinct entry in this list, even if two or - more type objects have the same tp_name (in which case there's no way to - distinguish them by looking at this list). The list is ordered by time of - first object allocation: the type object for which the first allocation of - an object of that type occurred most recently is at the front of the list. - - LLTRACE ------- diff --git a/Misc/python.man b/Misc/python.man index 3645b0206eb..89a15a5e7b2 100644 --- a/Misc/python.man +++ b/Misc/python.man @@ -286,10 +286,6 @@ Set implementation specific option. The following options are available: traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a traceback limit of NFRAME frames - -X showalloccount: output the total count of allocated objects for each - type when the program finishes. This only works when Python was built with - COUNT_ALLOCS defined - -X importtime: show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 943bee6e21e..4dcfde45437 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3589,16 +3589,6 @@ slot_tp_del(PyObject *self) /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so * we need to undo that. */ _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. - */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif } static PyObject * diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 5fd92f72a53..00151b82566 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -18,10 +18,6 @@ class bytes "PyBytesObject *" "&PyBytes_Type" #include "clinic/bytesobject.c.h" -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_null_strings, _Py_one_strings; -#endif - static PyBytesObject *characters[UCHAR_MAX + 1]; static PyBytesObject *nullstring; @@ -68,9 +64,6 @@ _PyBytes_FromSize(Py_ssize_t size, int use_calloc) assert(size >= 0); if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -112,9 +105,6 @@ PyBytes_FromStringAndSize(const char *str, Py_ssize_t size) if (size == 1 && str != NULL && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } @@ -148,16 +138,10 @@ PyBytes_FromString(const char *str) return NULL; } if (size == 0 && (op = nullstring) != NULL) { -#ifdef COUNT_ALLOCS - _Py_null_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { -#ifdef COUNT_ALLOCS - _Py_one_strings++; -#endif Py_INCREF(op); return (PyObject *)op; } diff --git a/Objects/listobject.c b/Objects/listobject.c index 2c07ceb0d41..c93a0feaf36 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -94,29 +94,6 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size) return 0; } -/* Debug statistic to compare allocations with reuse through the free list */ -#undef SHOW_ALLOC_COUNT -#ifdef SHOW_ALLOC_COUNT -static size_t count_alloc = 0; -static size_t count_reuse = 0; - -static void -show_alloc(void) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", - count_alloc); - fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T - "d\n", count_reuse); - fprintf(stderr, "%.2f%% reuse rate\n\n", - (100.0*count_reuse/(count_alloc+count_reuse))); -} -#endif - /* Empty list reuse scheme to save calls to malloc and free */ #ifndef PyList_MAXFREELIST #define PyList_MAXFREELIST 80 @@ -156,13 +133,6 @@ PyObject * PyList_New(Py_ssize_t size) { PyListObject *op; -#ifdef SHOW_ALLOC_COUNT - static int initialized = 0; - if (!initialized) { - Py_AtExit(show_alloc); - initialized = 1; - } -#endif if (size < 0) { PyErr_BadInternalCall(); @@ -172,16 +142,10 @@ PyList_New(Py_ssize_t size) numfree--; op = free_list[numfree]; _Py_NewReference((PyObject *)op); -#ifdef SHOW_ALLOC_COUNT - count_reuse++; -#endif } else { op = PyObject_GC_New(PyListObject, &PyList_Type); if (op == NULL) return NULL; -#ifdef SHOW_ALLOC_COUNT - count_alloc++; -#endif } if (size <= 0) op->ob_item = NULL; diff --git a/Objects/longobject.c b/Objects/longobject.c index 124b837d008..9115fa184f3 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -35,10 +35,6 @@ PyObject *_PyLong_One = NULL; #define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) #define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -#endif - static PyObject * get_small_int(sdigit ival) { @@ -46,12 +42,6 @@ get_small_int(sdigit ival) PyThreadState *tstate = _PyThreadState_GET(); PyObject *v = (PyObject*)tstate->interp->small_ints[ival + NSMALLNEGINTS]; Py_INCREF(v); -#ifdef COUNT_ALLOCS - if (ival >= 0) - _Py_quick_int_allocs++; - else - _Py_quick_neg_int_allocs++; -#endif return v; } diff --git a/Objects/object.c b/Objects/object.c index 67a6386e2a5..2154d119a02 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -113,120 +113,6 @@ _Py_AddToAllObjects(PyObject *op, int force) } #endif /* Py_TRACE_REFS */ -#ifdef COUNT_ALLOCS -static PyTypeObject *type_list; -/* All types are added to type_list, at least when - they get one object created. That makes them - immortal, which unfortunately contributes to - garbage itself. If unlist_types_without_objects - is set, they will be removed from the type_list - once the last object is deallocated. */ -static int unlist_types_without_objects; -extern Py_ssize_t _Py_tuple_zero_allocs, _Py_fast_tuple_allocs; -extern Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; -extern Py_ssize_t _Py_null_strings, _Py_one_strings; -void -_Py_dump_counts(FILE* f) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - PyTypeObject *tp; - for (tp = type_list; tp; tp = tp->tp_next) - fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " - "freed: %" PY_FORMAT_SIZE_T "d, " - "max in use: %" PY_FORMAT_SIZE_T "d\n", - tp->tp_name, tp->tp_allocs, tp->tp_frees, - tp->tp_maxalloc); - fprintf(f, "fast tuple allocs: %" PY_FORMAT_SIZE_T "d, " - "empty: %" PY_FORMAT_SIZE_T "d\n", - _Py_fast_tuple_allocs, _Py_tuple_zero_allocs); - fprintf(f, "fast int allocs: pos: %" PY_FORMAT_SIZE_T "d, " - "neg: %" PY_FORMAT_SIZE_T "d\n", - _Py_quick_int_allocs, _Py_quick_neg_int_allocs); - fprintf(f, "null strings: %" PY_FORMAT_SIZE_T "d, " - "1-strings: %" PY_FORMAT_SIZE_T "d\n", - _Py_null_strings, _Py_one_strings); -} - -PyObject * -_Py_get_counts(void) -{ - PyTypeObject *tp; - PyObject *result; - PyObject *v; - - result = PyList_New(0); - if (result == NULL) - return NULL; - for (tp = type_list; tp; tp = tp->tp_next) { - v = Py_BuildValue("(snnn)", tp->tp_name, tp->tp_allocs, - tp->tp_frees, tp->tp_maxalloc); - if (v == NULL) { - Py_DECREF(result); - return NULL; - } - if (PyList_Append(result, v) < 0) { - Py_DECREF(v); - Py_DECREF(result); - return NULL; - } - Py_DECREF(v); - } - return result; -} - -void -_Py_inc_count(PyTypeObject *tp) -{ - if (tp->tp_next == NULL && tp->tp_prev == NULL) { - /* first time; insert in linked list */ - if (type_list) - type_list->tp_prev = tp; - tp->tp_next = type_list; - /* Note that as of Python 2.2, heap-allocated type objects - * can go away, but this code requires that they stay alive - * until program exit. That's why we're careful with - * refcounts here. type_list gets a new reference to tp, - * while ownership of the reference type_list used to hold - * (if any) was transferred to tp->tp_next in the line above. - * tp is thus effectively immortal after this. - */ - Py_INCREF(tp); - type_list = tp; -#ifdef Py_TRACE_REFS - /* Also insert in the doubly-linked list of all objects, - * if not already there. - */ - _Py_AddToAllObjects((PyObject *)tp, 0); -#endif - } - tp->tp_allocs++; - if (tp->tp_allocs - tp->tp_frees > tp->tp_maxalloc) - tp->tp_maxalloc = tp->tp_allocs - tp->tp_frees; -} - -void _Py_dec_count(PyTypeObject *tp) -{ - tp->tp_frees++; - if (unlist_types_without_objects && - tp->tp_allocs == tp->tp_frees) { - /* unlink the type from type_list */ - if (tp->tp_prev) - tp->tp_prev->tp_next = tp->tp_next; - else - type_list = tp->tp_next; - if (tp->tp_next) - tp->tp_next->tp_prev = tp->tp_prev; - tp->tp_next = tp->tp_prev = NULL; - Py_DECREF(tp); - } -} - -#endif - #ifdef Py_REF_DEBUG /* Log a fatal error; doesn't return. */ void @@ -349,15 +235,6 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so * we need to undo that. */ _Py_DEC_REFTOTAL; - /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object - * chain, so no more to do there. - * If COUNT_ALLOCS, the original decref bumped tp_frees, and - * _Py_NewReference bumped tp_allocs: both of those need to be - * undone. */ -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif return -1; } @@ -1970,7 +1847,6 @@ _Py_ForgetReference(PyObject *op) op->_ob_next->_ob_prev = op->_ob_prev; op->_ob_prev->_ob_next = op->_ob_next; op->_ob_next = op->_ob_prev = NULL; - _Py_INC_TPFREES(op); } /* Print all live objects. Because PyObject_Print is called, the @@ -2289,8 +2165,6 @@ _Py_Dealloc(PyObject *op) destructor dealloc = Py_TYPE(op)->tp_dealloc; #ifdef Py_TRACE_REFS _Py_ForgetReference(op); -#else - _Py_INC_TPFREES(op); #endif (*dealloc)(op); } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 08f7022fda2..2708b9aad31 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -28,43 +28,10 @@ class tuple "PyTupleObject *" "&PyTuple_Type" static PyTupleObject *free_list[PyTuple_MAXSAVESIZE]; static int numfree[PyTuple_MAXSAVESIZE]; #endif -#ifdef COUNT_ALLOCS -Py_ssize_t _Py_fast_tuple_allocs; -Py_ssize_t _Py_tuple_zero_allocs; -#endif - -/* Debug statistic to count GC tracking of tuples. - Please note that tuples are only untracked when considered by the GC, and - many of them will be dead before. Therefore, a tracking rate close to 100% - does not necessarily prove that the heuristic is inefficient. -*/ -#ifdef SHOW_TRACK_COUNT -static Py_ssize_t count_untracked = 0; -static Py_ssize_t count_tracked = 0; - -static void -show_track(void) -{ - PyInterpreterState *interp = _PyInterpreterState_Get(); - if (!interp->config.show_alloc_count) { - return; - } - - fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n", - count_tracked + count_untracked); - fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T - "d\n", count_tracked); - fprintf(stderr, "%.2f%% tuple tracking rate\n\n", - (100.0*count_tracked/(count_untracked+count_tracked))); -} -#endif static inline void tuple_gc_track(PyTupleObject *op) { -#ifdef SHOW_TRACK_COUNT - count_tracked++; -#endif _PyObject_GC_TRACK(op); } @@ -106,9 +73,6 @@ tuple_alloc(Py_ssize_t size) assert(size != 0); free_list[size] = (PyTupleObject *) op->ob_item[0]; numfree[size]--; -#ifdef COUNT_ALLOCS - _Py_fast_tuple_allocs++; -#endif /* Inline PyObject_InitVar */ #ifdef Py_TRACE_REFS Py_SIZE(op) = size; @@ -139,9 +103,6 @@ PyTuple_New(Py_ssize_t size) if (size == 0 && free_list[0]) { op = free_list[0]; Py_INCREF(op); -#ifdef COUNT_ALLOCS - _Py_tuple_zero_allocs++; -#endif return (PyObject *) op; } #endif @@ -227,10 +188,6 @@ _PyTuple_MaybeUntrack(PyObject *op) _PyObject_GC_MAY_BE_TRACKED(elt)) return; } -#ifdef SHOW_TRACK_COUNT - count_tracked--; - count_untracked++; -#endif _PyObject_GC_UNTRACK(op); } @@ -1001,9 +958,6 @@ _PyTuple_Fini(void) (void)PyTuple_ClearFreeList(); #endif -#ifdef SHOW_TRACK_COUNT - show_track(); -#endif } /*********************** Tuple Iterator **************************/ diff --git a/Programs/_testembed.c b/Programs/_testembed.c index b98a38a1ba6..b98696cbe03 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -506,7 +506,6 @@ static int test_init_from_config(void) config.import_time = 1; config.show_ref_count = 1; - config.show_alloc_count = 1; /* FIXME: test dump_refs: bpo-34223 */ putenv("PYTHONMALLOCSTATS=0"); diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h index daca0e64110..4615ebaab5d 100644 --- a/Python/clinic/sysmodule.c.h +++ b/Python/clinic/sysmodule.c.h @@ -758,27 +758,6 @@ exit: return return_value; } -#if defined(COUNT_ALLOCS) - -PyDoc_STRVAR(sys_getcounts__doc__, -"getcounts($module, /)\n" -"--\n" -"\n"); - -#define SYS_GETCOUNTS_METHODDEF \ - {"getcounts", (PyCFunction)sys_getcounts, METH_NOARGS, sys_getcounts__doc__}, - -static PyObject * -sys_getcounts_impl(PyObject *module); - -static PyObject * -sys_getcounts(PyObject *module, PyObject *Py_UNUSED(ignored)) -{ - return sys_getcounts_impl(module); -} - -#endif /* defined(COUNT_ALLOCS) */ - PyDoc_STRVAR(sys__getframe__doc__, "_getframe($module, depth=0, /)\n" "--\n" @@ -988,11 +967,7 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored)) #define SYS_GETTOTALREFCOUNT_METHODDEF #endif /* !defined(SYS_GETTOTALREFCOUNT_METHODDEF) */ -#ifndef SYS_GETCOUNTS_METHODDEF - #define SYS_GETCOUNTS_METHODDEF -#endif /* !defined(SYS_GETCOUNTS_METHODDEF) */ - #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF #define SYS_GETANDROIDAPILEVEL_METHODDEF #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */ -/*[clinic end generated code: output=decd687b7631de4b input=a9049054013a1b77]*/ +/*[clinic end generated code: output=39eb34a01fb9a919 input=a9049054013a1b77]*/ diff --git a/Python/initconfig.c b/Python/initconfig.c index 9a784c75116..493b4bb4406 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -73,9 +73,6 @@ static const char usage_3[] = "\ tracemalloc module. By default, only the most recent frame is stored in a\n\ traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a\n\ traceback limit of NFRAME frames\n\ - -X showalloccount: output the total count of allocated objects for each\n\ - type when the program finishes. This only works when Python was built with\n\ - COUNT_ALLOCS defined\n\ -X importtime: show how long each import takes. It shows module name,\n\ cumulative time (including nested imports) and self time (excluding\n\ nested imports). Note that its output may be broken in multi-threaded\n\ @@ -800,7 +797,6 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2) COPY_ATTR(tracemalloc); COPY_ATTR(import_time); COPY_ATTR(show_ref_count); - COPY_ATTR(show_alloc_count); COPY_ATTR(dump_refs); COPY_ATTR(malloc_stats); @@ -903,7 +899,6 @@ config_as_dict(const PyConfig *config) SET_ITEM_INT(tracemalloc); SET_ITEM_INT(import_time); SET_ITEM_INT(show_ref_count); - SET_ITEM_INT(show_alloc_count); SET_ITEM_INT(dump_refs); SET_ITEM_INT(malloc_stats); SET_ITEM_WSTR(filesystem_encoding); @@ -1691,9 +1686,6 @@ config_read(PyConfig *config) if (config_get_xoption(config, L"showrefcount")) { config->show_ref_count = 1; } - if (config_get_xoption(config, L"showalloccount")) { - config->show_alloc_count = 1; - } status = config_read_complex_options(config); if (_PyStatus_EXCEPTION(status)) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d5d60d0a6d4..f1307356a7d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1173,10 +1173,6 @@ Py_Initialize(void) } -#ifdef COUNT_ALLOCS -extern void _Py_dump_counts(FILE*); -#endif - /* Flush stdout and stderr */ static int @@ -1393,13 +1389,6 @@ Py_FinalizeEx(void) * XXX I haven't seen a real-life report of either of these. */ _PyGC_CollectIfEnabled(); -#ifdef COUNT_ALLOCS - /* With COUNT_ALLOCS, it helps to run GC multiple times: - each collection might release some types from the type - list, so they become garbage. */ - while (_PyGC_CollectIfEnabled() > 0) - /* nothing */; -#endif /* Clear all loghooks */ /* We want minimal exposure of this function, so define the extern @@ -1451,10 +1440,6 @@ Py_FinalizeEx(void) /* unload faulthandler module */ _PyFaulthandler_Fini(); - /* Debugging stuff */ -#ifdef COUNT_ALLOCS - _Py_dump_counts(stderr); -#endif /* dump hash stats */ _PyHash_Fini(); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 17e79603c29..1cb10300d77 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1685,20 +1685,6 @@ sys_getallocatedblocks_impl(PyObject *module) return _Py_GetAllocatedBlocks(); } -#ifdef COUNT_ALLOCS -/*[clinic input] -sys.getcounts -[clinic start generated code]*/ - -static PyObject * -sys_getcounts_impl(PyObject *module) -/*[clinic end generated code: output=20df00bc164f43cb input=ad2ec7bda5424953]*/ -{ - extern PyObject *_Py_get_counts(void); - - return _Py_get_counts(); -} -#endif /*[clinic input] sys._getframe @@ -1879,7 +1865,6 @@ static PyMethodDef sys_methods[] = { SYS_GETDEFAULTENCODING_METHODDEF SYS_GETDLOPENFLAGS_METHODDEF SYS_GETALLOCATEDBLOCKS_METHODDEF - SYS_GETCOUNTS_METHODDEF #ifdef DYNAMIC_EXECUTION_PROFILE {"getdxp", _Py_GetDXProfile, METH_VARARGS}, #endif From 4b524161a0f9d50d782e739a3708434ffd4e94a5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 3 Feb 2020 17:28:26 +0100 Subject: [PATCH 277/380] bpo-39542: Move object.h debug functions to internal C API (GH-18331) Move the following functions from the public C API to the internal C API: * _PyDebug_PrintTotalRefs(), * _Py_PrintReferenceAddresses() * _Py_PrintReferences() --- Include/internal/pycore_object.h | 9 +++++++++ Include/object.h | 7 ------- Python/pylifecycle.c | 1 + Python/pythonrun.c | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index ba6636d7f8c..eac39c8a3fc 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -77,6 +77,15 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno, #define _PyObject_GC_UNTRACK(op) \ _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op)) +#ifdef Py_REF_DEBUG +extern void _PyDebug_PrintTotalRefs(void); +#endif + +#ifdef Py_TRACE_REFS +extern void _Py_PrintReferences(FILE *); +extern void _Py_PrintReferenceAddresses(FILE *); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/object.h b/Include/object.h index 1a2e704e93d..e1cc47aeb3d 100644 --- a/Include/object.h +++ b/Include/object.h @@ -395,11 +395,6 @@ PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); #define _Py_INC_REFTOTAL _Py_RefTotal++ #define _Py_DEC_REFTOTAL _Py_RefTotal-- - -/* Py_REF_DEBUG also controls the display of refcounts and memory block - * allocations at the interactive prompt and at interpreter shutdown - */ -PyAPI_FUNC(void) _PyDebug_PrintTotalRefs(void); #else #define _Py_INC_REFTOTAL #define _Py_DEC_REFTOTAL @@ -413,8 +408,6 @@ PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); /* Py_TRACE_REFS is such major surgery that we call external routines. */ PyAPI_FUNC(void) _Py_NewReference(PyObject *); PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -PyAPI_FUNC(void) _Py_PrintReferences(FILE *); -PyAPI_FUNC(void) _Py_PrintReferenceAddresses(FILE *); PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); #else /* Without Py_TRACE_REFS, there's little enough to do that we expand code diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index f1307356a7d..fbeebbdf99d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -10,6 +10,7 @@ #include "pycore_initconfig.h" #include "pycore_fileutils.h" #include "pycore_hamt.h" +#include "pycore_object.h" #include "pycore_pathconfig.h" #include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" diff --git a/Python/pythonrun.c b/Python/pythonrun.c index b68a0b5572a..f4ded2e24a3 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -12,6 +12,7 @@ #include "Python-ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pylifecycle.h" #include "pycore_pystate.h" From 24e5ad4689de9adc8e4a7d8c08fe400dcea668e6 Mon Sep 17 00:00:00 2001 From: Stefan Pochmann Date: Mon, 3 Feb 2020 17:47:20 +0100 Subject: [PATCH 278/380] Fixes in sorting descriptions (GH-18317) Improvements in listsort.txt and a comment in sortperf.py. Automerge-Triggered-By: @csabella --- Lib/test/sortperf.py | 2 +- Objects/listsort.txt | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py index 171e5cef5e2..14a9d827ed5 100644 --- a/Lib/test/sortperf.py +++ b/Lib/test/sortperf.py @@ -134,7 +134,7 @@ def tabulate(r): L = list(range(half - 1, -1, -1)) L.extend(range(half)) # Force to float, so that the timings are comparable. This is - # significantly faster if we leave tham as ints. + # significantly faster if we leave them as ints. L = list(map(float, L)) doit(L) # !sort print() diff --git a/Objects/listsort.txt b/Objects/listsort.txt index 43fe1574c32..174777a2658 100644 --- a/Objects/listsort.txt +++ b/Objects/listsort.txt @@ -319,13 +319,13 @@ So merging is always done on two consecutive runs at a time, and in-place, although this may require some temp memory (more on that later). When a run is identified, its base address and length are pushed on a stack -in the MergeState struct. merge_collapse() is then called to see whether it -should merge it with preceding run(s). We would like to delay merging as -long as possible in order to exploit patterns that may come up later, but we -like even more to do merging as soon as possible to exploit that the run just -found is still high in the memory hierarchy. We also can't delay merging -"too long" because it consumes memory to remember the runs that are still -unmerged, and the stack has a fixed size. +in the MergeState struct. merge_collapse() is then called to potentially +merge runs on that stack. We would like to delay merging as long as possible +in order to exploit patterns that may come up later, but we like even more to +do merging as soon as possible to exploit that the run just found is still +high in the memory hierarchy. We also can't delay merging "too long" because +it consumes memory to remember the runs that are still unmerged, and the +stack has a fixed size. What turned out to be a good compromise maintains two invariants on the stack entries, where A, B and C are the lengths of the three rightmost not-yet @@ -739,7 +739,7 @@ slice (leaving off both endpoints) (2**(k-1)-1)+1 through (2**k-1)-1 inclusive = 2**(k-1) through (2**k-1)-1 inclusive, which has (2**k-1)-1 - 2**(k-1) + 1 = 2**k-1 - 2**(k-1) = - 2*2**k-1 - 2**(k-1) = + 2*2**(k-1)-1 - 2**(k-1) = (2-1)*2**(k-1) - 1 = 2**(k-1) - 1 elements. From 49932fec62c616ec88da52642339d83ae719e924 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 3 Feb 2020 17:55:05 +0100 Subject: [PATCH 279/380] bpo-39542: Simplify _Py_NewReference() (GH-18332) * Remove _Py_INC_REFTOTAL and _Py_DEC_REFTOTAL macros: modify directly _Py_RefTotal. * _Py_ForgetReference() is no longer defined if the Py_TRACE_REFS macro is not defined. * Remove _Py_NewReference() implementation from object.c: unify the two implementations in object.h inline function. * Fix Py_TRACE_REFS build: _Py_INC_TPALLOCS() macro has been removed. --- Include/object.h | 42 ++++++++++++++------------------------- Modules/_testcapimodule.c | 8 +++++--- Objects/bytesobject.c | 6 +++++- Objects/dictobject.c | 26 ++++++++++++++++-------- Objects/object.c | 21 +++++--------------- Objects/tupleobject.c | 9 +++++++-- Objects/unicodeobject.c | 6 +++++- 7 files changed, 60 insertions(+), 58 deletions(-) diff --git a/Include/object.h b/Include/object.h index e1cc47aeb3d..175a208f0d2 100644 --- a/Include/object.h +++ b/Include/object.h @@ -379,25 +379,11 @@ decision that's up to the implementer of each new type so if you want, you can count such references to the type object.) */ -/* First define a pile of simple helper macros, one set per special - * build symbol. These either expand to the obvious things, or to - * nothing at all when the special mode isn't in effect. The main - * macros can later be defined just once then, yet expand to different - * things depending on which special build options are and aren't in effect. - * Trust me : while painful, this is 20x easier to understand than, - * e.g, defining _Py_NewReference five different times in a maze of nested - * #ifdefs (we used to do that -- it was impenetrable). - */ #ifdef Py_REF_DEBUG PyAPI_DATA(Py_ssize_t) _Py_RefTotal; PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op); PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); -#define _Py_INC_REFTOTAL _Py_RefTotal++ -#define _Py_DEC_REFTOTAL _Py_RefTotal-- -#else -#define _Py_INC_REFTOTAL -#define _Py_DEC_REFTOTAL #endif /* Py_REF_DEBUG */ /* Update the Python traceback of an object. This function must be called @@ -406,33 +392,33 @@ PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); #ifdef Py_TRACE_REFS /* Py_TRACE_REFS is such major surgery that we call external routines. */ -PyAPI_FUNC(void) _Py_NewReference(PyObject *); PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); -#else -/* Without Py_TRACE_REFS, there's little enough to do that we expand code - inline. */ +#endif + + static inline void _Py_NewReference(PyObject *op) { if (_Py_tracemalloc_config.tracing) { _PyTraceMalloc_NewReference(op); } - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif Py_REFCNT(op) = 1; +#ifdef Py_TRACE_REFS + _Py_AddToAllObjects(op, 1); +#endif } -static inline void _Py_ForgetReference(PyObject *Py_UNUSED(op)) -{ - /* nothing to do */ -} -#endif /* !Py_TRACE_REFS */ - PyAPI_FUNC(void) _Py_Dealloc(PyObject *); static inline void _Py_INCREF(PyObject *op) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif op->ob_refcnt++; } @@ -444,7 +430,9 @@ static inline void _Py_DECREF( #endif PyObject *op) { - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--op->ob_refcnt != 0) { #ifdef Py_REF_DEBUG if (op->ob_refcnt < 0) { diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 4dcfde45437..c5812f827df 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3586,9 +3586,11 @@ slot_tp_del(PyObject *self) self->ob_refcnt = refcnt; } assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif } static PyObject * diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 00151b82566..5334eca7f33 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2948,8 +2948,12 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) return (*pv == NULL) ? -1 : 0; } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(v); +#endif *pv = (PyObject *) PyObject_REALLOC(v, PyBytesObject_SIZE + newsize); if (*pv == NULL) { diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 87f88abbe53..ae6b50ff272 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -311,7 +311,9 @@ static void free_keys_object(PyDictKeysObject *keys); static inline void dictkeys_incref(PyDictKeysObject *dk) { - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt++; } @@ -319,7 +321,9 @@ static inline void dictkeys_decref(PyDictKeysObject *dk) { assert(dk->dk_refcnt > 0); - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (--dk->dk_refcnt == 0) { free_keys_object(dk); } @@ -563,7 +567,9 @@ static PyDictKeysObject *new_keys_object(Py_ssize_t size) return NULL; } } - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif dk->dk_refcnt = 1; dk->dk_size = size; dk->dk_usable = usable; @@ -687,10 +693,12 @@ clone_combined_dict(PyDictObject *orig) } /* Since we copied the keys table we now have an extra reference - in the system. Manually call _Py_INC_REFTOTAL to signal that + in the system. Manually call increment _Py_RefTotal to signal that we have it now; calling dictkeys_incref would be an error as keys->dk_refcnt is already set to 1 (after memcpy). */ - _Py_INC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif return (PyObject *)new; } @@ -1249,13 +1257,15 @@ dictresize(PyDictObject *mp, Py_ssize_t minsize) assert(oldkeys->dk_lookup != lookdict_split); assert(oldkeys->dk_refcnt == 1); +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif if (oldkeys->dk_size == PyDict_MINSIZE && - numfreekeys < PyDict_MAXFREELIST) { - _Py_DEC_REFTOTAL; + numfreekeys < PyDict_MAXFREELIST) + { keys_free_list[numfreekeys++] = oldkeys; } else { - _Py_DEC_REFTOTAL; PyObject_FREE(oldkeys); } } diff --git a/Objects/object.c b/Objects/object.c index 2154d119a02..085605ae367 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -232,9 +232,11 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) _PyObject_ASSERT(self, (!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self))); - /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so - * we need to undo that. */ - _Py_DEC_REFTOTAL; + /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased + _Py_RefTotal, so we need to undo that. */ +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif return -1; } @@ -1804,19 +1806,6 @@ _PyTypes_Init(void) #ifdef Py_TRACE_REFS - -void -_Py_NewReference(PyObject *op) -{ - if (_Py_tracemalloc_config.tracing) { - _PyTraceMalloc_NewReference(op); - } - _Py_INC_REFTOTAL; - op->ob_refcnt = 1; - _Py_AddToAllObjects(op, 1); - _Py_INC_TPALLOCS(op); -} - void _Py_ForgetReference(PyObject *op) { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 2708b9aad31..8c8c66f266f 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -902,10 +902,15 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; - if (_PyObject_GC_IS_TRACKED(v)) +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif + if (_PyObject_GC_IS_TRACKED(v)) { _PyObject_GC_UNTRACK(v); + } +#ifdef Py_TRACE_REFS _Py_ForgetReference((PyObject *) v); +#endif /* DECREF items deleted by shrinkage */ for (i = newsize; i < oldsize; i++) { Py_CLEAR(v->ob_item[i]); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 8e1161e5387..5f10437a152 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1037,8 +1037,12 @@ resize_compact(PyObject *unicode, Py_ssize_t length) _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } - _Py_DEC_REFTOTAL; +#ifdef Py_REF_DEBUG + _Py_RefTotal--; +#endif +#ifdef Py_TRACE_REFS _Py_ForgetReference(unicode); +#endif new_unicode = (PyObject *)PyObject_REALLOC(unicode, new_size); if (new_unicode == NULL) { From 5807efd4c396d5718325e21f5a14e324a77ff77c Mon Sep 17 00:00:00 2001 From: Adorilson Bezerra Date: Mon, 3 Feb 2020 14:11:19 -0300 Subject: [PATCH 280/380] bpo-38558: Link to further docs from walrus operator mention in tutorial (GH-16973) --- Doc/faq/design.rst | 2 ++ Doc/tutorial/datastructures.rst | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index 75cd20fb71d..df3dbf4977e 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -148,6 +148,8 @@ variables and instance variables live in two different namespaces, and you need to tell Python which namespace to use. +.. _why-can-t-i-use-an-assignment-in-an-expression: + Why can't I use an assignment in an expression? ----------------------------------------------- diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 2f7afb088f3..0edb73ad736 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -676,9 +676,10 @@ to a variable. For example, :: 'Trondheim' Note that in Python, unlike C, assignment inside expressions must be done -explicitly with the walrus operator ``:=``. This avoids a common class of -problems encountered in C programs: typing ``=`` in an expression when ``==`` -was intended. +explicitly with the +:ref:`walrus operator ` ``:=``. +This avoids a common class of problems encountered in C programs: typing ``=`` +in an expression when ``==`` was intended. .. _tut-comparing: From b6999e5690c7006b0ba4049cfd638513c982a90c Mon Sep 17 00:00:00 2001 From: Chris Withers Date: Tue, 4 Feb 2020 08:05:25 +0000 Subject: [PATCH 281/380] add whatsnew that was missed from 31d6de5aba009914efa8f0f3c3d7da35217578eb (#18344) --- Doc/whatsnew/3.9.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 3b7a9d105d0..6e080c7033c 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -398,6 +398,8 @@ Deprecated Removed ======= +* The erroneous version at :data:`unittest.mock.__version__` has been removed. + * :class:`nntplib.NNTP`: ``xpath()`` and ``xgtitle()`` methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. From 4590f72259ecbcea66e12a28af14d867255d2e66 Mon Sep 17 00:00:00 2001 From: Eddie Elizondo Date: Tue, 4 Feb 2020 02:29:25 -0800 Subject: [PATCH 282/380] bpo-38076 Clear the interpreter state only after clearing module globals (GH-18039) Currently, during runtime destruction, `_PyImport_Cleanup` is clearing the interpreter state before clearing out the modules themselves. This leads to a segfault on modules that rely on the module state to clear themselves up. For example, let's take the small snippet added in the issue by @DinoV : ``` import _struct class C: def __init__(self): self.pack = _struct.pack def __del__(self): self.pack('I', -42) _struct.x = C() ``` The module `_struct` uses the module state to run `pack`. Therefore, the module state has to be alive until after the module has been cleared out to successfully run `C.__del__`. This happens at line 606, when `_PyImport_Cleanup` calls `_PyModule_Clear`. In fact, the loop that calls `_PyModule_Clear` has in its comments: > 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. That means that we can't clear the module state (which is used by C Extensions) before we run that loop. Moving `_PyInterpreterState_ClearModules` until after it, fixes the segfault in the code snippet. Finally, this updates a test in `io` to correctly assert the error that it now throws (since it now finds the io module state). The test that uses this is: `test_create_at_shutdown_without_encoding`. Given this test is now working is a proof that the module state now stays alive even when `__del__` is called at module destruction time. Thus, I didn't add a new tests for this. https://bugs.python.org/issue38076 --- Lib/test/test_io.py | 2 +- Lib/test/test_struct.py | 18 ++++++++++++++++++ Lib/test/test_sys.py | 17 +++++++++++++++++ .../2020-01-17-11-37-05.bpo-38076.cxfw2x.rst | 2 ++ Python/import.c | 5 +++-- 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-01-17-11-37-05.bpo-38076.cxfw2x.rst diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 8a123fa1dc0..a66726e9a79 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3683,7 +3683,7 @@ def _to_memoryview(buf): class CTextIOWrapperTest(TextIOWrapperTest): io = io - shutdown_error = "RuntimeError: could not find io module state" + shutdown_error = "LookupError: unknown encoding: ascii" def test_initialization(self): r = self.BytesIO(b"\xc3\xa9\n\n") diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 157efa1347a..4829fbe1b97 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -7,6 +7,7 @@ import struct import sys from test import support +from test.support.script_helper import assert_python_ok ISBIGENDIAN = sys.byteorder == "big" @@ -652,6 +653,23 @@ class StructTest(unittest.TestCase): s2 = struct.Struct(s.format.encode()) self.assertEqual(s2.format, s.format) + def test_struct_cleans_up_at_runtime_shutdown(self): + code = """if 1: + import struct + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + struct.x = C() + """ + rc, stdout, stderr = assert_python_ok("-c", code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertIn(b"Exception ignored in:", stderr) + self.assertIn(b"C.__del__", stderr) class UnpackIteratorTest(unittest.TestCase): """ diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 58701a11f91..c5bd8a4b1ff 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -855,6 +855,23 @@ class SysModuleTest(unittest.TestCase): self.assertIn(b'sys.flags', out[0]) self.assertIn(b'sys.float_info', out[1]) + def test_sys_ignores_cleaning_up_user_data(self): + code = """if 1: + import struct, sys + + class C: + def __init__(self): + self.pack = struct.pack + def __del__(self): + self.pack('I', -42) + + sys.x = C() + """ + rc, stdout, stderr = assert_python_ok('-c', code) + self.assertEqual(rc, 0) + self.assertEqual(stdout.rstrip(), b"") + self.assertEqual(stderr.rstrip(), b"") + @unittest.skipUnless(hasattr(sys, 'getandroidapilevel'), 'need sys.getandroidapilevel()') def test_getandroidapilevel(self): diff --git a/Misc/NEWS.d/next/C API/2020-01-17-11-37-05.bpo-38076.cxfw2x.rst b/Misc/NEWS.d/next/C API/2020-01-17-11-37-05.bpo-38076.cxfw2x.rst new file mode 100644 index 00000000000..d9f6dc31efd --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-17-11-37-05.bpo-38076.cxfw2x.rst @@ -0,0 +1,2 @@ +Fix to clear the interpreter state only after clearing module globals to +guarantee module state access from C Extensions during runtime destruction diff --git a/Python/import.c b/Python/import.c index 9838c3fa045..8bf044827c6 100644 --- a/Python/import.c +++ b/Python/import.c @@ -568,8 +568,6 @@ _PyImport_Cleanup(PyThreadState *tstate) _PyErr_Clear(tstate); } Py_XDECREF(dict); - /* Clear module dict copies stored in the interpreter state */ - _PyInterpreterState_ClearModules(interp); /* Collect references */ _PyGC_CollectNoFail(); /* Dump GC stats before it's too late, since it uses the warnings @@ -621,6 +619,9 @@ _PyImport_Cleanup(PyThreadState *tstate) } _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. */ From 850a4bd839ca11b59439e21dda2a3ebe917a9a16 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 4 Feb 2020 13:42:13 +0100 Subject: [PATCH 283/380] Restore PyObject_IsInstance() comment (GH-18345) Restore PyObject_IsInstance() comment explaining why only tuples of types are accepted, but not general sequence. Comment written by Guido van Rossum in commit 03290ecbf1661c0192e6abdbe00ae163af461d77 which implements isinstance(x, (A, B, ...)). The comment was lost in a PyObject_IsInstance() optimization: commit ec569b794737be248671d0dfac11b664fc930eef. Cleanup also the code. recursive_isinstance() is no longer recursive, so rename it to object_isinstance(), whereas object_isinstance() is recursive and so rename it to object_recursive_isinstance(). --- Objects/abstract.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/Objects/abstract.c b/Objects/abstract.c index dc8ba10762d..aca1a4e5189 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2423,7 +2423,7 @@ check_class(PyObject *cls, const char *error) } static int -recursive_isinstance(PyObject *inst, PyObject *cls) +object_isinstance(PyObject *inst, PyObject *cls) { PyObject *icls; int retval; @@ -2461,21 +2461,23 @@ recursive_isinstance(PyObject *inst, PyObject *cls) } static int -object_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls) +object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls) { _Py_IDENTIFIER(__instancecheck__); - PyObject *checker; /* Quick test for an exact match */ - if (Py_TYPE(inst) == (PyTypeObject *)cls) + if (Py_TYPE(inst) == (PyTypeObject *)cls) { return 1; + } /* We know what type's __instancecheck__ does. */ if (PyType_CheckExact(cls)) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } if (PyTuple_Check(cls)) { + /* Not a general sequence -- that opens up the road to + recursion and stack overflow. */ if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { return -1; } @@ -2483,37 +2485,41 @@ object_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls) int r = 0; for (Py_ssize_t i = 0; i < n; ++i) { PyObject *item = PyTuple_GET_ITEM(cls, i); - r = object_isinstance(tstate, inst, item); - if (r != 0) + r = object_recursive_isinstance(tstate, inst, item); + if (r != 0) { /* either found it, or got an error */ break; + } } _Py_LeaveRecursiveCall(tstate); return r; } - checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); + PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__); if (checker != NULL) { - int ok = -1; if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) { Py_DECREF(checker); - return ok; + return -1; } + PyObject *res = _PyObject_CallOneArg(checker, inst); _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); - if (res != NULL) { - ok = PyObject_IsTrue(res); - Py_DECREF(res); + + if (res == NULL) { + return -1; } + int ok = PyObject_IsTrue(res); + Py_DECREF(res); + return ok; } else if (_PyErr_Occurred(tstate)) { return -1; } - /* Probably never reached anymore. */ - return recursive_isinstance(inst, cls); + /* cls has no __instancecheck__() method */ + return object_isinstance(inst, cls); } @@ -2521,7 +2527,7 @@ int PyObject_IsInstance(PyObject *inst, PyObject *cls) { PyThreadState *tstate = _PyThreadState_GET(); - return object_isinstance(tstate, inst, cls); + return object_recursive_isinstance(tstate, inst, cls); } @@ -2611,7 +2617,7 @@ PyObject_IsSubclass(PyObject *derived, PyObject *cls) int _PyObject_RealIsInstance(PyObject *inst, PyObject *cls) { - return recursive_isinstance(inst, cls); + return object_isinstance(inst, cls); } int From 9538bc9185e934bee2bd5ae2cda2b2e92a61906d Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Tue, 4 Feb 2020 16:24:30 +0100 Subject: [PATCH 284/380] bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit_*" symbol names in distutils (GH-18150) Make it export the correct init symbol also on Windows. https://bugs.python.org/issue39432 --- Lib/distutils/command/build_ext.py | 10 +++++++++- Lib/distutils/tests/test_build_ext.py | 13 +++++++++++++ .../2020-01-23-16-08-58.bpo-39432.Cee6mi.rst | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 38bb8fd93c2..1a9bd1200f8 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -689,7 +689,15 @@ class build_ext(Command): provided, "PyInit_" + module_name. Only relevant on Windows, where the .pyd file (DLL) must export the module "PyInit_" function. """ - initfunc_name = "PyInit_" + ext.name.split('.')[-1] + suffix = '_' + ext.name.split('.')[-1] + try: + # Unicode module name support as defined in PEP-489 + # https://www.python.org/dev/peps/pep-0489/#export-hook-name + suffix.encode('ascii') + except UnicodeEncodeError: + suffix = 'U' + suffix.encode('punycode').replace(b'-', b'_').decode('ascii') + + initfunc_name = "PyInit" + suffix if initfunc_name not in ext.export_symbols: ext.export_symbols.append(initfunc_name) return ext.export_symbols diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 52d36b2484f..7e3eafa8ef2 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -304,6 +304,19 @@ class BuildExtTestCase(TempdirManager, cmd.ensure_finalized() self.assertEqual(cmd.get_source_files(), ['xxx']) + def test_unicode_module_names(self): + modules = [ + Extension('foo', ['aaa'], optional=False), + Extension('föö', ['uuu'], optional=False), + ] + dist = Distribution({'name': 'xx', 'ext_modules': modules}) + cmd = self.build_ext(dist) + cmd.ensure_finalized() + self.assertRegex(cmd.get_ext_filename(modules[0].name), r'foo\..*') + self.assertRegex(cmd.get_ext_filename(modules[1].name), r'föö\..*') + self.assertEqual(cmd.get_export_symbols(modules[0]), ['PyInit_foo']) + self.assertEqual(cmd.get_export_symbols(modules[1]), ['PyInitU_f_gkaa']) + def test_compiler_option(self): # cmd.compiler is an option and # should not be overridden by a compiler instance diff --git a/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst b/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst new file mode 100644 index 00000000000..21c4ba86207 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-23-16-08-58.bpo-39432.Cee6mi.rst @@ -0,0 +1 @@ +Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol names in distutils to make it export the correct init symbol also on Windows. From cb1c0746f277052e45a60d6c436a765e34722821 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 4 Feb 2020 22:25:16 +0100 Subject: [PATCH 285/380] closes bpo-39510: Fix use-after-free in BufferedReader.readinto() (GH-18295) When called on a closed object, readinto() segfaults on account of a write to a freed buffer: ==220553== Process terminating with default action of signal 11 (SIGSEGV): dumping core ==220553== Access not within mapped region at address 0x2A ==220553== at 0x48408A0: memmove (vg_replace_strmem.c:1272) ==220553== by 0x58DB0C: _buffered_readinto_generic (bufferedio.c:972) ==220553== by 0x58DCBA: _io__Buffered_readinto_impl (bufferedio.c:1053) ==220553== by 0x58DCBA: _io__Buffered_readinto (bufferedio.c.h:253) Reproducer: reader = open ("/dev/zero", "rb") _void = reader.read (42) reader.close () reader.readinto (bytearray (42)) ### BANG! The problem exists since 2012 when commit dc469454ec added code to free the read buffer on close(). Signed-off-by: Philipp Gesang --- Lib/test/test_io.py | 5 +++++ .../2020-02-04-10-27-41.bpo-39510.PMIh-f.rst | 1 + Modules/_io/bufferedio.c | 1 + 3 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-04-10-27-41.bpo-39510.PMIh-f.rst diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index a66726e9a79..0bfa4d249e9 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -737,6 +737,11 @@ class IOTest(unittest.TestCase): file.seek(0) file.close() self.assertRaises(ValueError, file.read) + with self.open(support.TESTFN, "rb") as f: + file = self.open(f.fileno(), "rb", closefd=False) + self.assertEqual(file.read()[:3], b"egg") + file.close() + self.assertRaises(ValueError, file.readinto, bytearray(1)) def test_no_closefd_with_filename(self): # can't use closefd in combination with a file name diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-04-10-27-41.bpo-39510.PMIh-f.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-04-10-27-41.bpo-39510.PMIh-f.rst new file mode 100644 index 00000000000..9a38e4ab762 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-04-10-27-41.bpo-39510.PMIh-f.rst @@ -0,0 +1 @@ +Fix segfault in ``readinto()`` method on closed BufferedReader. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 586e93f25e2..ddd17a2863c 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -965,6 +965,7 @@ _buffered_readinto_generic(buffered *self, Py_buffer *buffer, char readinto1) PyObject *res = NULL; CHECK_INITIALIZED(self) + CHECK_CLOSED(self, "readinto of closed file") n = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t); if (n > 0) { From 2545fa87628b4caca519da8aeb0eeef368b9dc0d Mon Sep 17 00:00:00 2001 From: Baljak Date: Wed, 5 Feb 2020 01:10:16 +0100 Subject: [PATCH 286/380] Fix MinGW library generation command (GH-17917) To print the exports to stdout, the gendef command requires the option "-". Without this option, no output is generated. --- Doc/whatsnew/3.8.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index fabc1c597ec..cb4c518662d 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -2109,7 +2109,7 @@ Changes in the C API .. code-block:: shell - gendef python38.dll > tmp.def + gendef - python38.dll > tmp.def dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a The location of an installed :file:`pythonXY.dll` will depend on the From 40e547dfbb9052ca0c667b242f6825ed1c23c195 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 01:11:10 +0100 Subject: [PATCH 287/380] bpo-39542: Make _Py_NewReference() opaque in C API (GH-18346) _Py_NewReference() becomes a regular opaque function, rather than a static inline function in the C API (object.h), to better hide implementation details. Move _Py_tracemalloc_config from public pymem.h to internal pycore_pymem.h header. Make _Py_AddToAllObjects() private. --- Include/internal/pycore_pymem.h | 34 ++++++++++++++++++++++++++++++++ Include/object.h | 21 ++------------------ Include/pymem.h | 35 --------------------------------- Modules/_tracemalloc.c | 1 + Objects/object.c | 18 ++++++++++++++++- 5 files changed, 54 insertions(+), 55 deletions(-) diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 06d0d06c75c..db153e0bd2d 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -169,6 +169,40 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName( PYMEM_ALLOCATOR_NOT_SET does nothing. */ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); +/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference() + which access directly _Py_tracemalloc_config.tracing for best + performances. */ +struct _PyTraceMalloc_Config { + /* Module initialized? + Variable protected by the GIL */ + enum { + TRACEMALLOC_NOT_INITIALIZED, + TRACEMALLOC_INITIALIZED, + TRACEMALLOC_FINALIZED + } initialized; + + /* Is tracemalloc tracing memory allocations? + Variable protected by the GIL */ + int tracing; + + /* limit of the number of frames in a traceback, 1 by default. + Variable protected by the GIL. */ + int max_nframe; + + /* use domain in trace key? + Variable protected by the GIL. */ + int use_domain; +}; + +#define _PyTraceMalloc_Config_INIT \ + {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ + .tracing = 0, \ + .max_nframe = 1, \ + .use_domain = 0} + +PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; + + #ifdef __cplusplus } #endif diff --git a/Include/object.h b/Include/object.h index 175a208f0d2..8dccbf16971 100644 --- a/Include/object.h +++ b/Include/object.h @@ -1,8 +1,6 @@ #ifndef Py_OBJECT_H #define Py_OBJECT_H -#include "pymem.h" /* _Py_tracemalloc_config */ - #ifdef __cplusplus extern "C" { #endif @@ -390,28 +388,13 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); when a memory block is reused from a free list. */ PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); +PyAPI_FUNC(void) _Py_NewReference(PyObject *op); + #ifdef Py_TRACE_REFS /* Py_TRACE_REFS is such major surgery that we call external routines. */ PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force); #endif - -static inline void _Py_NewReference(PyObject *op) -{ - if (_Py_tracemalloc_config.tracing) { - _PyTraceMalloc_NewReference(op); - } -#ifdef Py_REF_DEBUG - _Py_RefTotal++; -#endif - Py_REFCNT(op) = 1; -#ifdef Py_TRACE_REFS - _Py_AddToAllObjects(op, 1); -#endif -} - - PyAPI_FUNC(void) _Py_Dealloc(PyObject *); static inline void _Py_INCREF(PyObject *op) diff --git a/Include/pymem.h b/Include/pymem.h index 07b380aa6e7..607feb9484f 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -101,41 +101,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_Del PyMem_Free #define PyMem_DEL PyMem_FREE -/* bpo-35053: expose _Py_tracemalloc_config for performance: - _Py_NewReference() needs an efficient check to test if tracemalloc is - tracing. - - It has to be defined in pymem.h, before object.h is included. */ -struct _PyTraceMalloc_Config { - /* Module initialized? - Variable protected by the GIL */ - enum { - TRACEMALLOC_NOT_INITIALIZED, - TRACEMALLOC_INITIALIZED, - TRACEMALLOC_FINALIZED - } initialized; - - /* Is tracemalloc tracing memory allocations? - Variable protected by the GIL */ - int tracing; - - /* limit of the number of frames in a traceback, 1 by default. - Variable protected by the GIL. */ - int max_nframe; - - /* use domain in trace key? - Variable protected by the GIL. */ - int use_domain; -}; - -PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config; - -#define _PyTraceMalloc_Config_INIT \ - {.initialized = TRACEMALLOC_NOT_INITIALIZED, \ - .tracing = 0, \ - .max_nframe = 1, \ - .use_domain = 0} - #ifndef Py_LIMITED_API # define Py_CPYTHON_PYMEM_H diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index 70219721b51..ddf6ef4e11d 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -1,4 +1,5 @@ #include "Python.h" +#include "pycore_pymem.h" #include "pycore_traceback.h" #include "hashtable.h" #include "frameobject.h" diff --git a/Objects/object.c b/Objects/object.c index 085605ae367..e6bfad4e729 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -93,7 +93,7 @@ static PyObject refchain = {&refchain, &refchain}; * way, though; exceptions include statically allocated type objects, and * statically allocated singletons (like Py_True and Py_None). */ -void +static void _Py_AddToAllObjects(PyObject *op, int force) { #ifdef Py_DEBUG @@ -1805,6 +1805,22 @@ _PyTypes_Init(void) } +void +_Py_NewReference(PyObject *op) +{ + if (_Py_tracemalloc_config.tracing) { + _PyTraceMalloc_NewReference(op); + } +#ifdef Py_REF_DEBUG + _Py_RefTotal++; +#endif + Py_REFCNT(op) = 1; +#ifdef Py_TRACE_REFS + _Py_AddToAllObjects(op, 1); +#endif +} + + #ifdef Py_TRACE_REFS void _Py_ForgetReference(PyObject *op) From 95f60010219e142a436fae18e1695cbc45407afe Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Tue, 4 Feb 2020 16:15:00 -0800 Subject: [PATCH 288/380] bpo-39184: Add audit events to command execution functions in os and pty modules (GH-17824) --- Doc/library/os.rst | 10 ++++ Doc/library/pty.rst | 1 + Lib/pty.py | 2 + .../2020-01-07-00-42-08.bpo-39184.fe7NgK.rst | 1 + Modules/posixmodule.c | 49 ++++++++++++++++--- 5 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2020-01-07-00-42-08.bpo-39184.fe7NgK.rst diff --git a/Doc/library/os.rst b/Doc/library/os.rst index f59423c6f2d..bfc03227e4e 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3314,6 +3314,8 @@ to be ignored. you can check whether or not it is available using :data:`os.supports_fd`. If it is unavailable, using it will raise a :exc:`NotImplementedError`. + .. audit-event:: os.exec path,args,env os.execl + .. availability:: Unix, Windows. .. versionadded:: 3.3 @@ -3670,6 +3672,8 @@ written in Python, such as a mail server's external command delivery program. :c:data:`POSIX_SPAWN_SETSCHEDPARAM` and :c:data:`POSIX_SPAWN_SETSCHEDULER` flags. + .. audit-event:: os.posix_spawn path,argv,env os.posix_spawn + .. versionadded:: 3.8 .. availability:: Unix. @@ -3684,6 +3688,8 @@ written in Python, such as a mail server's external command delivery program. for the *executable* file in the list of directories specified by the :envvar:`PATH` environment variable (in the same way as for ``execvp(3)``). + .. audit-event:: os.posix_spawn path,argv,env os.posix_spawnp + .. versionadded:: 3.8 .. availability:: See :func:`posix_spawn` documentation. @@ -3784,6 +3790,8 @@ written in Python, such as a mail server's external command delivery program. L = ['cp', 'index.html', '/dev/null'] os.spawnvpe(os.P_WAIT, 'cp', L, os.environ) + .. audit-event:: os.spawn mode,path,args,env os.spawnl + .. availability:: Unix, Windows. :func:`spawnlp`, :func:`spawnlpe`, :func:`spawnvp` and :func:`spawnvpe` are not available on Windows. :func:`spawnle` and :func:`spawnve` are not thread-safe on Windows; we advise you to use the @@ -3853,6 +3861,8 @@ written in Python, such as a mail server's external command delivery program. function is not resolved until this function is first called. If the function cannot be resolved, :exc:`NotImplementedError` will be raised. + .. audit-event:: os.startfile path,operation os.startfile + .. availability:: Windows. diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index 12268437d07..e85d2e239fd 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -69,6 +69,7 @@ The :mod:`pty` module defines the following functions: *select* throws an error on your platform when passed three empty lists. This is a bug, documented in `issue 26228 `_. + .. audit-event:: pty.spawn argv pty.spawn .. versionchanged:: 3.4 :func:`spawn` now returns the status value from :func:`os.waitpid` diff --git a/Lib/pty.py b/Lib/pty.py index e841f12f3ed..a32432041fa 100644 --- a/Lib/pty.py +++ b/Lib/pty.py @@ -8,6 +8,7 @@ from select import select import os +import sys import tty __all__ = ["openpty","fork","spawn"] @@ -151,6 +152,7 @@ def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" if type(argv) == type(''): argv = (argv,) + sys.audit('pty.spawn', argv) pid, master_fd = fork() if pid == CHILD: os.execlp(argv[0], *argv) diff --git a/Misc/NEWS.d/next/Security/2020-01-07-00-42-08.bpo-39184.fe7NgK.rst b/Misc/NEWS.d/next/Security/2020-01-07-00-42-08.bpo-39184.fe7NgK.rst new file mode 100644 index 00000000000..1ab5d4d70ee --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-01-07-00-42-08.bpo-39184.fe7NgK.rst @@ -0,0 +1 @@ +Add audit events to command execution functions in os and pty modules. \ No newline at end of file diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b71eddf90b7..ec3da4fb2fc 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5234,6 +5234,12 @@ os_execv_impl(PyObject *module, path_t *path, PyObject *argv) return NULL; } + if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, + argv, Py_None) < 0) { + free_string_array(argvlist, argc); + return NULL; + } + _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WEXECV _wexecv(path->wide, argvlist); @@ -5277,7 +5283,7 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) if (!PyList_Check(argv) && !PyTuple_Check(argv)) { PyErr_SetString(PyExc_TypeError, "execve: argv must be a tuple or list"); - goto fail; + goto fail_0; } argc = PySequence_Size(argv); if (argc < 1) { @@ -5288,22 +5294,27 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) if (!PyMapping_Check(env)) { PyErr_SetString(PyExc_TypeError, "execve: environment must be a mapping object"); - goto fail; + goto fail_0; } argvlist = parse_arglist(argv, &argc); if (argvlist == NULL) { - goto fail; + goto fail_0; } if (!argvlist[0][0]) { PyErr_SetString(PyExc_ValueError, "execve: argv first element cannot be empty"); - goto fail; + goto fail_0; } envlist = parse_envlist(env, &envc); if (envlist == NULL) - goto fail; + goto fail_0; + + if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, + argv, env) < 0) { + goto fail_1; + } _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_FEXECVE @@ -5321,9 +5332,9 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) /* If we get here it's definitely an error */ posix_path_error(path); - + fail_1: free_string_array(envlist, envc); - fail: + fail_0: if (argvlist) free_string_array(argvlist, argc); return NULL; @@ -5654,6 +5665,11 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a } attrp = &attr; + if (PySys_Audit("os.posix_spawn", "OOO", + path->object ? path->object : Py_None, argv, env) < 0) { + goto exit; + } + _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_POSIX_SPAWNP if (use_posix_spawnp) { @@ -5894,6 +5910,13 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv) mode = _P_OVERLAY; #endif + if (PySys_Audit("os.spawn", "iOOO", mode, + path->object ? path->object : Py_None, argv, + Py_None) < 0) { + free_string_array(argvlist, argc); + return NULL; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV @@ -6003,6 +6026,11 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, mode = _P_OVERLAY; #endif + if (PySys_Audit("os.spawn", "iOOO", mode, + path->object ? path->object : Py_None, argv, env) < 0) { + goto fail_2; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef HAVE_WSPAWNV @@ -6021,6 +6049,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, else res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval); + fail_2: while (--envc >= 0) PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); @@ -11701,6 +11730,12 @@ os_startfile_impl(PyObject *module, path_t *filepath, "startfile not available on this platform"); } + if (PySys_Audit("os.startfile", "Ou", + filepath->object ? filepath->object : Py_None, + operation) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS rc = Py_ShellExecuteW((HWND)0, operation, filepath->wide, NULL, NULL, SW_SHOWNORMAL); From 89ae20b30e4543f379ee647c965eb46200556496 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Wed, 5 Feb 2020 11:30:19 +1100 Subject: [PATCH 289/380] bpo-39185 Add the d[etailed] and q[uiet] verbosity levels for msbuild (GH-17791) --- .../next/Windows/2020-01-02-01-11-53.bpo-39185.T4herN.rst | 1 + PCbuild/build.bat | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Windows/2020-01-02-01-11-53.bpo-39185.T4herN.rst diff --git a/Misc/NEWS.d/next/Windows/2020-01-02-01-11-53.bpo-39185.T4herN.rst b/Misc/NEWS.d/next/Windows/2020-01-02-01-11-53.bpo-39185.T4herN.rst new file mode 100644 index 00000000000..3b84bd52172 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-02-01-11-53.bpo-39185.T4herN.rst @@ -0,0 +1 @@ +The build.bat script has additional options for very-quiet output (-q) and very-verbose output (-vv) \ No newline at end of file diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 7c24e0b1555..ba7154d8cb1 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -27,6 +27,8 @@ echo. building externals. echo. -m Enable parallel build (enabled by default) echo. -M Disable parallel build echo. -v Increased output messages +echo. -vv Verbose output messages +echo. -q Quiet output messages (errors and warnings only) echo. -k Attempt to kill any running Pythons before building (usually done echo. automatically by the pythoncore project) echo. --pgo Build with Profile-Guided Optimization. This flag @@ -73,6 +75,8 @@ if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts +if "%~1"=="-vv" (set verbose=/v:d /ds) & shift & goto CheckOpts +if "%~1"=="-q" (set verbose=/v:q /nologo /clp:summary) & shift & goto CheckOpts if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts From cf5b109dbb39bcff1bc5b5d22036866d11de971b Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Wed, 5 Feb 2020 02:10:19 +0100 Subject: [PATCH 290/380] bpo-39491: Merge PEP 593 (typing.Annotated) support (#18260) * bpo-39491: Merge PEP 593 (typing.Annotated) support PEP 593 has been accepted some time ago. I got a green light for merging this from Till, so I went ahead and combined the code contributed to typing_extensions[1] and the documentation from the PEP 593 text[2]. My changes were limited to: * removing code designed for typing_extensions to run on older Python versions * removing some irrelevant parts of the PEP text when copying it over as documentation and otherwise changing few small bits to better serve the purpose * changing the get_type_hints signature to match reality (parameter names) I wasn't entirely sure how to go about crediting the authors but I used my best judgment, let me know if something needs changing in this regard. [1] https://github.com/python/typing/blob/8280de241fd8c8afe727c7860254b753e383b360/typing_extensions/src_py3/typing_extensions.py [2] https://github.com/python/peps/blob/17710b879882454d55f82c2d44596e8e9f8e4bff/pep-0593.rst --- Doc/library/typing.rst | 102 +++++++- Doc/whatsnew/3.9.rst | 8 + Lib/test/test_typing.py | 234 ++++++++++++++++++ Lib/typing.py | 126 +++++++++- .../2020-01-29-22-47-12.bpo-39491.tdl17b.rst | 3 + 5 files changed, 467 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-29-22-47-12.bpo-39491.tdl17b.rst diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 323dac20822..d3bab94c6dd 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -1028,7 +1028,7 @@ The module defines the following classes, functions and decorators: runtime we intentionally don't check anything (we want this to be as fast as possible). -.. function:: get_type_hints(obj[, globals[, locals]]) +.. function:: get_type_hints(obj, globalns=None, localns=None, include_extras=False) Return a dictionary containing type hints for a function, method, module or class object. @@ -1041,6 +1041,22 @@ The module defines the following classes, functions and decorators: a dictionary constructed by merging all the ``__annotations__`` along ``C.__mro__`` in reverse order. + The function recursively replaces all ``Annotated[T, ...]`` with ``T``, + unless ``include_extras`` is set to ``True`` (see :class:`Annotated` for + more information). For example:: + + class Student(NamedTuple): + name: Annotated[str, 'some marker'] + + get_type_hints(Student) == {'name': str} + get_type_hints(Student, include_extras=False) == {'name': str} + get_type_hints(Student, include_extras=True) == { + 'name': Annotated[str, 'some marker'] + } + + .. versionchanged:: 3.9 + Added ``include_extras`` parameter as part of :pep:`593`. + .. function:: get_origin(tp) .. function:: get_args(tp) @@ -1372,3 +1388,87 @@ The module defines the following classes, functions and decorators: evaluated, so the second annotation does not need to be enclosed in quotes. .. versionadded:: 3.5.2 + +.. data:: Annotated + + A type, introduced in :pep:`593` (``Flexible function and variable + annotations``), to decorate existing types with context-specific metadata + (possibly multiple pieces of it, as ``Annotated`` is variadic). + Specifically, a type ``T`` can be annotated with metadata ``x`` via the + typehint ``Annotated[T, x]``. This metadata can be used for either static + analysis or at runtime. If a library (or tool) encounters a typehint + ``Annotated[T, x]`` and has no special logic for metadata ``x``, it + should ignore it and simply treat the type as ``T``. Unlike the + ``no_type_check`` functionality that currently exists in the ``typing`` + module which completely disables typechecking annotations on a function + or a class, the ``Annotated`` type allows for both static typechecking + of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) + together with runtime access to ``x`` within a specific application. + + Ultimately, the responsibility of how to interpret the annotations (if + at all) is the responsibility of the tool or library encountering the + ``Annotated`` type. A tool or library encountering an ``Annotated`` type + can scan through the annotations to determine if they are of interest + (e.g., using ``isinstance()``). + + When a tool or a library does not support annotations or encounters an + unknown annotation it should just ignore it and treat annotated type as + the underlying type. + + It's up to the tool consuming the annotations to decide whether the + client is allowed to have several annotations on one type and how to + merge those annotations. + + Since the ``Annotated`` type allows you to put several annotations of + the same (or different) type(s) on any node, the tools or libraries + consuming those annotations are in charge of dealing with potential + duplicates. For example, if you are doing value range analysis you might + allow this:: + + T1 = Annotated[int, ValueRange(-10, 5)] + T2 = Annotated[T1, ValueRange(-20, 3)] + + Passing ``include_extras=True`` to :func:`get_type_hints` lets one + access the extra annotations at runtime. + + The details of the syntax: + + * The first argument to ``Annotated`` must be a valid type + + * Multiple type annotations are supported (``Annotated`` supports variadic + arguments):: + + Annotated[int, ValueRange(3, 10), ctype("char")] + + * ``Annotated`` must be called with at least two arguments ( + ``Annotated[int]`` is not valid) + + * The order of the annotations is preserved and matters for equality + checks:: + + Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[ + int, ctype("char"), ValueRange(3, 10) + ] + + * Nested ``Annotated`` types are flattened, with metadata ordered + starting with the innermost annotation:: + + Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[ + int, ValueRange(3, 10), ctype("char") + ] + + * Duplicated annotations are not removed:: + + Annotated[int, ValueRange(3, 10)] != Annotated[ + int, ValueRange(3, 10), ValueRange(3, 10) + ] + + * ``Annotated`` can be used with nested and generic aliases:: + + T = TypeVar('T') + Vec = Annotated[List[Tuple[T, T]], MaxLen(10)] + V = Vec[int] + + V == Annotated[List[Tuple[int, int]], MaxLen(10)] + + .. versionadded:: 3.9 diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 6e080c7033c..66caf3f6f82 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -303,6 +303,14 @@ signal Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to signals to a process using a file descriptor instead of a pid. (:issue:`38712`) +typing +------ + +:pep:`593` introduced an :data:`typing.Annotated` type to decorate existing +types with context-specific metadata and new ``include_extras`` parameter to +:func:`typing.get_type_hints` to access the metadata at runtime. (Contributed +by Till Varoquaux and Konstantin Kashin.) + Optimizations ============= diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 5b4916f9c32..bc6a3db4e00 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -22,6 +22,7 @@ from typing import NewType from typing import NamedTuple, TypedDict from typing import IO, TextIO, BinaryIO from typing import Pattern, Match +from typing import Annotated import abc import typing import weakref @@ -2891,6 +2892,64 @@ class GetTypeHintTests(BaseTestCase): self.assertEqual(gth(ForRefExample.func), expects) self.assertEqual(gth(ForRefExample.nested), expects) + def test_get_type_hints_annotated(self): + def foobar(x: List['X']): ... + X = Annotated[int, (1, 10)] + self.assertEqual( + get_type_hints(foobar, globals(), locals()), + {'x': List[int]} + ) + self.assertEqual( + get_type_hints(foobar, globals(), locals(), include_extras=True), + {'x': List[Annotated[int, (1, 10)]]} + ) + BA = Tuple[Annotated[T, (1, 0)], ...] + def barfoo(x: BA): ... + self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], Tuple[T, ...]) + self.assertIs( + get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'], + BA + ) + def barfoo2(x: typing.Callable[..., Annotated[List[T], "const"]], + y: typing.Union[int, Annotated[T, "mutable"]]): ... + self.assertEqual( + get_type_hints(barfoo2, globals(), locals()), + {'x': typing.Callable[..., List[T]], 'y': typing.Union[int, T]} + ) + BA2 = typing.Callable[..., List[T]] + def barfoo3(x: BA2): ... + self.assertIs( + get_type_hints(barfoo3, globals(), locals(), include_extras=True)["x"], + BA2 + ) + + def test_get_type_hints_annotated_refs(self): + + Const = Annotated[T, "Const"] + + class MySet(Generic[T]): + + def __ior__(self, other: "Const[MySet[T]]") -> "MySet[T]": + ... + + def __iand__(self, other: Const["MySet[T]"]) -> "MySet[T]": + ... + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__iand__, globals(), locals(), include_extras=True), + {'other': Const[MySet[T]], 'return': MySet[T]} + ) + + self.assertEqual( + get_type_hints(MySet.__ior__, globals(), locals()), + {'other': MySet[T], 'return': MySet[T]} + ) + class GetUtilitiesTestCase(TestCase): def test_get_origin(self): @@ -2906,6 +2965,7 @@ class GetUtilitiesTestCase(TestCase): self.assertIs(get_origin(Generic), Generic) self.assertIs(get_origin(Generic[T]), Generic) self.assertIs(get_origin(List[Tuple[T, T]][int]), list) + self.assertIs(get_origin(Annotated[T, 'thing']), Annotated) def test_get_args(self): T = TypeVar('T') @@ -2926,6 +2986,7 @@ class GetUtilitiesTestCase(TestCase): (int, Callable[[Tuple[T, ...]], str])) self.assertEqual(get_args(Tuple[int, ...]), (int, ...)) self.assertEqual(get_args(Tuple[()]), ((),)) + self.assertEqual(get_args(Annotated[T, 'one', 2, ['three']]), (T, 'one', 2, ['three'])) class CollectionsAbcTests(BaseTestCase): @@ -3844,6 +3905,179 @@ class RETests(BaseTestCase): "type 're.Match' is not an acceptable base type") +class AnnotatedTests(BaseTestCase): + + def test_repr(self): + self.assertEqual( + repr(Annotated[int, 4, 5]), + "typing.Annotated[int, 4, 5]" + ) + self.assertEqual( + repr(Annotated[List[int], 4, 5]), + "typing.Annotated[typing.List[int], 4, 5]" + ) + + def test_flatten(self): + A = Annotated[Annotated[int, 4], 5] + self.assertEqual(A, Annotated[int, 4, 5]) + self.assertEqual(A.__metadata__, (4, 5)) + self.assertEqual(A.__origin__, int) + + def test_specialize(self): + L = Annotated[List[T], "my decoration"] + LI = Annotated[List[int], "my decoration"] + self.assertEqual(L[int], Annotated[List[int], "my decoration"]) + self.assertEqual(L[int].__metadata__, ("my decoration",)) + self.assertEqual(L[int].__origin__, List[int]) + with self.assertRaises(TypeError): + LI[int] + with self.assertRaises(TypeError): + L[int, float] + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_instantiate(self): + class C: + classvar = 4 + + def __init__(self, x): + self.x = x + + def __eq__(self, other): + if not isinstance(other, C): + return NotImplemented + return other.x == self.x + + A = Annotated[C, "a decoration"] + a = A(5) + c = C(5) + self.assertEqual(a, c) + self.assertEqual(a.x, c.x) + self.assertEqual(a.classvar, c.classvar) + + def test_instantiate_generic(self): + MyCount = Annotated[typing.Counter[T], "my decoration"] + self.assertEqual(MyCount([4, 4, 5]), {4: 2, 5: 1}) + self.assertEqual(MyCount[int]([4, 4, 5]), {4: 2, 5: 1}) + + def test_cannot_instantiate_forward(self): + A = Annotated["int", (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_instantiate_type_var(self): + A = Annotated[T, (5, 6)] + with self.assertRaises(TypeError): + A(5) + + def test_cannot_getattr_typevar(self): + with self.assertRaises(AttributeError): + Annotated[T, (5, 7)].x + + def test_attr_passthrough(self): + class C: + classvar = 4 + + A = Annotated[C, "a decoration"] + self.assertEqual(A.classvar, 4) + A.x = 5 + self.assertEqual(C.x, 5) + + def test_hash_eq(self): + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) + self.assertEqual( + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, + {Annotated[int, 4, 5], Annotated[T, 4, 5]} + ) + + def test_cannot_subclass(self): + with self.assertRaisesRegex(TypeError, "Cannot subclass .*Annotated"): + class C(Annotated): + pass + + def test_cannot_check_instance(self): + with self.assertRaises(TypeError): + isinstance(5, Annotated[int, "positive"]) + + def test_cannot_check_subclass(self): + with self.assertRaises(TypeError): + issubclass(int, Annotated[int, "positive"]) + + def test_pickle(self): + samples = [typing.Any, typing.Union[int, str], + typing.Optional[str], Tuple[int, ...], + typing.Callable[[str], bytes]] + + for t in samples: + x = Annotated[t, "a"] + + for prot in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(protocol=prot, type=t): + pickled = pickle.dumps(x, prot) + restored = pickle.loads(pickled) + self.assertEqual(x, restored) + + global _Annotated_test_G + + class _Annotated_test_G(Generic[T]): + x = 1 + + G = Annotated[_Annotated_test_G[int], "A decoration"] + G.foo = 42 + G.bar = 'abc' + + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + z = pickle.dumps(G, proto) + x = pickle.loads(z) + self.assertEqual(x.foo, 42) + self.assertEqual(x.bar, 'abc') + self.assertEqual(x.x, 1) + + def test_subst(self): + dec = "a decoration" + dec2 = "another decoration" + + S = Annotated[T, dec2] + self.assertEqual(S[int], Annotated[int, dec2]) + + self.assertEqual(S[Annotated[int, dec]], Annotated[int, dec, dec2]) + L = Annotated[List[T], dec] + + self.assertEqual(L[int], Annotated[List[int], dec]) + with self.assertRaises(TypeError): + L[int, int] + + self.assertEqual(S[L[int]], Annotated[List[int], dec, dec2]) + + D = Annotated[typing.Dict[KT, VT], dec] + self.assertEqual(D[str, int], Annotated[typing.Dict[str, int], dec]) + with self.assertRaises(TypeError): + D[int] + + It = Annotated[int, dec] + with self.assertRaises(TypeError): + It[None] + + LI = L[int] + with self.assertRaises(TypeError): + LI[None] + + def test_annotated_in_other_types(self): + X = List[Annotated[T, 5]] + self.assertEqual(X[int], List[Annotated[int, 5]]) + + class AllTests(BaseTestCase): """Tests for __all__.""" diff --git a/Lib/typing.py b/Lib/typing.py index 28c887ed35e..5a7077c27c4 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -31,6 +31,7 @@ from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType # Please keep __all__ alphabetized within each category. __all__ = [ # Super-special typing primitives. + 'Annotated', 'Any', 'Callable', 'ClassVar', @@ -1118,6 +1119,101 @@ class Protocol(Generic, metaclass=_ProtocolMeta): cls.__init__ = _no_init +class _AnnotatedAlias(_GenericAlias, _root=True): + """Runtime representation of an annotated type. + + At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' + with extra annotations. The alias behaves like a normal typing alias, + instantiating is the same as instantiating the underlying type, binding + it to types is also the same. + """ + def __init__(self, origin, metadata): + if isinstance(origin, _AnnotatedAlias): + metadata = origin.__metadata__ + metadata + origin = origin.__origin__ + super().__init__(origin, origin) + self.__metadata__ = metadata + + def copy_with(self, params): + assert len(params) == 1 + new_type = params[0] + return _AnnotatedAlias(new_type, self.__metadata__) + + def __repr__(self): + return "typing.Annotated[{}, {}]".format( + _type_repr(self.__origin__), + ", ".join(repr(a) for a in self.__metadata__) + ) + + def __reduce__(self): + return operator.getitem, ( + Annotated, (self.__origin__,) + self.__metadata__ + ) + + def __eq__(self, other): + if not isinstance(other, _AnnotatedAlias): + return NotImplemented + if self.__origin__ != other.__origin__: + return False + return self.__metadata__ == other.__metadata__ + + def __hash__(self): + return hash((self.__origin__, self.__metadata__)) + + +class Annotated: + """Add context specific metadata to a type. + + Example: Annotated[int, runtime_check.Unsigned] indicates to the + hypothetical runtime_check module that this type is an unsigned int. + Every other consumer of this type can ignore this metadata and treat + this type as int. + + The first argument to Annotated must be a valid type. + + Details: + + - It's an error to call `Annotated` with less than two arguments. + - Nested Annotated are flattened:: + + Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] + + - Instantiating an annotated type is equivalent to instantiating the + underlying type:: + + Annotated[C, Ann1](5) == C(5) + + - Annotated can be used as a generic type alias:: + + Optimized = Annotated[T, runtime.Optimize()] + Optimized[int] == Annotated[int, runtime.Optimize()] + + OptimizedList = Annotated[List[T], runtime.Optimize()] + OptimizedList[int] == Annotated[List[int], runtime.Optimize()] + """ + + __slots__ = () + + def __new__(cls, *args, **kwargs): + raise TypeError("Type Annotated cannot be instantiated.") + + @_tp_cache + def __class_getitem__(cls, params): + if not isinstance(params, tuple) or len(params) < 2: + raise TypeError("Annotated[...] should be used " + "with at least two arguments (a type and an " + "annotation).") + msg = "Annotated[t, ...]: t must be a type." + origin = _type_check(params[0], msg) + metadata = tuple(params[1:]) + return _AnnotatedAlias(origin, metadata) + + def __init_subclass__(cls, *args, **kwargs): + raise TypeError( + "Cannot subclass {}.Annotated".format(cls.__module__) + ) + + def runtime_checkable(cls): """Mark a protocol class as a runtime protocol. @@ -1179,12 +1275,13 @@ _allowed_types = (types.FunctionType, types.BuiltinFunctionType, WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) -def get_type_hints(obj, globalns=None, localns=None): +def get_type_hints(obj, globalns=None, localns=None, include_extras=False): """Return type hints for an object. This is often the same as obj.__annotations__, but it handles - forward references encoded as string literals, and if necessary - adds Optional[t] if a default value equal to None is set. + forward references encoded as string literals, adds Optional[t] if a + default value equal to None is set and recursively replaces all + 'Annotated[T, ...]' with 'T' (unless 'include_extras=True'). The argument may be a module, class, method, or function. The annotations are returned as a dictionary. For classes, annotations include also @@ -1228,7 +1325,7 @@ def get_type_hints(obj, globalns=None, localns=None): value = ForwardRef(value, is_argument=False) value = _eval_type(value, base_globals, localns) hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} if globalns is None: if isinstance(obj, types.ModuleType): @@ -1262,7 +1359,22 @@ def get_type_hints(obj, globalns=None, localns=None): if name in defaults and defaults[name] is None: value = Optional[value] hints[name] = value - return hints + return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()} + + +def _strip_annotations(t): + """Strips the annotations from a given type. + """ + if isinstance(t, _AnnotatedAlias): + return _strip_annotations(t.__origin__) + if isinstance(t, _GenericAlias): + stripped_args = tuple(_strip_annotations(a) for a in t.__args__) + if stripped_args == t.__args__: + return t + res = t.copy_with(stripped_args) + res._special = t._special + return res + return t def get_origin(tp): @@ -1279,6 +1391,8 @@ def get_origin(tp): get_origin(Union[T, int]) is Union get_origin(List[Tuple[T, T]][int]) == list """ + if isinstance(tp, _AnnotatedAlias): + return Annotated if isinstance(tp, _GenericAlias): return tp.__origin__ if tp is Generic: @@ -1297,6 +1411,8 @@ def get_args(tp): get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) get_args(Callable[[], T][int]) == ([], int) """ + if isinstance(tp, _AnnotatedAlias): + return (tp.__origin__,) + tp.__metadata__ if isinstance(tp, _GenericAlias): res = tp.__args__ if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: diff --git a/Misc/NEWS.d/next/Library/2020-01-29-22-47-12.bpo-39491.tdl17b.rst b/Misc/NEWS.d/next/Library/2020-01-29-22-47-12.bpo-39491.tdl17b.rst new file mode 100644 index 00000000000..1dd36454dc2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-29-22-47-12.bpo-39491.tdl17b.rst @@ -0,0 +1,3 @@ +Add :data:`typing.Annotated` and ``include_extras`` parameter to +:func:`typing.get_type_hints` as part of :pep:`593`. Patch by Till +Varoquaux, documentation by Till Varoquaux and Konstantin Kashin. From b439a715cb75e2663df32588fd004c7528b9f83b Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 4 Feb 2020 20:13:00 -0700 Subject: [PATCH 291/380] bpo-39553: Delete HAVE_SXS protected code (GH-18356) https://bugs.python.org/issue39553 Automerge-Triggered-By: @zooba --- .../2020-02-04-19-50-53.bpo-39553._EnweA.rst | 1 + PC/dl_nt.c | 75 ------------------- PC/pyconfig.h | 5 -- Python/dynload_win.c | 15 ---- 4 files changed, 1 insertion(+), 95 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2020-02-04-19-50-53.bpo-39553._EnweA.rst diff --git a/Misc/NEWS.d/next/Windows/2020-02-04-19-50-53.bpo-39553._EnweA.rst b/Misc/NEWS.d/next/Windows/2020-02-04-19-50-53.bpo-39553._EnweA.rst new file mode 100644 index 00000000000..bf6496fa561 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-02-04-19-50-53.bpo-39553._EnweA.rst @@ -0,0 +1 @@ +Delete unused code related to SxS manifests. diff --git a/PC/dl_nt.c b/PC/dl_nt.c index c87c51eb559..0bf04f1bf3d 100644 --- a/PC/dl_nt.c +++ b/PC/dl_nt.c @@ -23,68 +23,6 @@ char dllVersionBuffer[16] = ""; // a private buffer HMODULE PyWin_DLLhModule = NULL; const char *PyWin_DLLVersionString = dllVersionBuffer; -#if HAVE_SXS -// Windows "Activation Context" work. -// Our .pyd extension modules are generally built without a manifest (ie, -// those included with Python and those built with a default distutils. -// This requires we perform some "activation context" magic when loading our -// extensions. In summary: -// * As our DLL loads we save the context being used. -// * Before loading our extensions we re-activate our saved context. -// * After extension load is complete we restore the old context. -// As an added complication, this magic only works on XP or later - we simply -// use the existence (or not) of the relevant function pointers from kernel32. -// See bug 4566 (http://python.org/sf/4566) for more details. -// In Visual Studio 2010, side by side assemblies are no longer used by -// default. - -typedef BOOL (WINAPI * PFN_GETCURRENTACTCTX)(HANDLE *); -typedef BOOL (WINAPI * PFN_ACTIVATEACTCTX)(HANDLE, ULONG_PTR *); -typedef BOOL (WINAPI * PFN_DEACTIVATEACTCTX)(DWORD, ULONG_PTR); -typedef BOOL (WINAPI * PFN_ADDREFACTCTX)(HANDLE); -typedef BOOL (WINAPI * PFN_RELEASEACTCTX)(HANDLE); - -// locals and function pointers for this activation context magic. -static HANDLE PyWin_DLLhActivationContext = NULL; // one day it might be public -static PFN_GETCURRENTACTCTX pfnGetCurrentActCtx = NULL; -static PFN_ACTIVATEACTCTX pfnActivateActCtx = NULL; -static PFN_DEACTIVATEACTCTX pfnDeactivateActCtx = NULL; -static PFN_ADDREFACTCTX pfnAddRefActCtx = NULL; -static PFN_RELEASEACTCTX pfnReleaseActCtx = NULL; - -void _LoadActCtxPointers() -{ - HINSTANCE hKernel32 = GetModuleHandleW(L"kernel32.dll"); - if (hKernel32) - pfnGetCurrentActCtx = (PFN_GETCURRENTACTCTX) GetProcAddress(hKernel32, "GetCurrentActCtx"); - // If we can't load GetCurrentActCtx (ie, pre XP) , don't bother with the rest. - if (pfnGetCurrentActCtx) { - pfnActivateActCtx = (PFN_ACTIVATEACTCTX) GetProcAddress(hKernel32, "ActivateActCtx"); - pfnDeactivateActCtx = (PFN_DEACTIVATEACTCTX) GetProcAddress(hKernel32, "DeactivateActCtx"); - pfnAddRefActCtx = (PFN_ADDREFACTCTX) GetProcAddress(hKernel32, "AddRefActCtx"); - pfnReleaseActCtx = (PFN_RELEASEACTCTX) GetProcAddress(hKernel32, "ReleaseActCtx"); - } -} - -ULONG_PTR _Py_ActivateActCtx() -{ - ULONG_PTR ret = 0; - if (PyWin_DLLhActivationContext && pfnActivateActCtx) - if (!(*pfnActivateActCtx)(PyWin_DLLhActivationContext, &ret)) { - OutputDebugString("Python failed to activate the activation context before loading a DLL\n"); - ret = 0; // no promise the failing function didn't change it! - } - return ret; -} - -void _Py_DeactivateActCtx(ULONG_PTR cookie) -{ - if (cookie && pfnDeactivateActCtx) - if (!(*pfnDeactivateActCtx)(0, cookie)) - OutputDebugString("Python failed to de-activate the activation context\n"); -} -#endif /* HAVE_SXS */ - BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) @@ -98,22 +36,9 @@ BOOL WINAPI DllMain (HANDLE hInst, // 1000 is a magic number I picked out of the air. Could do with a #define, I spose... LoadString(hInst, 1000, dllVersionBuffer, sizeof(dllVersionBuffer)); #endif - -#if HAVE_SXS - // and capture our activation context for use when loading extensions. - _LoadActCtxPointers(); - if (pfnGetCurrentActCtx && pfnAddRefActCtx) - if ((*pfnGetCurrentActCtx)(&PyWin_DLLhActivationContext)) - if (!(*pfnAddRefActCtx)(PyWin_DLLhActivationContext)) - OutputDebugString("Python failed to load the default activation context\n"); -#endif break; case DLL_PROCESS_DETACH: -#if HAVE_SXS - if (pfnReleaseActCtx) - (*pfnReleaseActCtx)(PyWin_DLLhActivationContext); -#endif break; } return TRUE; diff --git a/PC/pyconfig.h b/PC/pyconfig.h index 6a437ce24bb..424c5be3709 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -195,11 +195,6 @@ typedef int pid_t; #define Py_IS_FINITE(X) _finite(X) #define copysign _copysign -/* Side by Side assemblies supported in VS 2005 and VS 2008 but not 2010*/ -#if _MSC_VER >= 1400 && _MSC_VER < 1600 -#define HAVE_SXS 1 -#endif - /* define some ANSI types that are not defined in earlier Win headers */ #if _MSC_VER >= 1200 /* This file only exists in VC 6.0 or higher */ diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 6deba1134e2..2bf3384b9eb 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -12,12 +12,6 @@ #include "patchlevel.h" #include -// "activation context" magic - see dl_nt.c... -#if HAVE_SXS -extern ULONG_PTR _Py_ActivateActCtx(); -void _Py_DeactivateActCtx(ULONG_PTR cookie); -#endif - #ifdef _DEBUG #define PYD_DEBUG_SUFFIX "_d" #else @@ -187,16 +181,10 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, { HINSTANCE hDLL = NULL; unsigned int old_mode; -#if HAVE_SXS - ULONG_PTR cookie = 0; -#endif /* Don't display a message box when Python can't load a DLL */ old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); -#if HAVE_SXS - cookie = _Py_ActivateActCtx(); -#endif /* bpo-36085: We use LoadLibraryEx with restricted search paths to avoid DLL preloading attacks and enable use of the AddDllDirectory function. We add SEARCH_DLL_LOAD_DIR to @@ -206,9 +194,6 @@ dl_funcptr _PyImport_FindSharedFuncptrWindows(const char *prefix, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); Py_END_ALLOW_THREADS -#if HAVE_SXS - _Py_DeactivateActCtx(cookie); -#endif /* restore old error mode settings */ SetErrorMode(old_mode); From 787b6d548c250f36df6d3f3179f60d754c8aa5e3 Mon Sep 17 00:00:00 2001 From: schwarzichet <15522755+schwarzichet@users.noreply.github.com> Date: Wed, 5 Feb 2020 16:16:58 +0800 Subject: [PATCH 292/380] bpo-39505: delete the redundant '/' in $env:VIRTUAL_ENV (GH-18290) --- Lib/venv/scripts/common/Activate.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/venv/scripts/common/Activate.ps1 b/Lib/venv/scripts/common/Activate.ps1 index 699c84097f1..98cb1b85d11 100644 --- a/Lib/venv/scripts/common/Activate.ps1 +++ b/Lib/venv/scripts/common/Activate.ps1 @@ -168,7 +168,6 @@ if ($VenvDir) { } else { Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - $VenvDir = $VenvDir.Insert($VenvDir.Length, "/") Write-Verbose "VenvDir=$VenvDir" } From f16433a73138f279642e581074135694ddcfe965 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 12:18:28 +0100 Subject: [PATCH 293/380] bpo-39543: Remove unused _Py_Dealloc() macro (GH-18361) The macro is defined after Py_DECREF() and so is no longer used by Py_DECREF(). Moving _Py_Dealloc() macro back from cpython/object.h to object.h would require to move a lot of definitions as well: PyTypeObject and many related types used by PyTypeObject. Keep _Py_Dealloc() as an opaque function call to avoid leaking implementation details in the limited C API (object.h): remove _Py_Dealloc() macro from cpython/object.h. --- Include/cpython/object.h | 10 ---------- Objects/object.c | 2 -- 2 files changed, 12 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 5fcad55c5c9..70f189c8569 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -327,16 +327,6 @@ _PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, #define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) -static inline void _Py_Dealloc_inline(PyObject *op) -{ - destructor dealloc = Py_TYPE(op)->tp_dealloc; -#ifdef Py_TRACE_REFS - _Py_ForgetReference(op); -#endif - (*dealloc)(op); -} -#define _Py_Dealloc(op) _Py_Dealloc_inline(op) - PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); /* Safely decref `op` and set `op` to `op2`. diff --git a/Objects/object.c b/Objects/object.c index e6bfad4e729..1884819b982 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -2162,8 +2162,6 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, } -#undef _Py_Dealloc - void _Py_Dealloc(PyObject *op) { From 0fa4f43db086ac3459811cca4ec5201ffbee694a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 12:23:27 +0100 Subject: [PATCH 294/380] bpo-39542: Exclude trashcan from the limited C API (GH-18362) Exclude trashcan mechanism from the limited C API: it requires access to PyTypeObject and PyThreadState structure fields, whereas these structures are opaque in the limited C API. The trashcan mechanism never worked with the limited C API. Move it from object.h to cpython/object.h. --- Include/cpython/object.h | 86 ++++++++++++++++++ Include/object.h | 87 ------------------- .../2020-02-05-12-00-18.bpo-39542.RJCUKR.rst | 3 + 3 files changed, 89 insertions(+), 87 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-05-12-00-18.bpo-39542.RJCUKR.rst diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 70f189c8569..3c4bf5bb594 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -445,6 +445,92 @@ PyAPI_FUNC(int) _PyObject_CheckConsistency( PyObject *op, int check_content); + +/* Trashcan mechanism, thanks to Christian Tismer. + +When deallocating a container object, it's possible to trigger an unbounded +chain of deallocations, as each Py_DECREF in turn drops the refcount on "the +next" object in the chain to 0. This can easily lead to stack overflows, +especially in threads (which typically have less stack space to work with). + +A container object can avoid this by bracketing the body of its tp_dealloc +function with a pair of macros: + +static void +mytype_dealloc(mytype *p) +{ + ... declarations go here ... + + PyObject_GC_UnTrack(p); // must untrack first + Py_TRASHCAN_BEGIN(p, mytype_dealloc) + ... The body of the deallocator goes here, including all calls ... + ... to Py_DECREF on contained objects. ... + Py_TRASHCAN_END // there should be no code after this +} + +CAUTION: Never return from the middle of the body! If the body needs to +"get out early", put a label immediately before the Py_TRASHCAN_END +call, and goto it. Else the call-depth counter (see below) will stay +above 0 forever, and the trashcan will never get emptied. + +How it works: The BEGIN macro increments a call-depth counter. So long +as this counter is small, the body of the deallocator is run directly without +further ado. But if the counter gets large, it instead adds p to a list of +objects to be deallocated later, skips the body of the deallocator, and +resumes execution after the END macro. The tp_dealloc routine then returns +without deallocating anything (and so unbounded call-stack depth is avoided). + +When the call stack finishes unwinding again, code generated by the END macro +notices this, and calls another routine to deallocate all the objects that +may have been added to the list of deferred deallocations. In effect, a +chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, +with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. + +Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base +class, we need to ensure that the trashcan is only triggered on the tp_dealloc +of the actual class being deallocated. Otherwise we might end up with a +partially-deallocated object. To check this, the tp_dealloc function must be +passed as second argument to Py_TRASHCAN_BEGIN(). +*/ + +/* The new thread-safe private API, invoked by the macros below. */ +PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); +PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); + +#define PyTrash_UNWIND_LEVEL 50 + +#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ + do { \ + PyThreadState *_tstate = NULL; \ + /* If "cond" is false, then _tstate remains NULL and the deallocator \ + * is run normally without involving the trashcan */ \ + if (cond) { \ + _tstate = PyThreadState_GET(); \ + if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ + /* Store the object (to be deallocated later) and jump past \ + * Py_TRASHCAN_END, skipping the body of the deallocator */ \ + _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ + break; \ + } \ + ++_tstate->trash_delete_nesting; \ + } + /* The body of the deallocator is here. */ +#define Py_TRASHCAN_END \ + if (_tstate) { \ + --_tstate->trash_delete_nesting; \ + if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ + _PyTrash_thread_destroy_chain(); \ + } \ + } while (0); + +#define Py_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN_CONDITION(op, \ + Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + +/* For backwards compatibility, these macros enable the trashcan + * unconditionally */ +#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) +#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END + #ifdef __cplusplus } #endif diff --git a/Include/object.h b/Include/object.h index 8dccbf16971..4506757d2dc 100644 --- a/Include/object.h +++ b/Include/object.h @@ -607,93 +607,6 @@ it carefully, it may save lots of calls to Py_INCREF() and Py_DECREF() at times. */ - -/* Trashcan mechanism, thanks to Christian Tismer. - -When deallocating a container object, it's possible to trigger an unbounded -chain of deallocations, as each Py_DECREF in turn drops the refcount on "the -next" object in the chain to 0. This can easily lead to stack overflows, -especially in threads (which typically have less stack space to work with). - -A container object can avoid this by bracketing the body of its tp_dealloc -function with a pair of macros: - -static void -mytype_dealloc(mytype *p) -{ - ... declarations go here ... - - PyObject_GC_UnTrack(p); // must untrack first - Py_TRASHCAN_BEGIN(p, mytype_dealloc) - ... The body of the deallocator goes here, including all calls ... - ... to Py_DECREF on contained objects. ... - Py_TRASHCAN_END // there should be no code after this -} - -CAUTION: Never return from the middle of the body! If the body needs to -"get out early", put a label immediately before the Py_TRASHCAN_END -call, and goto it. Else the call-depth counter (see below) will stay -above 0 forever, and the trashcan will never get emptied. - -How it works: The BEGIN macro increments a call-depth counter. So long -as this counter is small, the body of the deallocator is run directly without -further ado. But if the counter gets large, it instead adds p to a list of -objects to be deallocated later, skips the body of the deallocator, and -resumes execution after the END macro. The tp_dealloc routine then returns -without deallocating anything (and so unbounded call-stack depth is avoided). - -When the call stack finishes unwinding again, code generated by the END macro -notices this, and calls another routine to deallocate all the objects that -may have been added to the list of deferred deallocations. In effect, a -chain of N deallocations is broken into (N-1)/(PyTrash_UNWIND_LEVEL-1) pieces, -with the call stack never exceeding a depth of PyTrash_UNWIND_LEVEL. - -Since the tp_dealloc of a subclass typically calls the tp_dealloc of the base -class, we need to ensure that the trashcan is only triggered on the tp_dealloc -of the actual class being deallocated. Otherwise we might end up with a -partially-deallocated object. To check this, the tp_dealloc function must be -passed as second argument to Py_TRASHCAN_BEGIN(). -*/ - -/* The new thread-safe private API, invoked by the macros below. */ -PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyObject*); -PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); - -#define PyTrash_UNWIND_LEVEL 50 - -#define Py_TRASHCAN_BEGIN_CONDITION(op, cond) \ - do { \ - PyThreadState *_tstate = NULL; \ - /* If "cond" is false, then _tstate remains NULL and the deallocator \ - * is run normally without involving the trashcan */ \ - if (cond) { \ - _tstate = PyThreadState_GET(); \ - if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \ - /* Store the object (to be deallocated later) and jump past \ - * Py_TRASHCAN_END, skipping the body of the deallocator */ \ - _PyTrash_thread_deposit_object(_PyObject_CAST(op)); \ - break; \ - } \ - ++_tstate->trash_delete_nesting; \ - } - /* The body of the deallocator is here. */ -#define Py_TRASHCAN_END \ - if (_tstate) { \ - --_tstate->trash_delete_nesting; \ - if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \ - _PyTrash_thread_destroy_chain(); \ - } \ - } while (0); - -#define Py_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN_CONDITION(op, \ - Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) - -/* For backwards compatibility, these macros enable the trashcan - * unconditionally */ -#define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) -#define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END - - #ifndef Py_LIMITED_API # define Py_CPYTHON_OBJECT_H # include "cpython/object.h" diff --git a/Misc/NEWS.d/next/C API/2020-02-05-12-00-18.bpo-39542.RJCUKR.rst b/Misc/NEWS.d/next/C API/2020-02-05-12-00-18.bpo-39542.RJCUKR.rst new file mode 100644 index 00000000000..5829d6e9748 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-05-12-00-18.bpo-39542.RJCUKR.rst @@ -0,0 +1,3 @@ +Exclude trashcan mechanism from the limited C API: it requires access to +PyTypeObject and PyThreadState structure fields, whereas these structures +are opaque in the limited C API. From f58bd7c1693fe041f7296a5778d0a11287895648 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 13:12:19 +0100 Subject: [PATCH 295/380] bpo-39542: Make PyObject_INIT() opaque in limited C API (GH-18363) In the limited C API, PyObject_INIT() and PyObject_INIT_VAR() are now defined as aliases to PyObject_Init() and PyObject_InitVar() to make their implementation opaque. It avoids to leak implementation details in the limited C API. Exclude the following functions from the limited C API, move them from object.h to cpython/object.h: * _Py_NewReference() * _Py_ForgetReference() * _PyTraceMalloc_NewReference() * _Py_GetRefTotal() --- Include/cpython/object.h | 16 +++++++ Include/cpython/objimpl.h | 33 +++++++++++++ Include/object.h | 15 +----- Include/objimpl.h | 47 ++++++------------- .../2020-02-05-12-40-51.bpo-39542.si-_Zq.rst | 7 +++ Objects/object.c | 12 +++-- 6 files changed, 79 insertions(+), 51 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-05-12-40-51.bpo-39542.si-_Zq.rst diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 3c4bf5bb594..e36f824eeb3 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -6,6 +6,22 @@ extern "C" { #endif +PyAPI_FUNC(void) _Py_NewReference(PyObject *op); + +#ifdef Py_TRACE_REFS +/* Py_TRACE_REFS is such major surgery that we call external routines. */ +PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); +#endif + +/* Update the Python traceback of an object. This function must be called + when a memory block is reused from a free list. */ +PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); + +#ifdef Py_REF_DEBUG +PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); +#endif + + /********************* String Literals ****************************************/ /* This structure helps managing static strings. The basic usage goes like this: Instead of doing diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index f121922bc42..3f148146f67 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -6,6 +6,39 @@ extern "C" { #endif +/* Inline functions trading binary compatibility for speed: + PyObject_INIT() is the fast version of PyObject_Init(), and + PyObject_INIT_VAR() is the fast version of PyObject_InitVar(). + + These inline functions must not be called with op=NULL. */ +static inline PyObject* +_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) +{ + assert(op != NULL); + Py_TYPE(op) = typeobj; + if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { + Py_INCREF(typeobj); + } + _Py_NewReference(op); + return op; +} + +#define PyObject_INIT(op, typeobj) \ + _PyObject_INIT(_PyObject_CAST(op), (typeobj)) + +static inline PyVarObject* +_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) +{ + assert(op != NULL); + Py_SIZE(op) = size; + PyObject_INIT((PyObject *)op, typeobj); + return op; +} + +#define PyObject_INIT_VAR(op, typeobj, size) \ + _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) + + /* This function returns the number of allocated memory blocks, regardless of size */ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); diff --git a/Include/object.h b/Include/object.h index 4506757d2dc..91855d0aa8a 100644 --- a/Include/object.h +++ b/Include/object.h @@ -233,8 +233,7 @@ PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyObject_SelfIter(PyObject *); PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); -PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, - PyObject *, PyObject *); +PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyObject_GenericSetDict(PyObject *, PyObject *, void *); #endif @@ -381,20 +380,8 @@ you can count such references to the type object.) PyAPI_DATA(Py_ssize_t) _Py_RefTotal; PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op); -PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); #endif /* Py_REF_DEBUG */ -/* Update the Python traceback of an object. This function must be called - when a memory block is reused from a free list. */ -PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); - -PyAPI_FUNC(void) _Py_NewReference(PyObject *op); - -#ifdef Py_TRACE_REFS -/* Py_TRACE_REFS is such major surgery that we call external routines. */ -PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); -#endif - PyAPI_FUNC(void) _Py_Dealloc(PyObject *); static inline void _Py_INCREF(PyObject *op) diff --git a/Include/objimpl.h b/Include/objimpl.h index 2337d8a56c7..45919251f43 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -127,41 +127,22 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); #define PyObject_NewVar(type, typeobj, n) \ ( (type *) _PyObject_NewVar((typeobj), (n)) ) -/* Inline functions trading binary compatibility for speed: - PyObject_INIT() is the fast version of PyObject_Init(), and - PyObject_INIT_VAR() is the fast version of PyObject_InitVar. - See also pymem.h. - - These inline functions expect non-NULL object pointers. */ -static inline PyObject* -_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) -{ - assert(op != NULL); - Py_TYPE(op) = typeobj; - if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(typeobj); - } - _Py_NewReference(op); - return op; -} - -#define PyObject_INIT(op, typeobj) \ - _PyObject_INIT(_PyObject_CAST(op), (typeobj)) - -static inline PyVarObject* -_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) -{ - assert(op != NULL); - Py_SIZE(op) = size; - PyObject_INIT((PyObject *)op, typeobj); - return op; -} - -#define PyObject_INIT_VAR(op, typeobj, size) \ - _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) - #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) + +#ifdef Py_LIMITED_API +/* Define PyObject_INIT() and PyObject_INIT_VAR() as aliases to PyObject_Init() + and PyObject_InitVar() in the limited C API for compatibility with the + CPython C API. */ +# define PyObject_INIT(op, typeobj) \ + PyObject_Init(_PyObject_CAST(op), (typeobj)) +# define PyObject_INIT_VAR(op, typeobj, size) \ + PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size)) +#else +/* PyObject_INIT() and PyObject_INIT_VAR() are defined in cpython/objimpl.h */ +#endif + + /* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a vrbl-size object with nitems items, exclusive of gc overhead (if any). The value is rounded up to the closest multiple of sizeof(void *), in order to diff --git a/Misc/NEWS.d/next/C API/2020-02-05-12-40-51.bpo-39542.si-_Zq.rst b/Misc/NEWS.d/next/C API/2020-02-05-12-40-51.bpo-39542.si-_Zq.rst new file mode 100644 index 00000000000..7473577b0a9 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-05-12-40-51.bpo-39542.si-_Zq.rst @@ -0,0 +1,7 @@ +In the limited C API, ``PyObject_INIT()`` and ``PyObject_INIT_VAR()`` are +now defined as aliases to :c:func:`PyObject_Init` and +:c:func:`PyObject_InitVar` to make their implementation opaque. It avoids to +leak implementation details in the limited C API. Exclude the following +functions from the limited C API: ``_Py_NewReference()``, +``_Py_ForgetReference()``, ``_PyTraceMalloc_NewReference()`` and +``_Py_GetRefTotal()``. diff --git a/Objects/object.c b/Objects/object.c index 1884819b982..43b838adff2 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -139,9 +139,11 @@ Py_DecRef(PyObject *o) PyObject * PyObject_Init(PyObject *op, PyTypeObject *tp) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT() macro */ + if (op == NULL) { return PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT (objimpl.h) */ + } + Py_TYPE(op) = tp; if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(tp); @@ -153,9 +155,11 @@ PyObject_Init(PyObject *op, PyTypeObject *tp) PyVarObject * PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) { - if (op == NULL) + /* Any changes should be reflected in PyObject_INIT_VAR() macro */ + if (op == NULL) { return (PyVarObject *) PyErr_NoMemory(); - /* Any changes should be reflected in PyObject_INIT_VAR */ + } + Py_SIZE(op) = size; PyObject_Init((PyObject *)op, tp); return op; From 509dd90f4684e40af3105dd3e754fa4b9c1530c1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 14:24:17 +0100 Subject: [PATCH 296/380] bpo-39542: Convert PyType_Check() to static inline function (GH-18364) Convert PyType_HasFeature(), PyType_Check() and PyType_CheckExact() macros to static inline functions. --- Doc/c-api/type.rst | 12 +++---- Include/cpython/object.h | 2 -- Include/object.h | 31 +++++++++++++------ .../2020-02-05-13-14-20.bpo-39542.5mleGX.rst | 2 ++ 4 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 41956b7dca5..f774ca35eda 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -21,14 +21,14 @@ Type Objects .. c:function:: int PyType_Check(PyObject *o) - Return true if the object *o* is a type object, including instances of types - derived from the standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, including instances of + types derived from the standard type object. Return 0 in all other cases. .. c:function:: int PyType_CheckExact(PyObject *o) - Return true if the object *o* is a type object, but not a subtype of the - standard type object. Return false in all other cases. + Return non-zero if the object *o* is a type object, but not a subtype of the + standard type object. Return 0 in all other cases. .. c:function:: unsigned int PyType_ClearCache() @@ -57,8 +57,8 @@ Type Objects .. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature) - Return true if the type object *o* sets the feature *feature*. Type features - are denoted by single bit flags. + Return non-zero if the type object *o* sets the feature *feature*. + Type features are denoted by single bit flags. .. c:function:: int PyType_IS_GC(PyTypeObject *o) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index e36f824eeb3..0b5260eda7d 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -341,8 +341,6 @@ PyAPI_FUNC(int) _PyObject_GenericSetAttrWithDict(PyObject *, PyObject *, PyObject *, PyObject *); -#define PyType_HasFeature(t,f) (((t)->tp_flags & (f)) != 0) - PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *); /* Safely decref `op` and set `op` to `op2`. diff --git a/Include/object.h b/Include/object.h index 91855d0aa8a..3a20e666202 100644 --- a/Include/object.h +++ b/Include/object.h @@ -207,10 +207,6 @@ PyAPI_DATA(struct _typeobject) PySuper_Type; /* built-in 'super' */ PyAPI_FUNC(unsigned long) PyType_GetFlags(struct _typeobject*); -#define PyType_Check(op) \ - PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS) -#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type) - PyAPI_FUNC(int) PyType_Ready(struct _typeobject *); PyAPI_FUNC(PyObject *) PyType_GenericAlloc(struct _typeobject *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyType_GenericNew(struct _typeobject *, @@ -342,11 +338,6 @@ given type object has a specified feature. /* Type structure has tp_finalize member (3.4) */ #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) -#ifdef Py_LIMITED_API -# define PyType_HasFeature(t,f) ((PyType_GetFlags(t) & (f)) != 0) -#endif -#define PyType_FastSubclass(t,f) PyType_HasFeature(t,f) - /* The macros Py_INCREF(op) and Py_DECREF(op) are used to increment or decrement @@ -600,6 +591,28 @@ times. # undef Py_CPYTHON_OBJECT_H #endif + +static inline int +PyType_HasFeature(PyTypeObject *type, unsigned long feature) { +#ifdef Py_LIMITED_API + return ((PyType_GetFlags(type) & feature) != 0); +#else + return ((type->tp_flags & feature) != 0); +#endif +} + +#define PyType_FastSubclass(type, flag) PyType_HasFeature(type, flag) + +static inline int _PyType_Check(PyObject *op) { + return PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TYPE_SUBCLASS); +} +#define PyType_Check(op) _PyType_Check(_PyObject_CAST(op)) + +static inline int _PyType_CheckExact(PyObject *op) { + return (Py_TYPE(op) == &PyType_Type); +} +#define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op)) + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst b/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst new file mode 100644 index 00000000000..46fb1d257e8 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-05-13-14-20.bpo-39542.5mleGX.rst @@ -0,0 +1,2 @@ +Convert :c:func:`PyType_HasFeature`, :c:func:`PyType_Check` and +:c:func:`PyType_CheckExact` macros to static inline functions. From 0e4e735d06967145b49fd00693627f3624991dbc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 15:10:39 +0100 Subject: [PATCH 297/380] bpo-39542: Define PyTypeObject earlier in object.h (GH-18366) Replace "struct _typeobject" with PyTypeObject in object.h. --- Include/object.h | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/Include/object.h b/Include/object.h index 3a20e666202..e7e9c1b8ed7 100644 --- a/Include/object.h +++ b/Include/object.h @@ -61,6 +61,9 @@ whose size is determined when the object is allocated. #error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG #endif +/* PyTypeObject structure is defined in cpython/object.h. + In Py_LIMITED_API, PyTypeObject is an opaque structure. */ +typedef struct _typeobject PyTypeObject; #ifdef Py_TRACE_REFS /* Define pointers to support a doubly-linked list of all live heap objects. */ @@ -102,7 +105,7 @@ whose size is determined when the object is allocated. typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; - struct _typeobject *ob_type; + PyTypeObject *ob_type; } PyObject; /* Cast argument to PyObject* type. */ @@ -165,15 +168,8 @@ typedef PyObject *(*iternextfunc) (PyObject *); typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *); typedef int (*initproc)(PyObject *, PyObject *, PyObject *); -typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *); -typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t); - -#ifdef Py_LIMITED_API -/* In Py_LIMITED_API, PyTypeObject is an opaque structure. */ -typedef struct _typeobject PyTypeObject; -#else -/* PyTypeObject is defined in cpython/object.h */ -#endif +typedef PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *); +typedef PyObject *(*allocfunc)(PyTypeObject *, Py_ssize_t); typedef struct{ int slot; /* slot id, see below */ @@ -193,26 +189,26 @@ PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); #endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 -PyAPI_FUNC(void*) PyType_GetSlot(struct _typeobject*, int); +PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); #endif /* Generic type check */ -PyAPI_FUNC(int) PyType_IsSubtype(struct _typeobject *, struct _typeobject *); +PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); #define PyObject_TypeCheck(ob, tp) \ (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) -PyAPI_DATA(struct _typeobject) PyType_Type; /* built-in 'type' */ -PyAPI_DATA(struct _typeobject) PyBaseObject_Type; /* built-in 'object' */ -PyAPI_DATA(struct _typeobject) PySuper_Type; /* built-in 'super' */ +PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ +PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ +PyAPI_DATA(PyTypeObject) PySuper_Type; /* built-in 'super' */ -PyAPI_FUNC(unsigned long) PyType_GetFlags(struct _typeobject*); +PyAPI_FUNC(unsigned long) PyType_GetFlags(PyTypeObject*); -PyAPI_FUNC(int) PyType_Ready(struct _typeobject *); -PyAPI_FUNC(PyObject *) PyType_GenericAlloc(struct _typeobject *, Py_ssize_t); -PyAPI_FUNC(PyObject *) PyType_GenericNew(struct _typeobject *, +PyAPI_FUNC(int) PyType_Ready(PyTypeObject *); +PyAPI_FUNC(PyObject *) PyType_GenericAlloc(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) PyType_GenericNew(PyTypeObject *, PyObject *, PyObject *); PyAPI_FUNC(unsigned int) PyType_ClearCache(void); -PyAPI_FUNC(void) PyType_Modified(struct _typeobject *); +PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *); From bf305cc6f05948f264349a6a6c6fd7d49c1839d3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 17:39:57 +0100 Subject: [PATCH 298/380] Add PyInterpreterState.fs_codec.utf8 (GH-18367) Add a fast-path for UTF-8 encoding in PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefaultAndSize(). Add _PyUnicode_FiniEncodings() helper function for _PyUnicode_Fini(). --- Include/internal/pycore_pystate.h | 1 + Objects/unicodeobject.c | 107 +++++++++++++++--------------- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index b78ed690425..405efb9f460 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -102,6 +102,7 @@ struct _is { Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ struct { char *encoding; /* Filesystem encoding (encoded to UTF-8) */ + int utf8; /* encoding=="utf-8"? */ char *errors; /* Filesystem errors (encoded to UTF-8) */ _Py_error_handler error_handler; } fs_codec; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5f10437a152..7c8bc06252a 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3615,39 +3615,32 @@ PyObject * PyUnicode_EncodeFSDefault(PyObject *unicode) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + if (interp->fs_codec.utf8) { return unicode_encode_utf8(unicode, interp->fs_codec.error_handler, interp->fs_codec.errors); } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - assert(errors != _Py_ERROR_UNKNOWN); - return unicode_encode_utf8(unicode, errors, NULL); - } -#else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. - See _PyUnicode_InitEncodings(). */ - if (interp->fs_codec.encoding) { +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (interp->fs_codec.encoding) { return PyUnicode_AsEncodedString(unicode, interp->fs_codec.encoding, interp->fs_codec.errors); } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - assert(errors != _Py_ERROR_UNKNOWN); - return unicode_encode_locale(unicode, errors, 0); - } #endif + else { + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use wcstombs() in this case. */ + const wchar_t *filesystem_errors = interp->config.filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); + assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING + return unicode_encode_utf8(unicode, errors, NULL); +#else + return unicode_encode_locale(unicode, errors, 0); +#endif + } } PyObject * @@ -3857,39 +3850,33 @@ PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) { PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); -#ifdef _Py_FORCE_UTF8_FS_ENCODING - if (interp->fs_codec.encoding) { + if (interp->fs_codec.utf8) { return unicode_decode_utf8(s, size, interp->fs_codec.error_handler, interp->fs_codec.errors, NULL); } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - assert(errors != _Py_ERROR_UNKNOWN); - return unicode_decode_utf8(s, size, errors, NULL, NULL); - } -#else - /* Bootstrap check: if the filesystem codec is implemented in Python, we - cannot use it to encode and decode filenames before it is loaded. Load - the Python codec requires to encode at least its own filename. Use the C - implementation of the locale codec until the codec registry is - initialized and the Python codec is loaded. - See _PyUnicode_InitEncodings(). */ - if (interp->fs_codec.encoding) { +#ifndef _Py_FORCE_UTF8_FS_ENCODING + else if (interp->fs_codec.encoding) { return PyUnicode_Decode(s, size, interp->fs_codec.encoding, interp->fs_codec.errors); } - else { - const wchar_t *filesystem_errors = interp->config.filesystem_errors; - _Py_error_handler errors; - errors = get_error_handler_wide(filesystem_errors); - return unicode_decode_locale(s, size, errors, 0); - } #endif + else { + /* Before _PyUnicode_InitEncodings() is called, the Python codec + machinery is not ready and so cannot be used: + use mbstowcs() in this case. */ + const wchar_t *filesystem_errors = interp->config.filesystem_errors; + assert(filesystem_errors != NULL); + _Py_error_handler errors = get_error_handler_wide(filesystem_errors); + assert(errors != _Py_ERROR_UNKNOWN); +#ifdef _Py_FORCE_UTF8_FS_ENCODING + return unicode_decode_utf8(s, size, errors, NULL, NULL); +#else + return unicode_decode_locale(s, size, errors, 0); +#endif + } } @@ -15849,10 +15836,16 @@ init_fs_codec(PyInterpreterState *interp) PyMem_RawFree(interp->fs_codec.encoding); interp->fs_codec.encoding = encoding; + /* encoding has been normalized by init_fs_encoding() */ + interp->fs_codec.utf8 = (strcmp(encoding, "utf-8") == 0); PyMem_RawFree(interp->fs_codec.errors); interp->fs_codec.errors = errors; interp->fs_codec.error_handler = error_handler; +#ifdef _Py_FORCE_UTF8_FS_ENCODING + assert(interp->fs_codec.utf8 == 1); +#endif + /* At this point, PyUnicode_EncodeFSDefault() and PyUnicode_DecodeFSDefault() can now use the Python codec rather than the C implementation of the filesystem encoding. */ @@ -15902,6 +15895,19 @@ _PyUnicode_InitEncodings(PyThreadState *tstate) } +static void +_PyUnicode_FiniEncodings(PyThreadState *tstate) +{ + PyInterpreterState *interp = tstate->interp; + PyMem_RawFree(interp->fs_codec.encoding); + interp->fs_codec.encoding = NULL; + interp->fs_codec.utf8 = 0; + PyMem_RawFree(interp->fs_codec.errors); + interp->fs_codec.errors = NULL; + interp->fs_codec.error_handler = _Py_ERROR_UNKNOWN; +} + + #ifdef MS_WINDOWS int _PyUnicode_EnableLegacyWindowsFSEncoding(void) @@ -15954,12 +15960,7 @@ _PyUnicode_Fini(PyThreadState *tstate) _PyUnicode_ClearStaticStrings(); } - PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); - PyMem_RawFree(interp->fs_codec.encoding); - interp->fs_codec.encoding = NULL; - PyMem_RawFree(interp->fs_codec.errors); - interp->fs_codec.errors = NULL; - interp->config.filesystem_errors = (wchar_t *)_Py_ERROR_UNKNOWN; + _PyUnicode_FiniEncodings(tstate); } From b39fb8e847ac59b539ad7e93df91c1709815180e Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Wed, 5 Feb 2020 18:20:52 +0100 Subject: [PATCH 299/380] bpo-39488: Skip test_largefile tests if not enough disk space (GH-18261) --- Lib/test/test_largefile.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Lib/test/test_largefile.py b/Lib/test/test_largefile.py index e309282d73e..c254b047e1e 100644 --- a/Lib/test/test_largefile.py +++ b/Lib/test/test_largefile.py @@ -151,9 +151,24 @@ class TestFileMethods(LargeFileTest): self.assertTrue(f.seekable()) +def skip_no_disk_space(path, required): + def decorator(fun): + def wrapper(*args, **kwargs): + if shutil.disk_usage(os.path.realpath(path)).free < required: + hsize = int(required / 1024 / 1024) + raise unittest.SkipTest( + f"required {hsize} MiB of free disk space") + return fun(*args, **kwargs) + return wrapper + return decorator + + class TestCopyfile(LargeFileTest, unittest.TestCase): open = staticmethod(io.open) + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) def test_it(self): # Internally shutil.copyfile() can use "fast copy" methods like # os.sendfile(). @@ -200,6 +215,9 @@ class TestSocketSendfile(LargeFileTest, unittest.TestCase): self.thread.start() event.set() + # Exact required disk space would be (size * 2), but let's give it a + # bit more tolerance. + @skip_no_disk_space(TESTFN, size * 2.5) def test_it(self): port = find_unused_port() with socket.create_server(("", port)) as sock: From 58f4e1a6ee4c6ea82f3f5075d9d9d344ce6b8a56 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 5 Feb 2020 18:24:33 +0100 Subject: [PATCH 300/380] bpo-39542: Declare _Py_AddToAllObjects() in pycore_object.h (GH-18368) _Py_AddToAllObjects() is used in bltinmodule.c and typeobject.c when Py_TRACE_REFS is defined. Fix Py_TRACE_REFS build. --- Include/internal/pycore_object.h | 1 + Objects/object.c | 2 +- Python/bltinmodule.c | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index eac39c8a3fc..10a5746997e 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -82,6 +82,7 @@ extern void _PyDebug_PrintTotalRefs(void); #endif #ifdef Py_TRACE_REFS +extern void _Py_AddToAllObjects(PyObject *op, int force); extern void _Py_PrintReferences(FILE *); extern void _Py_PrintReferenceAddresses(FILE *); #endif diff --git a/Objects/object.c b/Objects/object.c index 43b838adff2..9eaa163bdfd 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -93,7 +93,7 @@ static PyObject refchain = {&refchain, &refchain}; * way, though; exceptions include statically allocated type objects, and * statically allocated singletons (like Py_True and Py_None). */ -static void +void _Py_AddToAllObjects(PyObject *op, int force) { #ifdef Py_DEBUG diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 5818eb9e38f..cdb1eaaff01 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -4,6 +4,7 @@ #include #include "ast.h" #undef Yield /* undefine macro conflicting with */ +#include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" #include "pycore_tupleobject.h" @@ -2443,7 +2444,7 @@ builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start) would change the value of empty. In fact, using in-place addition rather that binary addition for any of the steps introduces subtle behavior changes: - + https://bugs.python.org/issue18305 */ temp = PyNumber_Add(result, item); Py_DECREF(result); From 8b6f6526f857bb7523b0fcff09b45bc6471289e9 Mon Sep 17 00:00:00 2001 From: Shantanu Date: Wed, 5 Feb 2020 12:43:09 -0800 Subject: [PATCH 301/380] bpo-39559: Remove unused, undocumented argument from uuid.getnode (GH-18369) --- Lib/uuid.py | 2 +- .../next/Library/2020-02-05-18-29-14.bpo-39559.L8i5YB.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-05-18-29-14.bpo-39559.L8i5YB.rst diff --git a/Lib/uuid.py b/Lib/uuid.py index 6a436d371a3..224a766ff22 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -757,7 +757,7 @@ else: _node = None -def getnode(*, getters=None): +def getnode(): """Get the hardware address as a 48-bit positive integer. The first time this runs, it may launch a separate program, which could diff --git a/Misc/NEWS.d/next/Library/2020-02-05-18-29-14.bpo-39559.L8i5YB.rst b/Misc/NEWS.d/next/Library/2020-02-05-18-29-14.bpo-39559.L8i5YB.rst new file mode 100644 index 00000000000..881f26bdb7b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-05-18-29-14.bpo-39559.L8i5YB.rst @@ -0,0 +1 @@ +Remove unused, undocumented argument ``getters`` from :func:`uuid.getnode` \ No newline at end of file From 3d06953c34fd6421dd1dfdb615578cde676ee0eb Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Wed, 5 Feb 2020 15:09:57 -0600 Subject: [PATCH 302/380] bpo-39127: Make _Py_HashPointer's argument be const (GH-17690) --- Include/pyhash.h | 2 +- Python/pyhash.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/pyhash.h b/Include/pyhash.h index dbcc9744be3..2f398589cee 100644 --- a/Include/pyhash.h +++ b/Include/pyhash.h @@ -8,7 +8,7 @@ extern "C" { /* Helpers for hash functions */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); -PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); +PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); #endif diff --git a/Python/pyhash.c b/Python/pyhash.c index 4c0b929586f..d381dc0230c 100644 --- a/Python/pyhash.c +++ b/Python/pyhash.c @@ -129,7 +129,7 @@ _Py_HashDouble(double v) } Py_hash_t -_Py_HashPointer(void *p) +_Py_HashPointer(const void *p) { Py_hash_t x; size_t y = (size_t)p; From ab0d892288f3058856a8213333e8c3e4ed8a562b Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 6 Feb 2020 15:48:10 +1100 Subject: [PATCH 303/380] bpo-39555: Fix distutils test to handle _d suffix on Windows debug build (GH-18357) --- Lib/distutils/tests/test_build_ext.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index 7e3eafa8ef2..5e47e0773a9 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -312,8 +312,8 @@ class BuildExtTestCase(TempdirManager, dist = Distribution({'name': 'xx', 'ext_modules': modules}) cmd = self.build_ext(dist) cmd.ensure_finalized() - self.assertRegex(cmd.get_ext_filename(modules[0].name), r'foo\..*') - self.assertRegex(cmd.get_ext_filename(modules[1].name), r'föö\..*') + self.assertRegex(cmd.get_ext_filename(modules[0].name), r'foo(_d)?\..*') + self.assertRegex(cmd.get_ext_filename(modules[1].name), r'föö(_d)?\..*') self.assertEqual(cmd.get_export_symbols(modules[0]), ['PyInit_foo']) self.assertEqual(cmd.get_export_symbols(modules[1]), ['PyInitU_f_gkaa']) From 54b4f14712b9350f11c983f1c8ac47a3716958a7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 6 Feb 2020 10:26:37 +0200 Subject: [PATCH 304/380] bpo-38149: Call sys.audit() only once per call for glob.glob(). (GH-18360) --- Lib/glob.py | 2 +- .../next/Library/2020-02-05-11-24-16.bpo-38149.GWsjHE.rst | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-05-11-24-16.bpo-38149.GWsjHE.rst diff --git a/Lib/glob.py b/Lib/glob.py index 0b3fcc6bbb9..0dd2f8be661 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -31,6 +31,7 @@ def iglob(pathname, *, 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) it = _iglob(pathname, recursive, False) if recursive and _isrecursive(pathname): s = next(it) # skip empty string @@ -38,7 +39,6 @@ def iglob(pathname, *, recursive=False): return it def _iglob(pathname, recursive, dironly): - sys.audit("glob.glob", pathname, recursive) dirname, basename = os.path.split(pathname) if not has_magic(pathname): assert not dironly diff --git a/Misc/NEWS.d/next/Library/2020-02-05-11-24-16.bpo-38149.GWsjHE.rst b/Misc/NEWS.d/next/Library/2020-02-05-11-24-16.bpo-38149.GWsjHE.rst new file mode 100644 index 00000000000..b4ec60b2aba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-05-11-24-16.bpo-38149.GWsjHE.rst @@ -0,0 +1,2 @@ +:func:`sys.audit` is now called only once per call of :func:`glob.glob` and +:func:`glob.iglob`. From d2f96672642cc51b92f61b951ca1b11d615c12d1 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Thu, 6 Feb 2020 06:45:46 -0800 Subject: [PATCH 305/380] bpo-38823: Fix refleaks in _ast initialization error path (GH-17276) --- Parser/asdl_c.py | 26 ++- Python/Python-ast.c | 530 +++++++++++++++++++++++++++++--------------- 2 files changed, 372 insertions(+), 184 deletions(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index daac0966f56..e81506cc9a6 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -998,17 +998,25 @@ class ASTModuleVisitor(PickleVisitor): self.emit("if (!init_types()) return NULL;", 1) self.emit('m = PyState_FindModule(&_astmodule);', 1) self.emit("if (!m) return NULL;", 1) + self.emit('if (PyModule_AddObject(m, "AST", astmodulestate_global->AST_type) < 0) {', 1) + self.emit('goto error;', 2) + self.emit('}', 1) self.emit('Py_INCREF(astmodulestate(m)->AST_type);', 1) - self.emit('if (PyModule_AddObject(m, "AST", astmodulestate_global->AST_type) < 0) return NULL;', 1) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) - self.emit("return NULL;", 2) - self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)', 1) - self.emit("return NULL;", 2) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {', 1) + self.emit("goto error;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {', 1) + self.emit("goto error;", 2) + self.emit('}', 1) + self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {', 1) + self.emit("goto error;", 2) + self.emit('}', 1) for dfn in mod.dfns: self.visit(dfn) self.emit("return m;", 1) + self.emit("error:", 0) + self.emit("Py_DECREF(m);", 1) + self.emit("return NULL;", 1) self.emit("}", 0) def visitProduct(self, prod, name): @@ -1024,7 +1032,9 @@ class ASTModuleVisitor(PickleVisitor): def addObj(self, name): self.emit("if (PyModule_AddObject(m, \"%s\", " - "astmodulestate_global->%s_type) < 0) return NULL;" % (name, name), 1) + "astmodulestate_global->%s_type) < 0) {" % (name, name), 1) + self.emit("goto error;", 2) + self.emit('}', 1) self.emit("Py_INCREF(astmodulestate(m)->%s_type);" % name, 1) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index d5465d795cf..e9925e742e7 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -9887,355 +9887,533 @@ PyInit__ast(void) if (!init_types()) return NULL; m = PyState_FindModule(&_astmodule); if (!m) return NULL; + if (PyModule_AddObject(m, "AST", astmodulestate_global->AST_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AST_type); - if (PyModule_AddObject(m, "AST", astmodulestate_global->AST_type) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) - return NULL; - if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) - return NULL; - if (PyModule_AddObject(m, "mod", astmodulestate_global->mod_type) < 0) - return NULL; + if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) { + goto error; + } + if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) { + goto error; + } + if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) { + goto error; + } + if (PyModule_AddObject(m, "mod", astmodulestate_global->mod_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->mod_type); if (PyModule_AddObject(m, "Module", astmodulestate_global->Module_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Module_type); if (PyModule_AddObject(m, "Interactive", - astmodulestate_global->Interactive_type) < 0) return NULL; + astmodulestate_global->Interactive_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Interactive_type); if (PyModule_AddObject(m, "Expression", - astmodulestate_global->Expression_type) < 0) return NULL; + astmodulestate_global->Expression_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Expression_type); if (PyModule_AddObject(m, "FunctionType", - astmodulestate_global->FunctionType_type) < 0) return NULL; + astmodulestate_global->FunctionType_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->FunctionType_type); - if (PyModule_AddObject(m, "Suite", astmodulestate_global->Suite_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Suite", astmodulestate_global->Suite_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Suite_type); - if (PyModule_AddObject(m, "stmt", astmodulestate_global->stmt_type) < 0) - return NULL; + if (PyModule_AddObject(m, "stmt", astmodulestate_global->stmt_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->stmt_type); if (PyModule_AddObject(m, "FunctionDef", - astmodulestate_global->FunctionDef_type) < 0) return NULL; + astmodulestate_global->FunctionDef_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->FunctionDef_type); if (PyModule_AddObject(m, "AsyncFunctionDef", - astmodulestate_global->AsyncFunctionDef_type) < 0) return NULL; + astmodulestate_global->AsyncFunctionDef_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AsyncFunctionDef_type); if (PyModule_AddObject(m, "ClassDef", astmodulestate_global->ClassDef_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->ClassDef_type); if (PyModule_AddObject(m, "Return", astmodulestate_global->Return_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Return_type); if (PyModule_AddObject(m, "Delete", astmodulestate_global->Delete_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Delete_type); if (PyModule_AddObject(m, "Assign", astmodulestate_global->Assign_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Assign_type); if (PyModule_AddObject(m, "AugAssign", - astmodulestate_global->AugAssign_type) < 0) return NULL; + astmodulestate_global->AugAssign_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AugAssign_type); if (PyModule_AddObject(m, "AnnAssign", - astmodulestate_global->AnnAssign_type) < 0) return NULL; + astmodulestate_global->AnnAssign_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AnnAssign_type); - if (PyModule_AddObject(m, "For", astmodulestate_global->For_type) < 0) - return NULL; + if (PyModule_AddObject(m, "For", astmodulestate_global->For_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->For_type); if (PyModule_AddObject(m, "AsyncFor", astmodulestate_global->AsyncFor_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AsyncFor_type); - if (PyModule_AddObject(m, "While", astmodulestate_global->While_type) < 0) - return NULL; + if (PyModule_AddObject(m, "While", astmodulestate_global->While_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->While_type); - if (PyModule_AddObject(m, "If", astmodulestate_global->If_type) < 0) return - NULL; + if (PyModule_AddObject(m, "If", astmodulestate_global->If_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->If_type); - if (PyModule_AddObject(m, "With", astmodulestate_global->With_type) < 0) - return NULL; + if (PyModule_AddObject(m, "With", astmodulestate_global->With_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->With_type); if (PyModule_AddObject(m, "AsyncWith", - astmodulestate_global->AsyncWith_type) < 0) return NULL; + astmodulestate_global->AsyncWith_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AsyncWith_type); - if (PyModule_AddObject(m, "Raise", astmodulestate_global->Raise_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Raise", astmodulestate_global->Raise_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Raise_type); - if (PyModule_AddObject(m, "Try", astmodulestate_global->Try_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Try", astmodulestate_global->Try_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Try_type); if (PyModule_AddObject(m, "Assert", astmodulestate_global->Assert_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Assert_type); if (PyModule_AddObject(m, "Import", astmodulestate_global->Import_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Import_type); if (PyModule_AddObject(m, "ImportFrom", - astmodulestate_global->ImportFrom_type) < 0) return NULL; + astmodulestate_global->ImportFrom_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->ImportFrom_type); if (PyModule_AddObject(m, "Global", astmodulestate_global->Global_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Global_type); if (PyModule_AddObject(m, "Nonlocal", astmodulestate_global->Nonlocal_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Nonlocal_type); - if (PyModule_AddObject(m, "Expr", astmodulestate_global->Expr_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Expr", astmodulestate_global->Expr_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Expr_type); - if (PyModule_AddObject(m, "Pass", astmodulestate_global->Pass_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Pass", astmodulestate_global->Pass_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Pass_type); - if (PyModule_AddObject(m, "Break", astmodulestate_global->Break_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Break", astmodulestate_global->Break_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Break_type); if (PyModule_AddObject(m, "Continue", astmodulestate_global->Continue_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Continue_type); - if (PyModule_AddObject(m, "expr", astmodulestate_global->expr_type) < 0) - return NULL; + if (PyModule_AddObject(m, "expr", astmodulestate_global->expr_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->expr_type); if (PyModule_AddObject(m, "BoolOp", astmodulestate_global->BoolOp_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->BoolOp_type); if (PyModule_AddObject(m, "NamedExpr", - astmodulestate_global->NamedExpr_type) < 0) return NULL; + astmodulestate_global->NamedExpr_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->NamedExpr_type); - if (PyModule_AddObject(m, "BinOp", astmodulestate_global->BinOp_type) < 0) - return NULL; + if (PyModule_AddObject(m, "BinOp", astmodulestate_global->BinOp_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->BinOp_type); if (PyModule_AddObject(m, "UnaryOp", astmodulestate_global->UnaryOp_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->UnaryOp_type); if (PyModule_AddObject(m, "Lambda", astmodulestate_global->Lambda_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Lambda_type); - if (PyModule_AddObject(m, "IfExp", astmodulestate_global->IfExp_type) < 0) - return NULL; + if (PyModule_AddObject(m, "IfExp", astmodulestate_global->IfExp_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->IfExp_type); - if (PyModule_AddObject(m, "Dict", astmodulestate_global->Dict_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Dict", astmodulestate_global->Dict_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Dict_type); - if (PyModule_AddObject(m, "Set", astmodulestate_global->Set_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Set", astmodulestate_global->Set_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Set_type); if (PyModule_AddObject(m, "ListComp", astmodulestate_global->ListComp_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->ListComp_type); if (PyModule_AddObject(m, "SetComp", astmodulestate_global->SetComp_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->SetComp_type); if (PyModule_AddObject(m, "DictComp", astmodulestate_global->DictComp_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->DictComp_type); if (PyModule_AddObject(m, "GeneratorExp", - astmodulestate_global->GeneratorExp_type) < 0) return NULL; + astmodulestate_global->GeneratorExp_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->GeneratorExp_type); - if (PyModule_AddObject(m, "Await", astmodulestate_global->Await_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Await", astmodulestate_global->Await_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Await_type); - if (PyModule_AddObject(m, "Yield", astmodulestate_global->Yield_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Yield", astmodulestate_global->Yield_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Yield_type); if (PyModule_AddObject(m, "YieldFrom", - astmodulestate_global->YieldFrom_type) < 0) return NULL; + astmodulestate_global->YieldFrom_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->YieldFrom_type); if (PyModule_AddObject(m, "Compare", astmodulestate_global->Compare_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Compare_type); - if (PyModule_AddObject(m, "Call", astmodulestate_global->Call_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Call", astmodulestate_global->Call_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Call_type); if (PyModule_AddObject(m, "FormattedValue", - astmodulestate_global->FormattedValue_type) < 0) return NULL; + astmodulestate_global->FormattedValue_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->FormattedValue_type); if (PyModule_AddObject(m, "JoinedStr", - astmodulestate_global->JoinedStr_type) < 0) return NULL; + astmodulestate_global->JoinedStr_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->JoinedStr_type); if (PyModule_AddObject(m, "Constant", astmodulestate_global->Constant_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Constant_type); if (PyModule_AddObject(m, "Attribute", - astmodulestate_global->Attribute_type) < 0) return NULL; + astmodulestate_global->Attribute_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Attribute_type); if (PyModule_AddObject(m, "Subscript", - astmodulestate_global->Subscript_type) < 0) return NULL; + astmodulestate_global->Subscript_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Subscript_type); if (PyModule_AddObject(m, "Starred", astmodulestate_global->Starred_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Starred_type); - if (PyModule_AddObject(m, "Name", astmodulestate_global->Name_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Name", astmodulestate_global->Name_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Name_type); - if (PyModule_AddObject(m, "List", astmodulestate_global->List_type) < 0) - return NULL; + if (PyModule_AddObject(m, "List", astmodulestate_global->List_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->List_type); - if (PyModule_AddObject(m, "Tuple", astmodulestate_global->Tuple_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Tuple", astmodulestate_global->Tuple_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Tuple_type); if (PyModule_AddObject(m, "expr_context", - astmodulestate_global->expr_context_type) < 0) return NULL; + astmodulestate_global->expr_context_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->expr_context_type); - if (PyModule_AddObject(m, "Load", astmodulestate_global->Load_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Load", astmodulestate_global->Load_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Load_type); - if (PyModule_AddObject(m, "Store", astmodulestate_global->Store_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Store", astmodulestate_global->Store_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Store_type); - if (PyModule_AddObject(m, "Del", astmodulestate_global->Del_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Del", astmodulestate_global->Del_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Del_type); if (PyModule_AddObject(m, "AugLoad", astmodulestate_global->AugLoad_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AugLoad_type); if (PyModule_AddObject(m, "AugStore", astmodulestate_global->AugStore_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->AugStore_type); - if (PyModule_AddObject(m, "Param", astmodulestate_global->Param_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Param", astmodulestate_global->Param_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Param_type); - if (PyModule_AddObject(m, "slice", astmodulestate_global->slice_type) < 0) - return NULL; + if (PyModule_AddObject(m, "slice", astmodulestate_global->slice_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->slice_type); - if (PyModule_AddObject(m, "Slice", astmodulestate_global->Slice_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Slice", astmodulestate_global->Slice_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Slice_type); if (PyModule_AddObject(m, "ExtSlice", astmodulestate_global->ExtSlice_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->ExtSlice_type); - if (PyModule_AddObject(m, "Index", astmodulestate_global->Index_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Index", astmodulestate_global->Index_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Index_type); if (PyModule_AddObject(m, "boolop", astmodulestate_global->boolop_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->boolop_type); - if (PyModule_AddObject(m, "And", astmodulestate_global->And_type) < 0) - return NULL; + if (PyModule_AddObject(m, "And", astmodulestate_global->And_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->And_type); - if (PyModule_AddObject(m, "Or", astmodulestate_global->Or_type) < 0) return - NULL; + if (PyModule_AddObject(m, "Or", astmodulestate_global->Or_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Or_type); if (PyModule_AddObject(m, "operator", astmodulestate_global->operator_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->operator_type); - if (PyModule_AddObject(m, "Add", astmodulestate_global->Add_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Add", astmodulestate_global->Add_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Add_type); - if (PyModule_AddObject(m, "Sub", astmodulestate_global->Sub_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Sub", astmodulestate_global->Sub_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Sub_type); - if (PyModule_AddObject(m, "Mult", astmodulestate_global->Mult_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Mult", astmodulestate_global->Mult_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Mult_type); if (PyModule_AddObject(m, "MatMult", astmodulestate_global->MatMult_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->MatMult_type); - if (PyModule_AddObject(m, "Div", astmodulestate_global->Div_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Div", astmodulestate_global->Div_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Div_type); - if (PyModule_AddObject(m, "Mod", astmodulestate_global->Mod_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Mod", astmodulestate_global->Mod_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Mod_type); - if (PyModule_AddObject(m, "Pow", astmodulestate_global->Pow_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Pow", astmodulestate_global->Pow_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Pow_type); if (PyModule_AddObject(m, "LShift", astmodulestate_global->LShift_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->LShift_type); if (PyModule_AddObject(m, "RShift", astmodulestate_global->RShift_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->RShift_type); - if (PyModule_AddObject(m, "BitOr", astmodulestate_global->BitOr_type) < 0) - return NULL; + if (PyModule_AddObject(m, "BitOr", astmodulestate_global->BitOr_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->BitOr_type); if (PyModule_AddObject(m, "BitXor", astmodulestate_global->BitXor_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->BitXor_type); if (PyModule_AddObject(m, "BitAnd", astmodulestate_global->BitAnd_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->BitAnd_type); if (PyModule_AddObject(m, "FloorDiv", astmodulestate_global->FloorDiv_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->FloorDiv_type); if (PyModule_AddObject(m, "unaryop", astmodulestate_global->unaryop_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->unaryop_type); if (PyModule_AddObject(m, "Invert", astmodulestate_global->Invert_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Invert_type); - if (PyModule_AddObject(m, "Not", astmodulestate_global->Not_type) < 0) - return NULL; + if (PyModule_AddObject(m, "Not", astmodulestate_global->Not_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Not_type); - if (PyModule_AddObject(m, "UAdd", astmodulestate_global->UAdd_type) < 0) - return NULL; + if (PyModule_AddObject(m, "UAdd", astmodulestate_global->UAdd_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->UAdd_type); - if (PyModule_AddObject(m, "USub", astmodulestate_global->USub_type) < 0) - return NULL; + if (PyModule_AddObject(m, "USub", astmodulestate_global->USub_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->USub_type); - if (PyModule_AddObject(m, "cmpop", astmodulestate_global->cmpop_type) < 0) - return NULL; + if (PyModule_AddObject(m, "cmpop", astmodulestate_global->cmpop_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->cmpop_type); - if (PyModule_AddObject(m, "Eq", astmodulestate_global->Eq_type) < 0) return - NULL; + if (PyModule_AddObject(m, "Eq", astmodulestate_global->Eq_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Eq_type); - if (PyModule_AddObject(m, "NotEq", astmodulestate_global->NotEq_type) < 0) - return NULL; + if (PyModule_AddObject(m, "NotEq", astmodulestate_global->NotEq_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->NotEq_type); - if (PyModule_AddObject(m, "Lt", astmodulestate_global->Lt_type) < 0) return - NULL; + if (PyModule_AddObject(m, "Lt", astmodulestate_global->Lt_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Lt_type); - if (PyModule_AddObject(m, "LtE", astmodulestate_global->LtE_type) < 0) - return NULL; + if (PyModule_AddObject(m, "LtE", astmodulestate_global->LtE_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->LtE_type); - if (PyModule_AddObject(m, "Gt", astmodulestate_global->Gt_type) < 0) return - NULL; + if (PyModule_AddObject(m, "Gt", astmodulestate_global->Gt_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Gt_type); - if (PyModule_AddObject(m, "GtE", astmodulestate_global->GtE_type) < 0) - return NULL; + if (PyModule_AddObject(m, "GtE", astmodulestate_global->GtE_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->GtE_type); - if (PyModule_AddObject(m, "Is", astmodulestate_global->Is_type) < 0) return - NULL; + if (PyModule_AddObject(m, "Is", astmodulestate_global->Is_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->Is_type); - if (PyModule_AddObject(m, "IsNot", astmodulestate_global->IsNot_type) < 0) - return NULL; + if (PyModule_AddObject(m, "IsNot", astmodulestate_global->IsNot_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->IsNot_type); - if (PyModule_AddObject(m, "In", astmodulestate_global->In_type) < 0) return - NULL; + if (PyModule_AddObject(m, "In", astmodulestate_global->In_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->In_type); - if (PyModule_AddObject(m, "NotIn", astmodulestate_global->NotIn_type) < 0) - return NULL; + if (PyModule_AddObject(m, "NotIn", astmodulestate_global->NotIn_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->NotIn_type); if (PyModule_AddObject(m, "comprehension", - astmodulestate_global->comprehension_type) < 0) return NULL; + astmodulestate_global->comprehension_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->comprehension_type); if (PyModule_AddObject(m, "excepthandler", - astmodulestate_global->excepthandler_type) < 0) return NULL; + astmodulestate_global->excepthandler_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->excepthandler_type); if (PyModule_AddObject(m, "ExceptHandler", - astmodulestate_global->ExceptHandler_type) < 0) return NULL; + astmodulestate_global->ExceptHandler_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->ExceptHandler_type); if (PyModule_AddObject(m, "arguments", - astmodulestate_global->arguments_type) < 0) return NULL; + astmodulestate_global->arguments_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->arguments_type); - if (PyModule_AddObject(m, "arg", astmodulestate_global->arg_type) < 0) - return NULL; + if (PyModule_AddObject(m, "arg", astmodulestate_global->arg_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->arg_type); if (PyModule_AddObject(m, "keyword", astmodulestate_global->keyword_type) < - 0) return NULL; + 0) { + goto error; + } Py_INCREF(astmodulestate(m)->keyword_type); - if (PyModule_AddObject(m, "alias", astmodulestate_global->alias_type) < 0) - return NULL; + if (PyModule_AddObject(m, "alias", astmodulestate_global->alias_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->alias_type); if (PyModule_AddObject(m, "withitem", astmodulestate_global->withitem_type) - < 0) return NULL; + < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->withitem_type); if (PyModule_AddObject(m, "type_ignore", - astmodulestate_global->type_ignore_type) < 0) return NULL; + astmodulestate_global->type_ignore_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->type_ignore_type); if (PyModule_AddObject(m, "TypeIgnore", - astmodulestate_global->TypeIgnore_type) < 0) return NULL; + astmodulestate_global->TypeIgnore_type) < 0) { + goto error; + } Py_INCREF(astmodulestate(m)->TypeIgnore_type); return m; +error: + Py_DECREF(m); + return NULL; } From 3f563cea567fbfed9db539ecbbacfee2d86f7735 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 6 Feb 2020 15:48:27 +0100 Subject: [PATCH 306/380] bpo-39245: Make Vectorcall C API public (GH-17893) * Add backcompat defines and move non-limited API declaration to cpython/ This partially reverts commit 2ff58a24e8a1c7e290d025d69ebaea0bbead3b8c which added PyObject_CallNoArgs to the 3.9+ stable ABI. This should not be done; there are enough other call APIs in the stable ABI to choose from. * Adjust documentation Mark all newly public functions as added in 3.9. Add a note about the 3.8 provisional names. Add notes on public API. * Put PyObject_CallNoArgs back in the limited API * Rename PyObject_FastCallDict to PyObject_VectorcallDict --- Doc/c-api/call.rst | 89 +++++++++++-------- Doc/c-api/typeobj.rst | 20 ++--- Include/cpython/abstract.h | 37 +++++--- Include/object.h | 4 +- .../2020-01-07-13-46-40.bpo-39245.G7wog6.rst | 5 ++ 5 files changed, 89 insertions(+), 66 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-01-07-13-46-40.bpo-39245.G7wog6.rst diff --git a/Doc/c-api/call.rst b/Doc/c-api/call.rst index 0833531b1d5..06db12666d7 100644 --- a/Doc/c-api/call.rst +++ b/Doc/c-api/call.rst @@ -35,17 +35,11 @@ To call an object, use :c:func:`PyObject_Call` or other The Vectorcall Protocol ----------------------- -.. versionadded:: 3.8 +.. versionadded:: 3.9 The vectorcall protocol was introduced in :pep:`590` as an additional protocol for making calls more efficient. -.. warning:: - - The vectorcall API is provisional and expected to become public in - Python 3.9, with a different names and, possibly, changed semantics. - If you use the it, plan for updating your code for Python 3.9. - As rule of thumb, CPython will prefer the vectorcall for internal calls if the callable supports it. However, this is not a hard rule. Additionally, some third-party extensions use *tp_call* directly @@ -69,7 +63,7 @@ the arguments to an args tuple and kwargs dict anyway, then there is no point in implementing vectorcall. Classes can implement the vectorcall protocol by enabling the -:const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag and setting +:const:`Py_TPFLAGS_HAVE_VECTORCALL` flag and setting :c:member:`~PyTypeObject.tp_vectorcall_offset` to the offset inside the object structure where a *vectorcallfunc* appears. This is a pointer to a function with the following signature: @@ -97,7 +91,7 @@ This is a pointer to a function with the following signature: argument 1 (not 0) in the allocated vector. The callee must restore the value of ``args[-1]`` before returning. - For :c:func:`_PyObject_VectorcallMethod`, this flag means instead that + For :c:func:`PyObject_VectorcallMethod`, this flag means instead that ``args[0]`` may be changed. Whenever they can do so cheaply (without additional allocation), callers @@ -107,7 +101,20 @@ This is a pointer to a function with the following signature: To call an object that implements vectorcall, use a :ref:`call API ` function as with any other callable. -:c:func:`_PyObject_Vectorcall` will usually be most efficient. +:c:func:`PyObject_Vectorcall` will usually be most efficient. + + +.. note:: + + In CPython 3.8, the vectorcall API and related functions were available + provisionally under names with a leading underscore: + ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``, + ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``, + ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``, + ``_PyObject_CallMethodOneArg``. + Additionally, ``PyObject_VectorcallDict`` was available as + ``_PyObject_FastCallDict``. + The old names are still defined as aliases of the new, non-underscored names. Recursion Control @@ -137,9 +144,11 @@ Vectorcall Support API However, the function ``PyVectorcall_NARGS`` should be used to allow for future extensions. + This function is not part of the `limited API `_. + .. versionadded:: 3.8 -.. c:function:: vectorcallfunc _PyVectorcall_Function(PyObject *op) +.. c:function:: vectorcallfunc PyVectorcall_Function(PyObject *op) If *op* does not support the vectorcall protocol (either because the type does not or because the specific instance does not), return *NULL*. @@ -147,7 +156,9 @@ Vectorcall Support API This function never raises an exception. This is mostly useful to check whether or not *op* supports vectorcall, - which can be done by checking ``_PyVectorcall_Function(op) != NULL``. + which can be done by checking ``PyVectorcall_Function(op) != NULL``. + + This function is not part of the `limited API `_. .. versionadded:: 3.8 @@ -158,9 +169,11 @@ Vectorcall Support API This is a specialized function, intended to be put in the :c:member:`~PyTypeObject.tp_call` slot or be used in an implementation of ``tp_call``. - It does not check the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag + It does not check the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag and it does not fall back to ``tp_call``. + This function is not part of the `limited API `_. + .. versionadded:: 3.8 @@ -185,7 +198,7 @@ please see individual documentation for details. +------------------------------------------+------------------+--------------------+---------------+ | :c:func:`PyObject_CallNoArgs` | ``PyObject *`` | --- | --- | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_CallOneArg` | ``PyObject *`` | 1 object | --- | +| :c:func:`PyObject_CallOneArg` | ``PyObject *`` | 1 object | --- | +------------------------------------------+------------------+--------------------+---------------+ | :c:func:`PyObject_CallObject` | ``PyObject *`` | tuple/``NULL`` | --- | +------------------------------------------+------------------+--------------------+---------------+ @@ -197,15 +210,15 @@ please see individual documentation for details. +------------------------------------------+------------------+--------------------+---------------+ | :c:func:`PyObject_CallMethodObjArgs` | obj + name | variadic | --- | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_CallMethodNoArgs` | obj + name | --- | --- | +| :c:func:`PyObject_CallMethodNoArgs` | obj + name | --- | --- | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_CallMethodOneArg` | obj + name | 1 object | --- | +| :c:func:`PyObject_CallMethodOneArg` | obj + name | 1 object | --- | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_Vectorcall` | ``PyObject *`` | vectorcall | vectorcall | +| :c:func:`PyObject_Vectorcall` | ``PyObject *`` | vectorcall | vectorcall | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_FastCallDict` | ``PyObject *`` | vectorcall | dict/``NULL`` | +| :c:func:`PyObject_VectorcallDict` | ``PyObject *`` | vectorcall | dict/``NULL`` | +------------------------------------------+------------------+--------------------+---------------+ -| :c:func:`_PyObject_VectorcallMethod` | arg + name | vectorcall | vectorcall | +| :c:func:`PyObject_VectorcallMethod` | arg + name | vectorcall | vectorcall | +------------------------------------------+------------------+--------------------+---------------+ @@ -235,7 +248,7 @@ please see individual documentation for details. .. versionadded:: 3.9 -.. c:function:: PyObject* _PyObject_CallOneArg(PyObject *callable, PyObject *arg) +.. c:function:: PyObject* PyObject_CallOneArg(PyObject *callable, PyObject *arg) Call a callable Python object *callable* with exactly 1 positional argument *arg* and no keyword arguments. @@ -243,6 +256,8 @@ please see individual documentation for details. Return the result of the call on success, or raise an exception and return *NULL* on failure. + This function is not part of the `limited API `_. + .. versionadded:: 3.9 @@ -320,7 +335,7 @@ please see individual documentation for details. *NULL* on failure. -.. c:function:: PyObject* _PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) +.. c:function:: PyObject* PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) Call a method of the Python object *obj* without arguments, where the name of the method is given as a Python string object in *name*. @@ -328,10 +343,12 @@ please see individual documentation for details. Return the result of the call on success, or raise an exception and return *NULL* on failure. + This function is not part of the `limited API `_. + .. versionadded:: 3.9 -.. c:function:: PyObject* _PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) +.. c:function:: PyObject* PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) Call a method of the Python object *obj* with a single positional argument *arg*, where the name of the method is given as a Python string object in @@ -340,10 +357,12 @@ please see individual documentation for details. Return the result of the call on success, or raise an exception and return *NULL* on failure. + This function is not part of the `limited API `_. + .. versionadded:: 3.9 -.. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) +.. c:function:: PyObject* PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) Call a callable Python object *callable*. The arguments are the same as for :c:type:`vectorcallfunc`. @@ -353,15 +372,11 @@ please see individual documentation for details. Return the result of the call on success, or raise an exception and return *NULL* on failure. - .. note:: + This function is not part of the `limited API `_. - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. + .. versionadded:: 3.9 - .. versionadded:: 3.8 - -.. c:function:: PyObject* _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) +.. c:function:: PyObject* PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) Call *callable* with positional arguments passed exactly as in the vectorcall_ protocol, but with keyword arguments passed as a dictionary *kwdict*. @@ -373,15 +388,11 @@ please see individual documentation for details. already has a dictionary ready to use for the keyword arguments, but not a tuple for the positional arguments. - .. note:: + This function is not part of the `limited API `_. - This function is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use the function, plan for updating your code for Python 3.9. + .. versionadded:: 3.9 - .. versionadded:: 3.8 - -.. c:function:: PyObject* _PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) +.. c:function:: PyObject* PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) Call a method using the vectorcall calling convention. The name of the method is given as a Python string *name*. The object whose method is called is @@ -390,7 +401,7 @@ please see individual documentation for details. *nargsf* is the number of positional arguments including *args[0]*, plus :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` if the value of ``args[0]`` may temporarily be changed. Keyword arguments can be passed just like in - :c:func:`_PyObject_Vectorcall`. + :c:func:`PyObject_Vectorcall`. If the object has the :const:`Py_TPFLAGS_METHOD_DESCRIPTOR` feature, this will call the unbound method object with the full @@ -399,6 +410,8 @@ please see individual documentation for details. Return the result of the call on success, or raise an exception and return *NULL* on failure. + This function is not part of the `limited API `_. + .. versionadded:: 3.9 diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index a8a779ef616..ff0e70e6e52 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -684,15 +684,15 @@ and :c:type:`PyType_Type` effectively act as defaults.) a more efficient alternative of the simpler :c:member:`~PyTypeObject.tp_call`. - This field is only used if the flag :const:`_Py_TPFLAGS_HAVE_VECTORCALL` + This field is only used if the flag :const:`Py_TPFLAGS_HAVE_VECTORCALL` is set. If so, this must be a positive integer containing the offset in the instance of a :c:type:`vectorcallfunc` pointer. The *vectorcallfunc* pointer may be ``NULL``, in which case the instance behaves - as if :const:`_Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance + as if :const:`Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance falls back to :c:member:`~PyTypeObject.tp_call`. - Any class that sets ``_Py_TPFLAGS_HAVE_VECTORCALL`` must also set + Any class that sets ``Py_TPFLAGS_HAVE_VECTORCALL`` must also set :c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent with the *vectorcallfunc* function. This can be done by setting *tp_call* to :c:func:`PyVectorcall_Call`. @@ -719,7 +719,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) **Inheritance:** This field is always inherited. - However, the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag is not + However, the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag is not always inherited. If it's not, then the subclass won't use :ref:`vectorcall `, except when :c:func:`PyVectorcall_Call` is explicitly called. @@ -1153,7 +1153,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) type structure. - .. data:: _Py_TPFLAGS_HAVE_VECTORCALL + .. data:: Py_TPFLAGS_HAVE_VECTORCALL This bit is set when the class implements the :ref:`vectorcall protocol `. @@ -1163,15 +1163,9 @@ and :c:type:`PyType_Type` effectively act as defaults.) This bit is inherited for *static* subtypes if :c:member:`~PyTypeObject.tp_call` is also inherited. - `Heap types`_ do not inherit ``_Py_TPFLAGS_HAVE_VECTORCALL``. + `Heap types`_ do not inherit ``Py_TPFLAGS_HAVE_VECTORCALL``. - .. note:: - - This flag is provisional and expected to become public in Python 3.9, - with a different name and, possibly, changed semantics. - If you use vectorcall, plan for updating your code for Python 3.9. - - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. c:member:: const char* PyTypeObject.tp_doc diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 2c4eae70b96..4bd7b1a61a5 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -29,7 +29,7 @@ PyAPI_FUNC(PyObject *) _PyStack_AsDict( /* Suggested size (number of positional arguments) for arrays of PyObject* allocated on a C stack to avoid allocating memory on the heap memory. Such array is used to pass positional arguments to call functions of the - _PyObject_Vectorcall() family. + PyObject_Vectorcall() family. The size is chosen to not abuse the C stack and so limit the risk of stack overflow. The size is also chosen to allow using the small stack for most @@ -45,8 +45,8 @@ PyAPI_FUNC(PyObject *) _Py_CheckFunctionResult( /* === Vectorcall protocol (PEP 590) ============================= */ -/* Call callable using tp_call. Arguments are like _PyObject_Vectorcall() - or _PyObject_FastCallDict() (both forms are supported), +/* Call callable using tp_call. Arguments are like PyObject_Vectorcall() + or PyObject_FastCallDict() (both forms are supported), except that nargs is plainly the number of arguments without flags. */ PyAPI_FUNC(PyObject *) _PyObject_MakeTpCall( PyThreadState *tstate, @@ -63,7 +63,7 @@ PyVectorcall_NARGS(size_t n) } static inline vectorcallfunc -_PyVectorcall_Function(PyObject *callable) +PyVectorcall_Function(PyObject *callable) { assert(callable != NULL); PyTypeObject *tp = Py_TYPE(callable); @@ -103,7 +103,7 @@ _PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, assert(kwnames == NULL || PyTuple_Check(kwnames)); assert(args != NULL || PyVectorcall_NARGS(nargsf) == 0); - vectorcallfunc func = _PyVectorcall_Function(callable); + vectorcallfunc func = PyVectorcall_Function(callable); if (func == NULL) { Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwnames); @@ -113,7 +113,7 @@ _PyObject_VectorcallTstate(PyThreadState *tstate, PyObject *callable, } static inline PyObject * -_PyObject_Vectorcall(PyObject *callable, PyObject *const *args, +PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) { PyThreadState *tstate = PyThreadState_GET(); @@ -121,9 +121,18 @@ _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, args, nargsf, kwnames); } -/* Same as _PyObject_Vectorcall except that keyword arguments are passed as +// Backwards compatibility aliases for API that was provisional in Python 3.8 +#define _PyObject_Vectorcall PyObject_Vectorcall +#define _PyObject_VectorcallMethod PyObject_VectorcallMethod +#define _PyObject_FastCallDict PyObject_VectorcallDict +#define _PyVectorcall_Function PyVectorcall_Function +#define _PyObject_CallOneArg PyObject_CallOneArg +#define _PyObject_CallMethodNoArgs PyObject_CallMethodNoArgs +#define _PyObject_CallMethodOneArg PyObject_CallMethodOneArg + +/* Same as PyObject_Vectorcall except that keyword arguments are passed as dict, which may be NULL if there are no keyword arguments. */ -PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( +PyAPI_FUNC(PyObject *) PyObject_VectorcallDict( PyObject *callable, PyObject *const *args, size_t nargsf, @@ -133,7 +142,7 @@ PyAPI_FUNC(PyObject *) _PyObject_FastCallDict( "tuple" and keyword arguments "dict". "dict" may also be NULL */ PyAPI_FUNC(PyObject *) PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict); -/* Same as _PyObject_Vectorcall except without keyword arguments */ +/* Same as PyObject_Vectorcall except without keyword arguments */ static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { @@ -151,7 +160,7 @@ _PyObject_CallNoArg(PyObject *func) { } static inline PyObject * -_PyObject_CallOneArg(PyObject *func, PyObject *arg) +PyObject_CallOneArg(PyObject *func, PyObject *arg) { assert(arg != NULL); PyObject *_args[2]; @@ -162,19 +171,19 @@ _PyObject_CallOneArg(PyObject *func, PyObject *arg) return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } -PyAPI_FUNC(PyObject *) _PyObject_VectorcallMethod( +PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod( PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames); static inline PyObject * -_PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) +PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) { return _PyObject_VectorcallMethod(name, &self, 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); } static inline PyObject * -_PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) +PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) { assert(arg != NULL); PyObject *args[2] = {self, arg}; @@ -207,7 +216,7 @@ _PyObject_VectorcallMethodId( if (!oname) { return NULL; } - return _PyObject_VectorcallMethod(oname, args, nargsf, kwnames); + return PyObject_VectorcallMethod(oname, args, nargsf, kwnames); } static inline PyObject * diff --git a/Include/object.h b/Include/object.h index e7e9c1b8ed7..38794a0e98c 100644 --- a/Include/object.h +++ b/Include/object.h @@ -279,7 +279,9 @@ given type object has a specified feature. /* Set if the type implements the vectorcall protocol (PEP 590) */ #ifndef Py_LIMITED_API -#define _Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +#define Py_TPFLAGS_HAVE_VECTORCALL (1UL << 11) +// Backwards compatibility alias for API that was provisional in Python 3.8 +#define _Py_TPFLAGS_HAVE_VECTORCALL Py_TPFLAGS_HAVE_VECTORCALL #endif /* Set if the type is 'ready' -- fully initialized */ diff --git a/Misc/NEWS.d/next/C API/2020-01-07-13-46-40.bpo-39245.G7wog6.rst b/Misc/NEWS.d/next/C API/2020-01-07-13-46-40.bpo-39245.G7wog6.rst new file mode 100644 index 00000000000..e5836b5255d --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-01-07-13-46-40.bpo-39245.G7wog6.rst @@ -0,0 +1,5 @@ +The Vectorcall API (PEP 590) was made public, adding the functions +``PyObject_Vectorcall``, ``PyObject_VectorcallMethod``, +``PyVectorcall_Function``, ``PyObject_CallOneArg``, +``PyObject_CallMethodNoArgs``, ``PyObject_CallMethodOneArg``, +``PyObject_FastCallDict``, and the flag ``Py_TPFLAGS_HAVE_VECTORCALL``. From 427c84f13f7719e6014a21bd1b81efdc02a046fb Mon Sep 17 00:00:00 2001 From: Sebastian Berg Date: Thu, 6 Feb 2020 06:54:05 -0800 Subject: [PATCH 307/380] bpo-39274: Ensure Fraction.__bool__() returns a bool (GH-18017) Some numerator types used (specifically NumPy) decides to not return a Python boolean for the "a != b" operation. Using the equivalent call to bool() guarantees a bool return also for such types. --- Lib/fractions.py | 4 +- Lib/test/test_fractions.py | 37 +++++++++++++++++++ .../2020-01-15-23-13-03.bpo-39274.lpc0-n.rst | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-15-23-13-03.bpo-39274.lpc0-n.rst diff --git a/Lib/fractions.py b/Lib/fractions.py index 501f4b74a0b..f5a854414c1 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -625,7 +625,9 @@ class Fraction(numbers.Rational): def __bool__(a): """a != 0""" - return a._numerator != 0 + # bpo-39274: Use bool() because (a._numerator != 0) can return an + # object which is not a bool. + return bool(a._numerator) # support for pickling, copy, and deepcopy diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 7cf7899932b..4649a34bcc1 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -6,6 +6,7 @@ import math import numbers import operator import fractions +import functools import sys import unittest import warnings @@ -322,6 +323,42 @@ class FractionTest(unittest.TestCase): self.assertTypedEquals(0.1+0j, complex(F(1,10))) + def testBoolGuarateesBoolReturn(self): + # Ensure that __bool__ is used on numerator which guarantees a bool + # return. See also bpo-39274. + @functools.total_ordering + class CustomValue: + denominator = 1 + + def __init__(self, value): + self.value = value + + def __bool__(self): + return bool(self.value) + + @property + def numerator(self): + # required to preserve `self` during instantiation + return self + + def __eq__(self, other): + raise AssertionError("Avoid comparisons in Fraction.__bool__") + + __lt__ = __eq__ + + # We did not implement all abstract methods, so register: + numbers.Rational.register(CustomValue) + + numerator = CustomValue(1) + r = F(numerator) + # ensure the numerator was not lost during instantiation: + self.assertIs(r.numerator, numerator) + self.assertIs(bool(r), True) + + numerator = CustomValue(0) + r = F(numerator) + self.assertIs(bool(r), False) + def testRound(self): self.assertTypedEquals(F(-200), round(F(-150), -2)) self.assertTypedEquals(F(-200), round(F(-250), -2)) diff --git a/Misc/NEWS.d/next/Library/2020-01-15-23-13-03.bpo-39274.lpc0-n.rst b/Misc/NEWS.d/next/Library/2020-01-15-23-13-03.bpo-39274.lpc0-n.rst new file mode 100644 index 00000000000..4c398682b98 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-15-23-13-03.bpo-39274.lpc0-n.rst @@ -0,0 +1 @@ +``bool(fraction.Fraction)`` now returns a boolean even if (numerator != 0) does not return a boolean (ex: numpy number). From 2844336e6bb0dc932d710be5f4d8c126d0768d03 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 6 Feb 2020 22:41:34 +0100 Subject: [PATCH 308/380] bpo-39542: Document limited C API changes (GH-18378) --- Doc/whatsnew/3.9.rst | 49 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 66caf3f6f82..d127e0a4a94 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -319,13 +319,6 @@ Optimizations Build and C API Changes ======================= -* Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` - as regular functions for the limited API. Previously, there were defined as - macros, but these macros didn't work with the limited API which cannot access - ``PyThreadState.recursion_depth`` field. Remove ``_Py_CheckRecursionLimit`` - from the stable ABI. - (Contributed by Victor Stinner in :issue:`38644`.) - * Add 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. @@ -359,6 +352,48 @@ Build and C API Changes * The ``COUNT_ALLOCS`` special build macro has been removed. (Contributed by Victor Stinner in :issue:`39489`.) +* Changes in the limited C API (if ``Py_LIMITED_API`` macro is defined): + + * Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` + as regular functions for the limited API. Previously, there were defined as + macros, but these macros didn't work with the limited API which cannot + access ``PyThreadState.recursion_depth`` field. + + * Exclude the following functions from the limited C API: + + * ``_Py_CheckRecursionLimit`` + * ``_Py_NewReference()`` + * ``_Py_ForgetReference()`` + * ``_PyTraceMalloc_NewReference()`` + * ``_Py_GetRefTotal()`` + * The trashcan mechanism which never worked in the limited C API. + * ``PyTrash_UNWIND_LEVEL`` + * ``Py_TRASHCAN_BEGIN_CONDITION`` + * ``Py_TRASHCAN_BEGIN`` + * ``Py_TRASHCAN_END`` + * ``Py_TRASHCAN_SAFE_BEGIN`` + * ``Py_TRASHCAN_SAFE_END`` + + * The following static inline functions or macros become regular "opaque" + function to hide implementation details: + + * ``_Py_NewReference()`` + * ``PyObject_INIT()`` and ``PyObject_INIT_VAR()`` become aliases to + :c:func:`PyObject_Init` and :c:func:`PyObject_InitVar` in the limited C + API, but are overriden with static inline function otherwise. Thanks to + that, it was possible to exclude ``_Py_NewReference()`` from the limited + C API. + + * Move following functions and definitions to the internal C API: + + * ``_PyDebug_PrintTotalRefs()`` + * ``_Py_PrintReferences()`` + * ``_Py_PrintReferenceAddresses()`` + * ``_Py_tracemalloc_config`` + * ``_Py_AddToAllObjects()`` (specific to ``Py_TRACE_REFS`` build) + + (Contributed by Victor Stinner in :issue:`38644` and :issue:`39542`.) + Deprecated ========== From 227af8e21725958ad7d92a7910e70d678bb8a0a6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 6 Feb 2020 23:03:01 +0100 Subject: [PATCH 309/380] What's New in Python 3.9: sort improved modules (GH-18383) --- Doc/whatsnew/3.9.rst | 72 ++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index d127e0a4a94..4991e56759b 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -205,6 +205,14 @@ with this change. The overridden methods of :class:`~imaplib.IMAP4_SSL` and :class:`~imaplib.IMAP4_stream` were applied to this change. (Contributed by Dong-hee Na in :issue:`38615`.) +importlib +--------- + +To improve consistency with import statements, :func:`importlib.util.resolve_name` +now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative +import attempts. +(Contributed by Ngalim Siregar in :issue:`37444`.) + math ---- @@ -240,32 +248,6 @@ The :func:`os.putenv` and :func:`os.unsetenv` functions are now always available. (Contributed by Victor Stinner in :issue:`39395`.) -poplib ------- - -:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` -if the given timeout for their constructor is zero to prevent the creation of -a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) - -threading ---------- - -In a subinterpreter, spawning a daemon thread now raises a :exc:`RuntimeError`. Daemon -threads were never supported in subinterpreters. Previously, the subinterpreter -finalization crashed with a Python fatal error if a daemon thread was still -running. -(Contributed by Victor Stinner in :issue:`37266`.) - -venv ----- - -The activation scripts provided by :mod:`venv` now all specify their prompt -customization consistently by always using the value specified by -``__VENV_PROMPT__``. Previously some scripts unconditionally used -``__VENV_PROMPT__``, others only if it happened to be set (which was the default -case), and one used ``__VENV_NAME__`` instead. -(Contributed by Brett Cannon in :issue:`37663`.) - pathlib ------- @@ -273,19 +255,24 @@ Added :meth:`pathlib.Path.readlink()` which acts similarly to :func:`os.readlink`. (Contributed by Girts Folkmanis in :issue:`30618`) +poplib +------ + +:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError` +if the given timeout for their constructor is zero to prevent the creation of +a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) + pprint ------ :mod:`pprint` can now pretty-print :class:`types.SimpleNamespace`. (Contributed by Carl Bordum Hansen in :issue:`37376`.) -importlib ---------- +signal +------ -To improve consistency with import statements, :func:`importlib.util.resolve_name` -now raises :exc:`ImportError` instead of :exc:`ValueError` for invalid relative -import attempts. -(Contributed by Ngalim Siregar in :issue:`37444`.) +Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to +signals to a process using a file descriptor instead of a pid. (:issue:`38712`) smtplib ------- @@ -297,11 +284,14 @@ a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.) :class:`~smtplib.LMTP` constructor now has an optional *timeout* parameter. (Contributed by Dong-hee Na in :issue:`39329`.) -signal ------- +threading +--------- -Exposed the Linux-specific :func:`signal.pidfd_send_signal` for sending to -signals to a process using a file descriptor instead of a pid. (:issue:`38712`) +In a subinterpreter, spawning a daemon thread now raises a :exc:`RuntimeError`. Daemon +threads were never supported in subinterpreters. Previously, the subinterpreter +finalization crashed with a Python fatal error if a daemon thread was still +running. +(Contributed by Victor Stinner in :issue:`37266`.) typing ------ @@ -311,6 +301,16 @@ types with context-specific metadata and new ``include_extras`` parameter to :func:`typing.get_type_hints` to access the metadata at runtime. (Contributed by Till Varoquaux and Konstantin Kashin.) +venv +---- + +The activation scripts provided by :mod:`venv` now all specify their prompt +customization consistently by always using the value specified by +``__VENV_PROMPT__``. Previously some scripts unconditionally used +``__VENV_PROMPT__``, others only if it happened to be set (which was the default +case), and one used ``__VENV_NAME__`` instead. +(Contributed by Brett Cannon in :issue:`37663`.) + Optimizations ============= From 446463f8dbce0556be8020914f37089b63bb8ab6 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Thu, 6 Feb 2020 23:16:48 +0100 Subject: [PATCH 310/380] bpo-39534: Doc: Clarify return in finally (GH-18324) --- Doc/tutorial/errors.rst | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 8f86eca0248..ab23df9f3ff 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -388,15 +388,33 @@ example:: File "", line 2, in KeyboardInterrupt -If a :keyword:`finally` clause is present, the :keyword:`finally` clause will execute as the last task before the :keyword:`try` statement completes. The :keyword:`finally` clause runs whether or not the :keyword:`try` statement produces an exception. The following points discuss more complex cases when an exception occurs: +If a :keyword:`finally` clause is present, the :keyword:`!finally` +clause will execute as the last task before the :keyword:`try` +statement completes. The :keyword:`!finally` clause runs whether or +not the :keyword:`!try` statement produces an exception. The following +points discuss more complex cases when an exception occurs: -* If an exception occurs during execution of the :keyword:`!try` clause, the exception may be handled by an :keyword:`except` clause. If the exception is not handled by an :keyword:`except` clause, the exception is re-raised after the :keyword:`!finally` clause has been executed. +* If an exception occurs during execution of the :keyword:`!try` + clause, the exception may be handled by an :keyword:`except` + clause. If the exception is not handled by an :keyword:`!except` + clause, the exception is re-raised after the :keyword:`!finally` + clause has been executed. -* An exception could occur during execution of an :keyword:`!except` or :keyword:`!else` clause. Again, the exception is re-raised after the :keyword:`!finally` clause has been executed. +* An exception could occur during execution of an :keyword:`!except` + or :keyword:`!else` clause. Again, the exception is re-raised after + the :keyword:`!finally` clause has been executed. -* If the :keyword:`!try` statement reaches a :keyword:`break`, :keyword:`continue` or :keyword:`return` statement, the :keyword:`finally` clause will execute just prior to the :keyword:`break`, :keyword:`continue` or :keyword:`return` statement's execution. +* If the :keyword:`!try` statement reaches a :keyword:`break`, + :keyword:`continue` or :keyword:`return` statement, the + :keyword:`!finally` clause will execute just prior to the + :keyword:`!break`, :keyword:`!continue` or :keyword:`!return` + statement's execution. -* If a :keyword:`finally` clause includes a :keyword:`return` statement, the :keyword:`finally` clause's :keyword:`return` statement will execute before, and instead of, the :keyword:`return` statement in a :keyword:`try` clause. +* If a :keyword:`!finally` clause includes a :keyword:`!return` + statement, the returned value will be the one from the + :keyword:`!finally` clause's :keyword:`!return` statement, not the + value from the :keyword:`!try` clause's :keyword:`!return` + statement. For example:: From a93c51e3a8e15f1a486d11d5b55a64f3381babe0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 00:38:59 +0100 Subject: [PATCH 311/380] bpo-39573: Use Py_REFCNT() macro (GH-18388) Replace direct acccess to PyObject.ob_refcnt with usage of the Py_REFCNT() macro. --- Modules/_functoolsmodule.c | 4 ++-- Modules/_testcapimodule.c | 16 +++++++++------- Objects/enumobject.c | 4 ++-- Objects/fileobject.c | 2 +- Objects/object.c | 36 ++++++++++++++++++------------------ Objects/tupleobject.c | 2 +- Objects/typeobject.c | 5 +++-- Objects/weakrefobject.c | 9 +++++---- Python/sysmodule.c | 2 +- 9 files changed, 42 insertions(+), 38 deletions(-) diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 987087b1ac9..50d8c58e954 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -649,7 +649,7 @@ functools_reduce(PyObject *self, PyObject *args) for (;;) { PyObject *op2; - if (args->ob_refcnt > 1) { + if (Py_REFCNT(args) > 1) { Py_DECREF(args); if ((args = PyTuple_New(2)) == NULL) goto Fail; @@ -666,7 +666,7 @@ functools_reduce(PyObject *self, PyObject *args) result = op2; else { /* Update the args tuple in-place */ - assert(args->ob_refcnt == 1); + assert(Py_REFCNT(args) == 1); Py_XSETREF(_PyTuple_ITEMS(args)[0], result); Py_XSETREF(_PyTuple_ITEMS(args)[1], op2); if ((result = PyObject_Call(func, args, NULL)) == NULL) { diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index c5812f827df..27db86a70b9 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3550,8 +3550,8 @@ slot_tp_del(PyObject *self) PyObject *error_type, *error_value, *error_traceback; /* Temporarily resurrect the object. */ - assert(self->ob_refcnt == 0); - self->ob_refcnt = 1; + assert(Py_REFCNT(self) == 0); + Py_REFCNT(self) = 1; /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); @@ -3573,17 +3573,19 @@ slot_tp_del(PyObject *self) /* Undo the temporary resurrection; can't use DECREF here, it would * cause a recursive call. */ - assert(self->ob_refcnt > 0); - if (--self->ob_refcnt == 0) - return; /* this is the normal path out */ + assert(Py_REFCNT(self) > 0); + if (--Py_REFCNT(self) == 0) { + /* this is the normal path out */ + return; + } /* __del__ resurrected it! Make it look like the original Py_DECREF * never happened. */ { - Py_ssize_t refcnt = self->ob_refcnt; + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; + Py_REFCNT(self) = refcnt; } assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)); /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 4786297c41a..75703be5fcf 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -122,7 +122,7 @@ enum_next_long(enumobject *en, PyObject* next_item) } en->en_longindex = stepped_up; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); @@ -167,7 +167,7 @@ enum_next(enumobject *en) } en->en_index++; - if (result->ob_refcnt == 1) { + if (Py_REFCNT(result) == 1) { Py_INCREF(result); old_index = PyTuple_GET_ITEM(result, 0); old_item = PyTuple_GET_ITEM(result, 1); diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 527693c8099..c0eff8bed51 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -85,7 +85,7 @@ PyFile_GetLine(PyObject *f, int n) "EOF when reading a line"); } else if (s[len-1] == '\n') { - if (result->ob_refcnt == 1) + if (Py_REFCNT(result) == 1) _PyBytes_Resize(&result, len-1); else { PyObject *v; diff --git a/Objects/object.c b/Objects/object.c index 9eaa163bdfd..f9682fe5b1f 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -58,7 +58,7 @@ _Py_GetRefTotal(void) Py_ssize_t total = _Py_RefTotal; o = _PySet_Dummy; if (o != NULL) - total -= o->ob_refcnt; + total -= Py_REFCNT(o); return total; } @@ -206,32 +206,32 @@ PyObject_CallFinalizer(PyObject *self) int PyObject_CallFinalizerFromDealloc(PyObject *self) { - if (self->ob_refcnt != 0) { + if (Py_REFCNT(self) != 0) { _PyObject_ASSERT_FAILED_MSG(self, "PyObject_CallFinalizerFromDealloc called " "on object with a non-zero refcount"); } /* Temporarily resurrect the object. */ - self->ob_refcnt = 1; + Py_REFCNT(self) = 1; PyObject_CallFinalizer(self); _PyObject_ASSERT_WITH_MSG(self, - self->ob_refcnt > 0, + Py_REFCNT(self) > 0, "refcount is too small"); /* Undo the temporary resurrection; can't use DECREF here, it would * cause a recursive call. */ - if (--self->ob_refcnt == 0) { + if (--Py_REFCNT(self) == 0) { return 0; /* this is the normal path out */ } /* tp_finalize resurrected it! Make it look like the original Py_DECREF * never happened. */ - Py_ssize_t refcnt = self->ob_refcnt; + Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - self->ob_refcnt = refcnt; + Py_REFCNT(self) = refcnt; _PyObject_ASSERT(self, (!PyType_IS_GC(Py_TYPE(self)) @@ -263,12 +263,12 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) Py_END_ALLOW_THREADS } else { - if (op->ob_refcnt <= 0) { + if (Py_REFCNT(op) <= 0) { /* XXX(twouters) cast refcount to long until %zd is universally available */ Py_BEGIN_ALLOW_THREADS fprintf(fp, "", - (long)op->ob_refcnt, (void *)op); + (long)Py_REFCNT(op), (void *)op); Py_END_ALLOW_THREADS } else { @@ -363,7 +363,7 @@ _PyObject_Dump(PyObject* op) fprintf(stderr, "object address : %p\n", (void *)op); /* XXX(twouters) cast refcount to long until %zd is universally available */ - fprintf(stderr, "object refcount : %ld\n", (long)op->ob_refcnt); + fprintf(stderr, "object refcount : %ld\n", (long)Py_REFCNT(op)); fflush(stderr); PyTypeObject *type = Py_TYPE(op); @@ -1010,7 +1010,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) return err; } Py_DECREF(name); - _PyObject_ASSERT(name, name->ob_refcnt >= 1); + _PyObject_ASSERT(name, Py_REFCNT(name) >= 1); if (tp->tp_getattr == NULL && tp->tp_getattro == NULL) PyErr_Format(PyExc_TypeError, "'%.100s' object has no attributes " @@ -1829,7 +1829,7 @@ _Py_NewReference(PyObject *op) void _Py_ForgetReference(PyObject *op) { - if (op->ob_refcnt < 0) { + if (Py_REFCNT(op) < 0) { _PyObject_ASSERT_FAILED_MSG(op, "negative refcnt"); } @@ -1867,7 +1867,7 @@ _Py_PrintReferences(FILE *fp) PyObject *op; fprintf(fp, "Remaining objects:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) { - fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, op->ob_refcnt); + fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] ", (void *)op, Py_REFCNT(op)); if (PyObject_Print(op, fp, 0) != 0) PyErr_Clear(); putc('\n', fp); @@ -1884,7 +1884,7 @@ _Py_PrintReferenceAddresses(FILE *fp) fprintf(fp, "Remaining object addresses:\n"); for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) fprintf(fp, "%p [%" PY_FORMAT_SIZE_T "d] %s\n", (void *)op, - op->ob_refcnt, Py_TYPE(op)->tp_name); + Py_REFCNT(op), Py_TYPE(op)->tp_name); } PyObject * @@ -2025,7 +2025,7 @@ _PyTrash_deposit_object(PyObject *op) _PyObject_ASSERT(op, PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); _PyGCHead_SET_PREV(_Py_AS_GC(op), gcstate->trash_delete_later); gcstate->trash_delete_later = op; } @@ -2037,7 +2037,7 @@ _PyTrash_thread_deposit_object(PyObject *op) PyThreadState *tstate = _PyThreadState_GET(); _PyObject_ASSERT(op, PyObject_IS_GC(op)); _PyObject_ASSERT(op, !_PyObject_GC_IS_TRACKED(op)); - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); _PyGCHead_SET_PREV(_Py_AS_GC(op), tstate->trash_delete_later); tstate->trash_delete_later = op; } @@ -2064,7 +2064,7 @@ _PyTrash_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); ++gcstate->trash_delete_nesting; (*dealloc)(op); --gcstate->trash_delete_nesting; @@ -2102,7 +2102,7 @@ _PyTrash_thread_destroy_chain(void) * assorted non-release builds calling Py_DECREF again ends * up distorting allocation statistics. */ - _PyObject_ASSERT(op, op->ob_refcnt == 0); + _PyObject_ASSERT(op, Py_REFCNT(op) == 0); (*dealloc)(op); assert(tstate->trash_delete_nesting == 1); } diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 8c8c66f266f..d114bd64096 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -153,7 +153,7 @@ int PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) { PyObject **p; - if (!PyTuple_Check(op) || op->ob_refcnt != 1) { + if (!PyTuple_Check(op) || Py_REFCNT(op) != 1) { Py_XDECREF(newitem); PyErr_BadInternalCall(); return -1; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 01def837803..d85ff3ce569 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1173,8 +1173,9 @@ subtype_dealloc(PyObject *self) } if (type->tp_del) { type->tp_del(self); - if (self->ob_refcnt > 0) + if (Py_REFCNT(self) > 0) { return; + } } /* Find the nearest base with a different tp_dealloc */ @@ -1239,7 +1240,7 @@ subtype_dealloc(PyObject *self) if (type->tp_del) { _PyObject_GC_TRACK(self); type->tp_del(self); - if (self->ob_refcnt > 0) { + if (Py_REFCNT(self) > 0) { /* Resurrected */ goto endlabel; } diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index bf79e0c7ecb..d104b646f01 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -952,7 +952,8 @@ PyObject_ClearWeakRefs(PyObject *object) if (object == NULL || !PyType_SUPPORTS_WEAKREFS(Py_TYPE(object)) - || object->ob_refcnt != 0) { + || Py_REFCNT(object) != 0) + { PyErr_BadInternalCall(); return; } @@ -975,8 +976,9 @@ PyObject_ClearWeakRefs(PyObject *object) current->wr_callback = NULL; clear_weakref(current); if (callback != NULL) { - if (((PyObject *)current)->ob_refcnt > 0) + if (Py_REFCNT((PyObject *)current) > 0) { handle_callback(current, callback); + } Py_DECREF(callback); } } @@ -993,8 +995,7 @@ PyObject_ClearWeakRefs(PyObject *object) for (i = 0; i < count; ++i) { PyWeakReference *next = current->wr_next; - if (((PyObject *)current)->ob_refcnt > 0) - { + if (Py_REFCNT((PyObject *)current) > 0) { Py_INCREF(current); PyTuple_SET_ITEM(tuple, i * 2, (PyObject *) current); PyTuple_SET_ITEM(tuple, i * 2 + 1, current->wr_callback); diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1cb10300d77..d8d18747454 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1656,7 +1656,7 @@ static Py_ssize_t sys_getrefcount_impl(PyObject *module, PyObject *object) /*[clinic end generated code: output=5fd477f2264b85b2 input=bf474efd50a21535]*/ { - return object->ob_refcnt; + return Py_REFCNT(object); } #ifdef Py_REF_DEBUG From c86a11221df7e37da389f9c6ce6e47ea22dc44ff Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 01:24:29 +0100 Subject: [PATCH 312/380] bpo-39573: Add Py_SET_REFCNT() function (GH-18389) Add a Py_SET_REFCNT() function to set the reference counter of an object. --- Doc/c-api/structures.rst | 7 +++++++ Include/object.h | 5 +++++ .../2020-02-07-00-23-44.bpo-39573.nRD1q7.rst | 2 ++ Modules/_testcapimodule.c | 15 ++++++++------- Objects/moduleobject.c | 2 +- Objects/object.c | 9 +++++---- Objects/unicodeobject.c | 4 ++-- 7 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-07-00-23-44.bpo-39573.nRD1q7.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 0c661389021..100573c5693 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -79,6 +79,13 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_refcnt) +.. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) + + Set the object *o* reference counter to *refcnt*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_SIZE(o) This macro is used to access the :attr:`ob_size` member of a Python object. diff --git a/Include/object.h b/Include/object.h index 38794a0e98c..0b630513375 100644 --- a/Include/object.h +++ b/Include/object.h @@ -123,6 +123,11 @@ typedef struct { #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) +static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { + ob->ob_refcnt = refcnt; +} +#define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) + /* Type objects contain a string containing the type name (to help somewhat in debugging), the allocation parameters (see PyObject_New() and diff --git a/Misc/NEWS.d/next/C API/2020-02-07-00-23-44.bpo-39573.nRD1q7.rst b/Misc/NEWS.d/next/C API/2020-02-07-00-23-44.bpo-39573.nRD1q7.rst new file mode 100644 index 00000000000..310933a6d40 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-07-00-23-44.bpo-39573.nRD1q7.rst @@ -0,0 +1,2 @@ +Add a :c:func:`Py_SET_REFCNT` function to set the reference counter of an +object. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 27db86a70b9..d8bf3735046 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3551,7 +3551,7 @@ slot_tp_del(PyObject *self) /* Temporarily resurrect the object. */ assert(Py_REFCNT(self) == 0); - Py_REFCNT(self) = 1; + Py_SET_REFCNT(self, 1); /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); @@ -3574,7 +3574,8 @@ slot_tp_del(PyObject *self) * cause a recursive call. */ assert(Py_REFCNT(self) > 0); - if (--Py_REFCNT(self) == 0) { + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { /* this is the normal path out */ return; } @@ -3585,7 +3586,7 @@ slot_tp_del(PyObject *self) { Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - Py_REFCNT(self) = refcnt; + Py_SET_REFCNT(self, refcnt); } assert(!PyType_IS_GC(Py_TYPE(self)) || _PyObject_GC_IS_TRACKED(self)); /* If Py_REF_DEBUG macro is defined, _Py_NewReference() increased @@ -4621,7 +4622,7 @@ check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object fields like ob_type are uninitialized! */ return test_pyobject_is_freed("check_pyobject_uninitialized_is_freed", op); } @@ -4636,7 +4637,7 @@ check_pyobject_forbidden_bytes_is_freed(PyObject *self, PyObject *Py_UNUSED(args return NULL; } /* Initialize reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* ob_type field is after the memory block: part of "forbidden bytes" when using debug hooks on memory allocators! */ return test_pyobject_is_freed("check_pyobject_forbidden_bytes_is_freed", op); @@ -4652,7 +4653,7 @@ check_pyobject_freed_is_freed(PyObject *self, PyObject *Py_UNUSED(args)) } Py_TYPE(op)->tp_dealloc(op); /* Reset reference count to avoid early crash in ceval or GC */ - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); /* object memory is freed! */ return test_pyobject_is_freed("check_pyobject_freed_is_freed", op); } @@ -5134,7 +5135,7 @@ negative_refcount(PyObject *self, PyObject *Py_UNUSED(args)) } assert(Py_REFCNT(obj) == 1); - Py_REFCNT(obj) = 0; + Py_SET_REFCNT(obj, 0); /* Py_DECREF() must call _Py_NegativeRefcount() and abort Python */ Py_DECREF(obj); diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 49cfd574d56..da329b4fbac 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -51,7 +51,7 @@ PyModuleDef_Init(struct PyModuleDef* def) return NULL; if (def->m_base.m_index == 0) { max_module_number++; - Py_REFCNT(def) = 1; + Py_SET_REFCNT(def, 1); Py_TYPE(def) = &PyModuleDef_Type; def->m_base.m_index = max_module_number; } diff --git a/Objects/object.c b/Objects/object.c index f9682fe5b1f..aca20e8d096 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -213,7 +213,7 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) } /* Temporarily resurrect the object. */ - Py_REFCNT(self) = 1; + Py_SET_REFCNT(self, 1); PyObject_CallFinalizer(self); @@ -223,7 +223,8 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) /* Undo the temporary resurrection; can't use DECREF here, it would * cause a recursive call. */ - if (--Py_REFCNT(self) == 0) { + Py_SET_REFCNT(self, Py_REFCNT(self) - 1); + if (Py_REFCNT(self) == 0) { return 0; /* this is the normal path out */ } @@ -231,7 +232,7 @@ PyObject_CallFinalizerFromDealloc(PyObject *self) * never happened. */ Py_ssize_t refcnt = Py_REFCNT(self); _Py_NewReference(self); - Py_REFCNT(self) = refcnt; + Py_SET_REFCNT(self, refcnt); _PyObject_ASSERT(self, (!PyType_IS_GC(Py_TYPE(self)) @@ -1818,7 +1819,7 @@ _Py_NewReference(PyObject *op) #ifdef Py_REF_DEBUG _Py_RefTotal++; #endif - Py_REFCNT(op) = 1; + Py_SET_REFCNT(op, 1); #ifdef Py_TRACE_REFS _Py_AddToAllObjects(op, 1); #endif diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 7c8bc06252a..fa48ee1ac78 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1903,7 +1903,7 @@ unicode_dealloc(PyObject *unicode) case SSTATE_INTERNED_MORTAL: /* revive dead object temporarily for DelItem */ - Py_REFCNT(unicode) = 3; + Py_SET_REFCNT(unicode, 3); if (PyDict_DelItem(interned, unicode) != 0) { _PyErr_WriteUnraisableMsg("deletion of interned string failed", NULL); @@ -15367,7 +15367,7 @@ PyUnicode_InternInPlace(PyObject **p) } /* The two references in interned are not counted by refcnt. The deallocator will take care of this */ - Py_REFCNT(s) -= 2; + Py_SET_REFCNT(s, Py_REFCNT(s) - 2); _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL; } From f95cd199b4bc16775c8c48641bd85416b17742e7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 01:43:25 +0100 Subject: [PATCH 313/380] bpo-39571: Fix clang warning on PyTypeObject typedef (GH-18385) Only define PyTypeObject type once. --- Include/cpython/object.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 0b5260eda7d..4600f942ee7 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -190,7 +190,7 @@ typedef struct { * backwards-compatibility */ typedef Py_ssize_t printfunc; -typedef struct _typeobject { +struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ @@ -271,7 +271,7 @@ typedef struct _typeobject { destructor tp_finalize; vectorcallfunc tp_vectorcall; -} PyTypeObject; +}; /* The *real* layout of a type object when allocated on the heap */ typedef struct _heaptypeobject { From 0d76d2bd28ac815dabae8b07240ed002ac8fce2d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 01:53:23 +0100 Subject: [PATCH 314/380] bpo-39573: Use Py_TYPE() in abstract.c (GH-18390) Replace direct access to PyObject.ob_type with Py_TYPE(). --- Objects/abstract.c | 188 ++++++++++++++++++++++----------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/Objects/abstract.c b/Objects/abstract.c index aca1a4e5189..7ab58a8bd52 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -14,7 +14,7 @@ static PyObject * type_error(const char *msg, PyObject *obj) { - PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name); + PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name); return NULL; } @@ -38,7 +38,7 @@ PyObject_Type(PyObject *o) return null_error(); } - v = (PyObject *)o->ob_type; + v = (PyObject *)Py_TYPE(o); Py_INCREF(v); return v; } @@ -53,7 +53,7 @@ PyObject_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(o); assert(len >= 0 || PyErr_Occurred()); @@ -150,14 +150,14 @@ PyObject_GetItem(PyObject *o, PyObject *key) return null_error(); } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_subscript) { PyObject *item = m->mp_subscript(o, key); assert((item != NULL) ^ (PyErr_Occurred() != NULL)); return item; } - ms = o->ob_type->tp_as_sequence; + ms = Py_TYPE(o)->tp_as_sequence; if (ms && ms->sq_item) { if (PyIndex_Check(key)) { Py_ssize_t key_value; @@ -197,11 +197,11 @@ PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, value); - if (o->ob_type->tp_as_sequence) { + if (Py_TYPE(o)->tp_as_sequence) { if (PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -209,7 +209,7 @@ PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value) return -1; return PySequence_SetItem(o, key_value, value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -229,11 +229,11 @@ PyObject_DelItem(PyObject *o, PyObject *key) null_error(); return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_ass_subscript) return m->mp_ass_subscript(o, key, (PyObject*)NULL); - if (o->ob_type->tp_as_sequence) { + if (Py_TYPE(o)->tp_as_sequence) { if (PyIndex_Check(key)) { Py_ssize_t key_value; key_value = PyNumber_AsSsize_t(key, PyExc_IndexError); @@ -241,7 +241,7 @@ PyObject_DelItem(PyObject *o, PyObject *key) return -1; return PySequence_DelItem(o, key_value); } - else if (o->ob_type->tp_as_sequence->sq_ass_item) { + else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) { type_error("sequence index must be " "integer, not '%.200s'", key); return -1; @@ -276,7 +276,7 @@ PyObject_DelItemString(PyObject *o, const char *key) int PyObject_CheckReadBuffer(PyObject *obj) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; Py_buffer view; if (pb == NULL || @@ -334,7 +334,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, null_error(); return -1; } - pb = obj->ob_type->tp_as_buffer; + pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL || ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { @@ -354,7 +354,7 @@ int PyObject_AsWriteBuffer(PyObject *obj, int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { - PyBufferProcs *pb = obj->ob_type->tp_as_buffer; + PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, @@ -801,10 +801,10 @@ done: int PyNumber_Check(PyObject *o) { - return o && o->ob_type->tp_as_number && - (o->ob_type->tp_as_number->nb_index || - o->ob_type->tp_as_number->nb_int || - o->ob_type->tp_as_number->nb_float); + 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); } /* Binary operators */ @@ -821,8 +821,8 @@ PyNumber_Check(PyObject *o) Order operations are tried until either a valid result or error: w.op(v,w)[*], v.op(v,w), w.op(v,w) - [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of - v->ob_type + [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of + Py_TYPE(v) */ static PyObject * @@ -832,16 +832,16 @@ binary_op1(PyObject *v, PyObject *w, const int op_slot) binaryfunc slotv = NULL; binaryfunc slotw = NULL; - if (v->ob_type->tp_as_number != NULL) - slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot); - if (w->ob_type != v->ob_type && - w->ob_type->tp_as_number != NULL) { - slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot); + if (Py_TYPE(v)->tp_as_number != NULL) + slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot); + if (Py_TYPE(w) != Py_TYPE(v) && + Py_TYPE(w)->tp_as_number != NULL) { + slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w); if (x != Py_NotImplemented) return x; @@ -869,8 +869,8 @@ binop_type_error(PyObject *v, PyObject *w, const char *op_name) "unsupported operand type(s) for %.100s: " "'%.100s' and '%.100s'", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -890,8 +890,8 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) "'%.100s' and '%.100s'. Did you mean \"print(, " "file=)\"?", op_name, - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } @@ -921,18 +921,18 @@ ternary_op(PyObject *v, ternaryfunc slotw = NULL; ternaryfunc slotz = NULL; - mv = v->ob_type->tp_as_number; - mw = w->ob_type->tp_as_number; + mv = Py_TYPE(v)->tp_as_number; + mw = Py_TYPE(w)->tp_as_number; if (mv != NULL) slotv = NB_TERNOP(mv, op_slot); - if (w->ob_type != v->ob_type && + if (Py_TYPE(w) != Py_TYPE(v) && mw != NULL) { slotw = NB_TERNOP(mw, op_slot); if (slotw == slotv) slotw = NULL; } if (slotv) { - if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) { + if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) { x = slotw(v, w, z); if (x != Py_NotImplemented) return x; @@ -950,7 +950,7 @@ ternary_op(PyObject *v, return x; Py_DECREF(x); /* can't do it */ } - mz = z->ob_type->tp_as_number; + mz = Py_TYPE(z)->tp_as_number; if (mz != NULL) { slotz = NB_TERNOP(mz, op_slot); if (slotz == slotv || slotz == slotw) @@ -968,16 +968,16 @@ ternary_op(PyObject *v, PyExc_TypeError, "unsupported operand type(s) for ** or pow(): " "'%.100s' and '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); else PyErr_Format( PyExc_TypeError, "unsupported operand type(s) for pow(): " "'%.100s', '%.100s', '%.100s'", - v->ob_type->tp_name, - w->ob_type->tp_name, - z->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name, + Py_TYPE(z)->tp_name); return NULL; } @@ -1000,7 +1000,7 @@ PyNumber_Add(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m && m->sq_concat) { return (*m->sq_concat)(v, w); @@ -1031,8 +1031,8 @@ PyNumber_Multiply(PyObject *v, PyObject *w) { PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv && mv->sq_repeat) { return sequence_repeat(mv->sq_repeat, v, w); @@ -1094,7 +1094,7 @@ PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) static PyObject * binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot) { - PyNumberMethods *mv = v->ob_type->tp_as_number; + PyNumberMethods *mv = Py_TYPE(v)->tp_as_number; if (mv != NULL) { binaryfunc slot = NB_BINOP(mv, iop_slot); if (slot) { @@ -1154,7 +1154,7 @@ PyNumber_InPlaceAdd(PyObject *v, PyObject *w) PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add), NB_SLOT(nb_add)); if (result == Py_NotImplemented) { - PySequenceMethods *m = v->ob_type->tp_as_sequence; + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; Py_DECREF(result); if (m != NULL) { binaryfunc f = NULL; @@ -1176,8 +1176,8 @@ PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) NB_SLOT(nb_multiply)); if (result == Py_NotImplemented) { ssizeargfunc f = NULL; - PySequenceMethods *mv = v->ob_type->tp_as_sequence; - PySequenceMethods *mw = w->ob_type->tp_as_sequence; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; Py_DECREF(result); if (mv != NULL) { f = mv->sq_inplace_repeat; @@ -1215,8 +1215,8 @@ PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) PyObject * PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) { - if (v->ob_type->tp_as_number && - v->ob_type->tp_as_number->nb_inplace_power != NULL) { + if (Py_TYPE(v)->tp_as_number && + Py_TYPE(v)->tp_as_number->nb_inplace_power != NULL) { return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**="); } else { @@ -1236,7 +1236,7 @@ PyNumber_Negative(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_negative) return (*m->nb_negative)(o); @@ -1252,7 +1252,7 @@ PyNumber_Positive(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_positive) return (*m->nb_positive)(o); @@ -1268,7 +1268,7 @@ PyNumber_Invert(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_invert) return (*m->nb_invert)(o); @@ -1284,7 +1284,7 @@ PyNumber_Absolute(PyObject *o) return null_error(); } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_absolute) return m->nb_absolute(o); @@ -1296,8 +1296,8 @@ PyNumber_Absolute(PyObject *o) int PyIndex_Check(PyObject *obj) { - return obj->ob_type->tp_as_number != NULL && - obj->ob_type->tp_as_number->nb_index != NULL; + return Py_TYPE(obj)->tp_as_number != NULL && + Py_TYPE(obj)->tp_as_number->nb_index != NULL; } /* Return a Python int from the object item. @@ -1319,16 +1319,16 @@ PyNumber_Index(PyObject *item) if (!PyIndex_Check(item)) { PyErr_Format(PyExc_TypeError, "'%.200s' object cannot be interpreted " - "as an integer", item->ob_type->tp_name); + "as an integer", Py_TYPE(item)->tp_name); return NULL; } - result = item->ob_type->tp_as_number->nb_index(item); + result = Py_TYPE(item)->tp_as_number->nb_index(item); if (!result || PyLong_CheckExact(result)) return result; if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1337,7 +1337,7 @@ PyNumber_Index(PyObject *item) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -1382,7 +1382,7 @@ PyNumber_AsSsize_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an index-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: @@ -1408,7 +1408,7 @@ PyNumber_Long(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_int) { /* This should include subclasses of int */ result = _PyLong_FromNbInt(o); if (result != NULL && !PyLong_CheckExact(result)) { @@ -1436,12 +1436,12 @@ PyNumber_Long(PyObject *o) } /* __trunc__ is specified to return an Integral type, but int() needs to return an int. */ - m = result->ob_type->tp_as_number; + m = Py_TYPE(result)->tp_as_number; if (m == NULL || (m->nb_index == NULL && m->nb_int == NULL)) { PyErr_Format( PyExc_TypeError, "__trunc__ returned non-Integral (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -1503,7 +1503,7 @@ PyNumber_Float(PyObject *o) Py_INCREF(o); return o; } - m = o->ob_type->tp_as_number; + m = Py_TYPE(o)->tp_as_number; if (m && m->nb_float) { /* This should include subclasses of float */ PyObject *res = m->nb_float(o); double val; @@ -1513,7 +1513,7 @@ PyNumber_Float(PyObject *o) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - o->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -1522,7 +1522,7 @@ PyNumber_Float(PyObject *o) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - o->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -1576,8 +1576,8 @@ PySequence_Check(PyObject *s) { if (PyDict_Check(s)) return 0; - return s->ob_type->tp_as_sequence && - s->ob_type->tp_as_sequence->sq_item != NULL; + return Py_TYPE(s)->tp_as_sequence && + Py_TYPE(s)->tp_as_sequence->sq_item != NULL; } Py_ssize_t @@ -1590,14 +1590,14 @@ PySequence_Size(PyObject *s) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_length) { Py_ssize_t len = m->sq_length(s); assert(len >= 0 || PyErr_Occurred()); return len; } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_length) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) { type_error("%.200s is not a sequence", s); return -1; } @@ -1622,7 +1622,7 @@ PySequence_Concat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_concat) return m->sq_concat(s, o); @@ -1647,7 +1647,7 @@ PySequence_Repeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_repeat) return m->sq_repeat(o, count); @@ -1677,7 +1677,7 @@ PySequence_InPlaceConcat(PyObject *s, PyObject *o) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_inplace_concat) return m->sq_inplace_concat(s, o); if (m && m->sq_concat) @@ -1702,7 +1702,7 @@ PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count) return null_error(); } - m = o->ob_type->tp_as_sequence; + m = Py_TYPE(o)->tp_as_sequence; if (m && m->sq_inplace_repeat) return m->sq_inplace_repeat(o, count); if (m && m->sq_repeat) @@ -1732,7 +1732,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return null_error(); } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_item) { if (i < 0) { if (m->sq_length) { @@ -1747,7 +1747,7 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) return m->sq_item(s, i); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) { return type_error("%.200s is not a sequence", s); } return type_error("'%.200s' object does not support indexing", s); @@ -1762,7 +1762,7 @@ PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return null_error(); } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_subscript) { PyObject *res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1786,7 +1786,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1801,7 +1801,7 @@ PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) return m->sq_ass_item(s, i, o); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1819,7 +1819,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return -1; } - m = s->ob_type->tp_as_sequence; + m = Py_TYPE(s)->tp_as_sequence; if (m && m->sq_ass_item) { if (i < 0) { if (m->sq_length) { @@ -1834,7 +1834,7 @@ PySequence_DelItem(PyObject *s, Py_ssize_t i) return m->sq_ass_item(s, i, (PyObject *)NULL); } - if (s->ob_type->tp_as_mapping && s->ob_type->tp_as_mapping->mp_ass_subscript) { + if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) { type_error("%.200s is not a sequence", s); return -1; } @@ -1852,7 +1852,7 @@ PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -1877,7 +1877,7 @@ PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2) return -1; } - mp = s->ob_type->tp_as_mapping; + mp = Py_TYPE(s)->tp_as_mapping; if (mp && mp->mp_ass_subscript) { int res; PyObject *slice = _PySlice_FromIndices(i1, i2); @@ -2127,7 +2127,7 @@ int PySequence_Contains(PyObject *seq, PyObject *ob) { Py_ssize_t result; - PySequenceMethods *sqm = seq->ob_type->tp_as_sequence; + PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence; if (sqm != NULL && sqm->sq_contains != NULL) return (*sqm->sq_contains)(seq, ob); result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS); @@ -2153,8 +2153,8 @@ PySequence_Index(PyObject *s, PyObject *o) int PyMapping_Check(PyObject *o) { - return o && o->ob_type->tp_as_mapping && - o->ob_type->tp_as_mapping->mp_subscript; + return o && Py_TYPE(o)->tp_as_mapping && + Py_TYPE(o)->tp_as_mapping->mp_subscript; } Py_ssize_t @@ -2167,14 +2167,14 @@ PyMapping_Size(PyObject *o) return -1; } - m = o->ob_type->tp_as_mapping; + m = Py_TYPE(o)->tp_as_mapping; if (m && m->mp_length) { Py_ssize_t len = m->mp_length(o); assert(len >= 0 || PyErr_Occurred()); return len; } - if (o->ob_type->tp_as_sequence && o->ob_type->tp_as_sequence->sq_length) { + if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) { type_error("%.200s is not a mapping", o); return -1; } @@ -2434,7 +2434,7 @@ object_isinstance(PyObject *inst, PyObject *cls) if (retval == 0) { retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls); if (icls != NULL) { - if (icls != (PyObject *)(inst->ob_type) && PyType_Check(icls)) { + if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) { retval = PyType_IsSubtype( (PyTypeObject *)icls, (PyTypeObject *)cls); @@ -2630,7 +2630,7 @@ _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls) PyObject * PyObject_GetIter(PyObject *o) { - PyTypeObject *t = o->ob_type; + PyTypeObject *t = Py_TYPE(o); getiterfunc f; f = t->tp_iter; @@ -2645,7 +2645,7 @@ PyObject_GetIter(PyObject *o) PyErr_Format(PyExc_TypeError, "iter() returned non-iterator " "of type '%.100s'", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); res = NULL; } @@ -2657,8 +2657,8 @@ PyObject_GetIter(PyObject *o) int PyIter_Check(PyObject *obj) { - return obj->ob_type->tp_iternext != NULL && - obj->ob_type->tp_iternext != &_PyObject_NextNotImplemented; + return Py_TYPE(obj)->tp_iternext != NULL && + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented; } /* Return next item. @@ -2672,7 +2672,7 @@ PyObject * PyIter_Next(PyObject *iter) { PyObject *result; - result = (*iter->ob_type->tp_iternext)(iter); + result = (*Py_TYPE(iter)->tp_iternext)(iter); if (result == NULL && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) From 38aaaaac805fa30870e2d093e52a900dddde3b34 Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Fri, 7 Feb 2020 02:15:12 +0100 Subject: [PATCH 315/380] bpo-39491: Mention Annotated in get_origin() docstring (GH-18379) I forgot to do it in https://github.com/python/cpython/pull/18260. --- Lib/typing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/typing.py b/Lib/typing.py index 5a7077c27c4..8886b08c2ec 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1380,8 +1380,8 @@ def _strip_annotations(t): def get_origin(tp): """Get the unsubscripted version of a type. - This supports generic types, Callable, Tuple, Union, Literal, Final and ClassVar. - Return None for unsupported types. Examples:: + This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar + and Annotated. Return None for unsupported types. Examples:: get_origin(Literal[42]) is Literal get_origin(int) is None From a102ed7d2f0e7e05438f14d5fb72ca0358602249 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 02:24:48 +0100 Subject: [PATCH 316/380] bpo-39573: Use Py_TYPE() macro in Python and Include directories (GH-18391) Replace direct access to PyObject.ob_type with Py_TYPE(). --- Include/classobject.h | 4 ++-- Include/cpython/abstract.h | 12 ++++++------ Include/pyerrors.h | 4 ++-- Python/_warnings.c | 4 ++-- Python/bltinmodule.c | 16 ++++++++-------- Python/ceval.c | 14 +++++++------- Python/codecs.c | 2 +- Python/compile.c | 2 +- Python/formatter_unicode.c | 8 ++++---- Python/getargs.c | 8 ++++---- Python/marshal.c | 2 +- Python/sysmodule.c | 2 +- 12 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Include/classobject.h b/Include/classobject.h index 840431a1276..87427207205 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -19,7 +19,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyMethod_Type; -#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type) +#define PyMethod_Check(op) (Py_TYPE(op)== &PyMethod_Type) PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); @@ -40,7 +40,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; -#define PyInstanceMethod_Check(op) ((op)->ob_type == &PyInstanceMethod_Type) +#define PyInstanceMethod_Check(op) (Py_TYPE(op) == &PyInstanceMethod_Type) PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 4bd7b1a61a5..76eaedfc4b7 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -246,8 +246,8 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); /* Return 1 if the getbuffer function is available, otherwise return 0. */ #define PyObject_CheckBuffer(obj) \ - (((obj)->ob_type->tp_as_buffer != NULL) && \ - ((obj)->ob_type->tp_as_buffer->bf_getbuffer != NULL)) + ((Py_TYPE(obj)->tp_as_buffer != NULL) && \ + (Py_TYPE(obj)->tp_as_buffer->bf_getbuffer != NULL)) /* This is a C-API version of the getbuffer function call. It checks to make sure object has the required function pointer and issues the @@ -315,14 +315,14 @@ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); /* ==== Iterators ================================================ */ #define PyIter_Check(obj) \ - ((obj)->ob_type->tp_iternext != NULL && \ - (obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented) + (Py_TYPE(obj)->tp_iternext != NULL && \ + Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) /* === Number Protocol ================================================== */ #define PyIndex_Check(obj) \ - ((obj)->ob_type->tp_as_number != NULL && \ - (obj)->ob_type->tp_as_number->nb_index != NULL) + (Py_TYPE(obj)->tp_as_number != NULL && \ + Py_TYPE(obj)->tp_as_number->nb_index != NULL) /* === Sequence protocol ================================================ */ diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 5125a51ec1a..3fd133c57de 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -54,11 +54,11 @@ PyAPI_FUNC(void) PyException_SetContext(PyObject *, PyObject *); PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS)) #define PyExceptionInstance_Check(x) \ - PyType_FastSubclass((x)->ob_type, Py_TPFLAGS_BASE_EXC_SUBCLASS) + PyType_FastSubclass(Py_TYPE(x), Py_TPFLAGS_BASE_EXC_SUBCLASS) PyAPI_FUNC(const char *) PyExceptionClass_Name(PyObject *); -#define PyExceptionInstance_Class(x) ((PyObject*)((x)->ob_type)) +#define PyExceptionInstance_Class(x) ((PyObject*)Py_TYPE(x)) /* Predefined exceptions */ diff --git a/Python/_warnings.c b/Python/_warnings.c index 602211c02ef..9e8b52d353d 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -650,7 +650,7 @@ warn_explicit(PyObject *category, PyObject *message, text = PyObject_Str(message); if (text == NULL) goto cleanup; - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); } else { text = message; @@ -906,7 +906,7 @@ get_category(PyObject *message, PyObject *category) return NULL; if (rc == 1) - category = (PyObject*)message->ob_type; + category = (PyObject*)Py_TYPE(message); else if (category == NULL || category == Py_None) category = PyExc_UserWarning; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index cdb1eaaff01..980b81041b4 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -170,7 +170,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, /* else get the type of the first base */ else { PyObject *base0 = PyTuple_GET_ITEM(bases, 0); - meta = (PyObject *) (base0->ob_type); + meta = (PyObject *)Py_TYPE(base0); } Py_INCREF(meta); isclass = 1; /* meta is really a class */ @@ -1002,13 +1002,13 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals, if (!PyDict_Check(globals)) { PyErr_Format(PyExc_TypeError, "exec() globals must be a dict, not %.100s", - globals->ob_type->tp_name); + Py_TYPE(globals)->tp_name); return NULL; } if (!PyMapping_Check(locals)) { PyErr_Format(PyExc_TypeError, "locals must be a mapping or None, not %.100s", - locals->ob_type->tp_name); + Py_TYPE(locals)->tp_name); return NULL; } if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) { @@ -1383,11 +1383,11 @@ builtin_next(PyObject *self, PyObject *const *args, Py_ssize_t nargs) if (!PyIter_Check(it)) { PyErr_Format(PyExc_TypeError, "'%.200s' object is not an iterator", - it->ob_type->tp_name); + Py_TYPE(it)->tp_name); return NULL; } - res = (*it->ob_type->tp_iternext)(it); + res = (*Py_TYPE(it)->tp_iternext)(it); if (res != NULL) { return res; } else if (nargs > 1) { @@ -1788,7 +1788,7 @@ builtin_ord(PyObject *module, PyObject *c) else { PyErr_Format(PyExc_TypeError, "ord() expected string of length 1, but " \ - "%.200s found", c->ob_type->tp_name); + "%.200s found", Py_TYPE(c)->tp_name); return NULL; } @@ -1856,7 +1856,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (sep && !PyUnicode_Check(sep)) { PyErr_Format(PyExc_TypeError, "sep must be None or a string, not %.200s", - sep->ob_type->tp_name); + Py_TYPE(sep)->tp_name); return NULL; } if (end == Py_None) { @@ -1865,7 +1865,7 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject else if (end && !PyUnicode_Check(end)) { PyErr_Format(PyExc_TypeError, "end must be None or a string, not %.200s", - end->ob_type->tp_name); + Py_TYPE(end)->tp_name); return NULL; } diff --git a/Python/ceval.c b/Python/ceval.c index 892d668816a..c36a38e2113 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2633,7 +2633,7 @@ main_loop: PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); if (none_val == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && - (iterable->ob_type->tp_iter == NULL && !PySequence_Check(iterable))) + (Py_TYPE(iterable)->tp_iter == NULL && !PySequence_Check(iterable))) { _PyErr_Clear(tstate); _PyErr_Format(tstate, PyExc_TypeError, @@ -2803,7 +2803,7 @@ main_loop: if (_PyErr_ExceptionMatches(tstate, PyExc_AttributeError)) { _PyErr_Format(tstate, PyExc_TypeError, "'%.200s' object is not a mapping", - update->ob_type->tp_name); + Py_TYPE(update)->tp_name); } Py_DECREF(update); goto error; @@ -3158,7 +3158,7 @@ main_loop: PREDICTED(FOR_ITER); /* before: [iter]; after: [iter, iter()] *or* [] */ PyObject *iter = TOP(); - PyObject *next = (*iter->ob_type->tp_iternext)(iter); + PyObject *next = (*Py_TYPE(iter)->tp_iternext)(iter); if (next != NULL) { PUSH(next); PREDICT(STORE_FAST); @@ -4369,11 +4369,11 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, it = PyObject_GetIter(v); if (it == NULL) { if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError) && - v->ob_type->tp_iter == NULL && !PySequence_Check(v)) + Py_TYPE(v)->tp_iter == NULL && !PySequence_Check(v)) { _PyErr_Format(tstate, PyExc_TypeError, "cannot unpack non-iterable %.200s object", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } return 0; } @@ -4790,7 +4790,7 @@ PyEval_GetFuncName(PyObject *func) else if (PyCFunction_Check(func)) return ((PyCFunctionObject*)func)->m_ml->ml_name; else - return func->ob_type->tp_name; + return Py_TYPE(func)->tp_name; } const char * @@ -5197,7 +5197,7 @@ import_all_from(PyThreadState *tstate, PyObject *locals, PyObject *v) static int check_args_iterable(PyThreadState *tstate, PyObject *func, PyObject *args) { - if (args->ob_type->tp_iter == NULL && !PySequence_Check(args)) { + if (Py_TYPE(args)->tp_iter == NULL && !PySequence_Check(args)) { /* check_args_iterable() may be called with a live exception: * clear it to prevent calling _PyObject_FunctionStr() with an * exception set. */ diff --git a/Python/codecs.c b/Python/codecs.c index 10d76969a51..ee2758c5fbe 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -658,7 +658,7 @@ static void wrong_exception_type(PyObject *exc) { PyErr_Format(PyExc_TypeError, "don't know how to handle %.200s in error callback", - exc->ob_type->tp_name); + Py_TYPE(exc)->tp_name); } PyObject *PyCodec_StrictErrors(PyObject *exc) diff --git a/Python/compile.c b/Python/compile.c index 6776df54d47..04b8fe46e19 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -3988,7 +3988,7 @@ infer_type(expr_ty e) case FormattedValue_kind: return &PyUnicode_Type; case Constant_kind: - return e->v.Constant.value->ob_type; + return Py_TYPE(e->v.Constant.value); default: return NULL; } diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c index 7c4ecf0b3e2..41a2478e0a8 100644 --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -1447,7 +1447,7 @@ _PyUnicode_FormatAdvancedWriter(_PyUnicodeWriter *writer, return format_string_internal(obj, &format, writer); default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1505,7 +1505,7 @@ _PyLong_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); goto done; } @@ -1549,7 +1549,7 @@ _PyFloat_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } @@ -1587,7 +1587,7 @@ _PyComplex_FormatAdvancedWriter(_PyUnicodeWriter *writer, default: /* unknown */ - unknown_presentation_type(format.type, obj->ob_type->tp_name); + unknown_presentation_type(format.type, Py_TYPE(obj)->tp_name); return -1; } } diff --git a/Python/getargs.c b/Python/getargs.c index d5caf47a028..d644aea5207 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -531,7 +531,7 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags, toplevel ? "expected %d arguments, not %.50s" : "must be %d-item sequence, not %.50s", n, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); return msgbuf; } @@ -621,7 +621,7 @@ _PyArg_BadArgument(const char *fname, const char *displayname, PyErr_Format(PyExc_TypeError, "%.200s() %.200s must be %.50s, not %.50s", fname, displayname, expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } static const char * @@ -636,7 +636,7 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) else { PyOS_snprintf(msgbuf, bufsize, "must be %.50s, not %.50s", expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + arg == Py_None ? "None" : Py_TYPE(arg)->tp_name); } return msgbuf; } @@ -1331,7 +1331,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, type = va_arg(*p_va, PyTypeObject*); p = va_arg(*p_va, PyObject **); format++; - if (PyType_IsSubtype(arg->ob_type, type)) + if (PyType_IsSubtype(Py_TYPE(arg), type)) *p = arg; else return converterr(type->tp_name, arg, msgbuf, bufsize); diff --git a/Python/marshal.c b/Python/marshal.c index ec6b3dadc02..8d441a4f081 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1696,7 +1696,7 @@ marshal_load(PyObject *module, PyObject *file) if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "file.read() returned not bytes but %.100s", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); result = NULL; } else { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index d8d18747454..707a08e7f49 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -840,7 +840,7 @@ sys_intern_impl(PyObject *module, PyObject *s) } else { _PyErr_Format(tstate, PyExc_TypeError, - "can't intern %.400s", s->ob_type->tp_name); + "can't intern %.400s", Py_TYPE(s)->tp_name); return NULL; } } From 58ac700fb09497df14d4492b6f820109490b2b88 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 03:04:21 +0100 Subject: [PATCH 317/380] bpo-39573: Use Py_TYPE() macro in Objects directory (GH-18392) Replace direct access to PyObject.ob_type with Py_TYPE(). --- Objects/bytearrayobject.c | 4 +-- Objects/bytesobject.c | 2 +- Objects/call.c | 4 +-- Objects/cellobject.c | 2 +- Objects/classobject.c | 12 +++---- Objects/codeobject.c | 2 +- Objects/complexobject.c | 8 ++--- Objects/descrobject.c | 14 ++++---- Objects/dictobject.c | 2 +- Objects/floatobject.c | 6 ++-- Objects/funcobject.c | 4 +-- Objects/interpreteridobject.c | 2 +- Objects/listobject.c | 38 ++++++++++---------- Objects/longobject.c | 8 ++--- Objects/methodobject.c | 2 +- Objects/namespaceobject.c | 2 +- Objects/object.c | 68 +++++++++++++++++------------------ Objects/rangeobject.c | 4 +-- Objects/typeobject.c | 26 +++++++------- Objects/unicodeobject.c | 8 ++--- 20 files changed, 109 insertions(+), 109 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index c9bf11bba1d..a019b4905a8 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -856,7 +856,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytearray", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); } return -1; } @@ -1630,7 +1630,7 @@ bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints) if (PyErr_ExceptionMatches(PyExc_TypeError)) { PyErr_Format(PyExc_TypeError, "can't extend bytearray with %.100s", - iterable_of_ints->ob_type->tp_name); + Py_TYPE(iterable_of_ints)->tp_name); } return NULL; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 5334eca7f33..4edd93d4b8d 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2762,7 +2762,7 @@ PyBytes_FromObject(PyObject *x) PyErr_Format(PyExc_TypeError, "cannot convert '%.200s' object to bytes", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); return NULL; } diff --git a/Objects/call.c b/Objects/call.c index 0f8cb5aa246..d1d50b647f3 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -263,11 +263,11 @@ _PyObject_Call(PyThreadState *tstate, PyObject *callable, return PyVectorcall_Call(callable, args, kwargs); } else { - call = callable->ob_type->tp_call; + call = Py_TYPE(callable)->tp_call; if (call == NULL) { _PyErr_Format(tstate, PyExc_TypeError, "'%.200s' object is not callable", - callable->ob_type->tp_name); + Py_TYPE(callable)->tp_name); return NULL; } diff --git a/Objects/cellobject.c b/Objects/cellobject.c index 911cf527a43..e97feefbf6d 100644 --- a/Objects/cellobject.c +++ b/Objects/cellobject.c @@ -112,7 +112,7 @@ cell_repr(PyCellObject *op) return PyUnicode_FromFormat("", op); return PyUnicode_FromFormat("", - op, op->ob_ref->ob_type->tp_name, + op, Py_TYPE(op->ob_ref)->tp_name, op->ob_ref); } diff --git a/Objects/classobject.c b/Objects/classobject.c index db53f04862c..fb89b8aa693 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -178,7 +178,7 @@ static PyObject * method_getattro(PyObject *obj, PyObject *name) { PyMethodObject *im = (PyMethodObject *)obj; - PyTypeObject *tp = obj->ob_type; + PyTypeObject *tp = Py_TYPE(obj); PyObject *descr = NULL; { @@ -190,9 +190,9 @@ method_getattro(PyObject *obj, PyObject *name) } if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, obj, (PyObject *)obj->ob_type); + return f(descr, obj, (PyObject *)Py_TYPE(obj)); else { Py_INCREF(descr); return descr; @@ -425,7 +425,7 @@ static PyGetSetDef instancemethod_getset[] = { static PyObject * instancemethod_getattro(PyObject *self, PyObject *name) { - PyTypeObject *tp = self->ob_type; + PyTypeObject *tp = Py_TYPE(self); PyObject *descr = NULL; if (tp->tp_dict == NULL) { @@ -435,9 +435,9 @@ instancemethod_getattro(PyObject *self, PyObject *name) descr = _PyType_Lookup(tp, name); if (descr != NULL) { - descrgetfunc f = TP_DESCR_GET(descr->ob_type); + descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); if (f != NULL) - return f(descr, self, (PyObject *)self->ob_type); + return f(descr, self, (PyObject *)Py_TYPE(self)); else { Py_INCREF(descr); return descr; diff --git a/Objects/codeobject.c b/Objects/codeobject.c index c6759c9be22..fd64393c235 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -416,7 +416,7 @@ validate_and_copy_tuple(PyObject *tup) PyExc_TypeError, "name tuples must contain only " "strings, not '%.500s'", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); Py_DECREF(newtuple); return NULL; } diff --git a/Objects/complexobject.c b/Objects/complexobject.c index f1b76673efd..8d1461b29b4 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -296,7 +296,7 @@ try_complex_special_method(PyObject *op) if (!PyComplex_Check(res)) { PyErr_Format(PyExc_TypeError, "__complex__ returned non-complex (type %.200s)", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -305,7 +305,7 @@ try_complex_special_method(PyObject *op) "__complex__ returned non-complex (type %.200s). " "The ability to return an instance of a strict subclass of complex " "is deprecated, and may be removed in a future version of Python.", - res->ob_type->tp_name)) { + Py_TYPE(res)->tp_name)) { Py_DECREF(res); return NULL; } @@ -958,7 +958,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } - nbr = r->ob_type->tp_as_number; + nbr = Py_TYPE(r)->tp_as_number; if (nbr == NULL || (nbr->nb_float == NULL && nbr->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() first argument must be a string or a number, " @@ -970,7 +970,7 @@ complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i) return NULL; } if (i != NULL) { - nbi = i->ob_type->tp_as_number; + nbi = Py_TYPE(i)->tp_as_number; if (nbi == NULL || (nbi->nb_float == NULL && nbi->nb_index == NULL)) { PyErr_Format(PyExc_TypeError, "complex() second argument must be a number, " diff --git a/Objects/descrobject.c b/Objects/descrobject.c index b9b16d6d0a3..49c26eb0692 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -84,7 +84,7 @@ descr_check(PyDescrObject *descr, PyObject *obj, PyObject **pres) "doesn't apply to a '%.100s' object", descr_name((PyDescrObject *)descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = NULL; return 1; } @@ -97,7 +97,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) /* Ensure a valid type. Class methods ignore obj. */ if (type == NULL) { if (obj != NULL) - type = (PyObject *)obj->ob_type; + type = (PyObject *)Py_TYPE(obj); else { /* Wot - no type?! */ PyErr_Format(PyExc_TypeError, @@ -114,7 +114,7 @@ classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type) "needs a type, not a '%.100s' as arg 2", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - type->ob_type->tp_name); + Py_TYPE(type)->tp_name); return NULL; } if (!PyType_IsSubtype((PyTypeObject *)type, PyDescr_TYPE(descr))) { @@ -194,7 +194,7 @@ descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value, "doesn't apply to a '%.100s' object", descr_name(descr), "?", descr->d_type->tp_name, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); *pres = -1; return 1; } @@ -506,7 +506,7 @@ wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds) "but received a '%.100s'", descr_name((PyDescrObject *)descr), "?", PyDescr_TYPE(descr)->tp_name, - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } @@ -1234,7 +1234,7 @@ wrapper_repr(wrapperobject *wp) { return PyUnicode_FromFormat("", wp->descr->d_base->name, - wp->self->ob_type->tp_name, + Py_TYPE(wp->self)->tp_name, wp->self); } @@ -1476,7 +1476,7 @@ property_dealloc(PyObject *self) Py_XDECREF(gs->prop_set); Py_XDECREF(gs->prop_del); Py_XDECREF(gs->prop_doc); - self->ob_type->tp_free(self); + Py_TYPE(self)->tp_free(self); } static PyObject * diff --git a/Objects/dictobject.c b/Objects/dictobject.c index ae6b50ff272..164104ed7e1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4015,7 +4015,7 @@ _PyDictView_New(PyObject *dict, PyTypeObject *type) /* XXX Get rid of this restriction later */ PyErr_Format(PyExc_TypeError, "%s() requires a dict argument, not '%s'", - type->tp_name, dict->ob_type->tp_name); + type->tp_name, Py_TYPE(dict)->tp_name); return NULL; } dv = PyObject_GC_New(_PyDictViewObject, type); diff --git a/Objects/floatobject.c b/Objects/floatobject.c index ab486d4ee3d..26e238cf05a 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -256,7 +256,7 @@ PyFloat_AsDouble(PyObject *op) return val; } PyErr_Format(PyExc_TypeError, "must be real number, not %.50s", - op->ob_type->tp_name); + Py_TYPE(op)->tp_name); return -1; } @@ -268,7 +268,7 @@ PyFloat_AsDouble(PyObject *op) if (!PyFloat_Check(res)) { PyErr_Format(PyExc_TypeError, "%.50s.__float__ returned non-float (type %.50s)", - op->ob_type->tp_name, res->ob_type->tp_name); + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name); Py_DECREF(res); return -1; } @@ -276,7 +276,7 @@ PyFloat_AsDouble(PyObject *op) "%.50s.__float__ returned non-float (type %.50s). " "The ability to return an instance of a strict subclass of float " "is deprecated, and may be removed in a future version of Python.", - op->ob_type->tp_name, res->ob_type->tp_name)) { + Py_TYPE(op)->tp_name, Py_TYPE(res)->tp_name)) { Py_DECREF(res); return -1; } diff --git a/Objects/funcobject.c b/Objects/funcobject.c index b6ffc2a184c..ebe68adc336 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -196,7 +196,7 @@ PyFunction_SetClosure(PyObject *op, PyObject *closure) else { PyErr_Format(PyExc_SystemError, "expected tuple for closure, got '%.100s'", - closure->ob_type->tp_name); + Py_TYPE(closure)->tp_name); return -1; } Py_XSETREF(((PyFunctionObject *)op)->func_closure, closure); @@ -541,7 +541,7 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals, if (!PyCell_Check(o)) { return PyErr_Format(PyExc_TypeError, "arg 5 (closure) expected cell, found %s", - o->ob_type->tp_name); + Py_TYPE(o)->tp_name); } } } diff --git a/Objects/interpreteridobject.c b/Objects/interpreteridobject.c index 94f5dd709bb..57748e8139f 100644 --- a/Objects/interpreteridobject.c +++ b/Objects/interpreteridobject.c @@ -56,7 +56,7 @@ interp_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "interpreter ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = id; diff --git a/Objects/listobject.c b/Objects/listobject.c index c93a0feaf36..d83e3cfcf1a 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -493,7 +493,7 @@ list_concat(PyListObject *a, PyObject *bb) if (!PyList_Check(bb)) { PyErr_Format(PyExc_TypeError, "can only concatenate list (not \"%.200s\") to list", - bb->ob_type->tp_name); + Py_TYPE(bb)->tp_name); return NULL; } #define b ((PyListObject *)bb) @@ -892,7 +892,7 @@ list_extend(PyListObject *self, PyObject *iterable) it = PyObject_GetIter(iterable); if (it == NULL) return NULL; - iternext = *it->ob_type->tp_iternext; + iternext = *Py_TYPE(it)->tp_iternext; /* Guess a result list size. */ n = PyObject_LengthHint(iterable, 8); @@ -1179,7 +1179,7 @@ struct s_MergeState { /* This function is used by unsafe_object_compare to optimize comparisons * when we know our list is type-homogeneous but we can't assume anything else. - * In the pre-sort check it is set equal to key->ob_type->tp_richcompare */ + * In the pre-sort check it is set equal to Py_TYPE(key)->tp_richcompare */ PyObject *(*key_richcompare)(PyObject *, PyObject *, int); /* This function is used by unsafe_tuple_compare to compare the first elements @@ -2015,7 +2015,7 @@ unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms) PyObject *res_obj; int res; /* No assumptions, because we check first: */ - if (v->ob_type->tp_richcompare != ms->key_richcompare) + if (Py_TYPE(v)->tp_richcompare != ms->key_richcompare) return PyObject_RichCompareBool(v, w, Py_LT); assert(ms->key_richcompare != NULL); @@ -2052,8 +2052,8 @@ unsafe_latin_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/unicodeobject.c:unicode_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyUnicode_Type); + assert(Py_TYPE(v) == Py_TYPE(w)); + assert(Py_TYPE(v) == &PyUnicode_Type); assert(PyUnicode_KIND(v) == PyUnicode_KIND(w)); assert(PyUnicode_KIND(v) == PyUnicode_1BYTE_KIND); @@ -2075,8 +2075,8 @@ unsafe_long_compare(PyObject *v, PyObject *w, MergeState *ms) PyLongObject *vl, *wl; sdigit v0, w0; int res; /* Modified from Objects/longobject.c:long_compare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyLong_Type); + assert(Py_TYPE(v) == Py_TYPE(w)); + assert(Py_TYPE(v) == &PyLong_Type); assert(Py_ABS(Py_SIZE(v)) <= 1); assert(Py_ABS(Py_SIZE(w)) <= 1); @@ -2103,8 +2103,8 @@ unsafe_float_compare(PyObject *v, PyObject *w, MergeState *ms) int res; /* Modified from Objects/floatobject.c:float_richcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyFloat_Type); + assert(Py_TYPE(v) == Py_TYPE(w)); + assert(Py_TYPE(v) == &PyFloat_Type); res = PyFloat_AS_DOUBLE(v) < PyFloat_AS_DOUBLE(w); assert(res == PyObject_RichCompareBool(v, w, Py_LT)); @@ -2125,8 +2125,8 @@ unsafe_tuple_compare(PyObject *v, PyObject *w, MergeState *ms) int k; /* Modified from Objects/tupleobject.c:tuplerichcompare, assuming: */ - assert(v->ob_type == w->ob_type); - assert(v->ob_type == &PyTuple_Type); + assert(Py_TYPE(v) == Py_TYPE(w)); + assert(Py_TYPE(v) == &PyTuple_Type); assert(Py_SIZE(v) > 0); assert(Py_SIZE(w) > 0); @@ -2247,12 +2247,12 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) * set ms appropriately. */ if (saved_ob_size > 1) { /* Assume the first element is representative of the whole list. */ - int keys_are_in_tuples = (lo.keys[0]->ob_type == &PyTuple_Type && + int keys_are_in_tuples = (Py_TYPE(lo.keys[0]) == &PyTuple_Type && Py_SIZE(lo.keys[0]) > 0); PyTypeObject* key_type = (keys_are_in_tuples ? - PyTuple_GET_ITEM(lo.keys[0], 0)->ob_type : - lo.keys[0]->ob_type); + Py_TYPE(PyTuple_GET_ITEM(lo.keys[0], 0)) : + Py_TYPE(lo.keys[0])); int keys_are_all_same_type = 1; int strings_are_latin = 1; @@ -2262,7 +2262,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) for (i=0; i < saved_ob_size; i++) { if (keys_are_in_tuples && - !(lo.keys[i]->ob_type == &PyTuple_Type && Py_SIZE(lo.keys[i]) != 0)) { + !(Py_TYPE(lo.keys[i]) == &PyTuple_Type && Py_SIZE(lo.keys[i]) != 0)) { keys_are_in_tuples = 0; keys_are_all_same_type = 0; break; @@ -2275,7 +2275,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) PyTuple_GET_ITEM(lo.keys[i], 0) : lo.keys[i]); - if (key->ob_type != key_type) { + if (Py_TYPE(key) != key_type) { keys_are_all_same_type = 0; /* If keys are in tuple we must loop over the whole list to make sure all items are tuples */ @@ -2818,7 +2818,7 @@ list_subscript(PyListObject* self, PyObject* item) else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } } @@ -2981,7 +2981,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) else { PyErr_Format(PyExc_TypeError, "list indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return -1; } } diff --git a/Objects/longobject.c b/Objects/longobject.c index 9115fa184f3..67cbc7b27e3 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -150,7 +150,7 @@ _PyLong_FromNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__int__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -159,7 +159,7 @@ _PyLong_FromNbInt(PyObject *integral) "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) { + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } @@ -203,7 +203,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) if (!PyLong_Check(result)) { PyErr_Format(PyExc_TypeError, "__index__ returned non-int (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } @@ -212,7 +212,7 @@ _PyLong_FromNbIndexOrNbInt(PyObject *integral) "__index__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", - result->ob_type->tp_name)) + Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 6a37238d86d..2a8111fea1c 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -234,7 +234,7 @@ meth_repr(PyCFunctionObject *m) m->m_ml->ml_name); return PyUnicode_FromFormat("", m->m_ml->ml_name, - m->m_self->ob_type->tp_name, + Py_TYPE(m->m_self)->tp_name, m->m_self); } diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index ddad39a9107..5c7163f36dc 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -73,7 +73,7 @@ namespace_repr(PyObject *ns) const char * name; name = (Py_TYPE(ns) == &_PyNamespace_Type) ? "namespace" - : ns->ob_type->tp_name; + : Py_TYPE(ns)->tp_name; i = Py_ReprEnter(ns); if (i != 0) { diff --git a/Objects/object.c b/Objects/object.c index aca20e8d096..58065424881 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -33,8 +33,8 @@ _PyObject_CheckConsistency(PyObject *op, int check_content) CHECK(!_PyObject_IsFreed(op)); CHECK(Py_REFCNT(op) >= 1); - CHECK(op->ob_type != NULL); - _PyType_CheckConsistency(op->ob_type); + CHECK(Py_TYPE(op) != NULL); + _PyType_CheckConsistency(Py_TYPE(op)); if (PyUnicode_Check(op)) { _PyUnicode_CheckConsistency(op, check_content); @@ -299,7 +299,7 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) else { PyErr_Format(PyExc_TypeError, "str() or repr() returned '%.100s'", - s->ob_type->tp_name); + Py_TYPE(s)->tp_name); ret = -1; } Py_XDECREF(s); @@ -331,7 +331,7 @@ _Py_BreakPoint(void) int _PyObject_IsFreed(PyObject *op) { - if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(op->ob_type)) { + if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) { return 1; } /* ignore op->ob_ref: its value can have be modified @@ -406,7 +406,7 @@ PyObject_Repr(PyObject *v) return PyUnicode_FromString(""); if (Py_TYPE(v)->tp_repr == NULL) return PyUnicode_FromFormat("<%s object at %p>", - v->ob_type->tp_name, v); + Py_TYPE(v)->tp_name, v); PyThreadState *tstate = _PyThreadState_GET(); #ifdef Py_DEBUG @@ -422,7 +422,7 @@ PyObject_Repr(PyObject *v) " while getting the repr of an object")) { return NULL; } - res = (*v->ob_type->tp_repr)(v); + res = (*Py_TYPE(v)->tp_repr)(v); _Py_LeaveRecursiveCall(tstate); if (res == NULL) { @@ -431,7 +431,7 @@ PyObject_Repr(PyObject *v) if (!PyUnicode_Check(res)) { _PyErr_Format(tstate, PyExc_TypeError, "__repr__ returned non-string (type %.200s)", - res->ob_type->tp_name); + Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } @@ -665,22 +665,22 @@ do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op) PyObject *res; int checked_reverse_op = 0; - if (v->ob_type != w->ob_type && - PyType_IsSubtype(w->ob_type, v->ob_type) && - (f = w->ob_type->tp_richcompare) != NULL) { + if (Py_TYPE(v) != Py_TYPE(w) && + PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v)) && + (f = Py_TYPE(w)->tp_richcompare) != NULL) { checked_reverse_op = 1; res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if ((f = v->ob_type->tp_richcompare) != NULL) { + if ((f = Py_TYPE(v)->tp_richcompare) != NULL) { res = (*f)(v, w, op); if (res != Py_NotImplemented) return res; Py_DECREF(res); } - if (!checked_reverse_op && (f = w->ob_type->tp_richcompare) != NULL) { + if (!checked_reverse_op && (f = Py_TYPE(w)->tp_richcompare) != NULL) { res = (*f)(w, v, _Py_SwappedOp[op]); if (res != Py_NotImplemented) return res; @@ -699,8 +699,8 @@ do_richcompare(PyThreadState *tstate, PyObject *v, PyObject *w, int op) _PyErr_Format(tstate, PyExc_TypeError, "'%s' not supported between instances of '%.100s' and '%.100s'", opstrings[op], - v->ob_type->tp_name, - w->ob_type->tp_name); + Py_TYPE(v)->tp_name, + Py_TYPE(w)->tp_name); return NULL; } Py_INCREF(res); @@ -888,7 +888,7 @@ PyObject_GetAttr(PyObject *v, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } if (tp->tp_getattro != NULL) @@ -913,7 +913,7 @@ _PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); *result = NULL; return -1; } @@ -989,7 +989,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } Py_INCREF(name); @@ -1115,9 +1115,9 @@ _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) if (PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) { meth_found = 1; } else { - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - *method = f(descr, obj, (PyObject *)obj->ob_type); + *method = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); return 0; } @@ -1188,7 +1188,7 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } Py_INCREF(name); @@ -1203,9 +1203,9 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, f = NULL; if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_get; + f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { - res = f(descr, obj, (PyObject *)obj->ob_type); + res = f(descr, obj, (PyObject *)Py_TYPE(obj)); if (res == NULL && suppress && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); @@ -1302,7 +1302,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (!PyUnicode_Check(name)){ PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return -1; } @@ -1315,7 +1315,7 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name, if (descr != NULL) { Py_INCREF(descr); - f = descr->ob_type->tp_descr_set; + f = Py_TYPE(descr)->tp_descr_set; if (f != NULL) { res = f(descr, obj, value); goto done; @@ -1408,15 +1408,15 @@ PyObject_IsTrue(PyObject *v) return 0; if (v == Py_None) return 0; - else if (v->ob_type->tp_as_number != NULL && - v->ob_type->tp_as_number->nb_bool != NULL) - res = (*v->ob_type->tp_as_number->nb_bool)(v); - else if (v->ob_type->tp_as_mapping != NULL && - v->ob_type->tp_as_mapping->mp_length != NULL) - res = (*v->ob_type->tp_as_mapping->mp_length)(v); - else if (v->ob_type->tp_as_sequence != NULL && - v->ob_type->tp_as_sequence->sq_length != NULL) - res = (*v->ob_type->tp_as_sequence->sq_length)(v); + else if (Py_TYPE(v)->tp_as_number != NULL && + Py_TYPE(v)->tp_as_number->nb_bool != NULL) + res = (*Py_TYPE(v)->tp_as_number->nb_bool)(v); + else if (Py_TYPE(v)->tp_as_mapping != NULL && + Py_TYPE(v)->tp_as_mapping->mp_length != NULL) + res = (*Py_TYPE(v)->tp_as_mapping->mp_length)(v); + else if (Py_TYPE(v)->tp_as_sequence != NULL && + Py_TYPE(v)->tp_as_sequence->sq_length != NULL) + res = (*Py_TYPE(v)->tp_as_sequence->sq_length)(v); else return 1; /* if it is negative, it should be either -1 or -2 */ @@ -1443,7 +1443,7 @@ PyCallable_Check(PyObject *x) { if (x == NULL) return 0; - return x->ob_type->tp_call != NULL; + return Py_TYPE(x)->tp_call != NULL; } diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index e7168209324..343a80c76b0 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -121,7 +121,7 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) "range expected at least 1 argument, got 0"); return NULL; default: - PyErr_Format(PyExc_TypeError, + PyErr_Format(PyExc_TypeError, "range expected at most 3 arguments, got %zd", num_args); return NULL; @@ -631,7 +631,7 @@ range_subscript(rangeobject* self, PyObject* item) } PyErr_Format(PyExc_TypeError, "range indices must be integers or slices, not %.200s", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); return NULL; } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index d85ff3ce569..5b8d5a228e5 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2345,7 +2345,7 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) assert(args != NULL && PyTuple_Check(args)); assert(kwds == NULL || PyDict_Check(kwds)); - /* Special case: type(x) should return x->ob_type */ + /* Special case: type(x) should return Py_TYPE(x) */ /* We only want type itself to accept the one-argument form (#27157) Note: We don't call PyType_CheckExact as that also allows subclasses */ if (metatype == &PyType_Type) { @@ -3230,7 +3230,7 @@ type_getattro(PyTypeObject *type, PyObject *name) if (!PyUnicode_Check(name)) { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", - name->ob_type->tp_name); + Py_TYPE(name)->tp_name); return NULL; } @@ -3888,12 +3888,12 @@ object_richcompare(PyObject *self, PyObject *other, int op) case Py_NE: /* By default, __ne__() delegates to __eq__() and inverts the result, unless the latter returns NotImplemented. */ - if (self->ob_type->tp_richcompare == NULL) { + if (Py_TYPE(self)->tp_richcompare == NULL) { res = Py_NotImplemented; Py_INCREF(res); break; } - res = (*self->ob_type->tp_richcompare)(self, other, Py_EQ); + res = (*Py_TYPE(self)->tp_richcompare)(self, other, Py_EQ); if (res != NULL && res != Py_NotImplemented) { int ok = PyObject_IsTrue(res); Py_DECREF(res); @@ -4215,7 +4215,7 @@ _PyObject_GetState(PyObject *obj, int required) if (getstate == NULL) { PyObject *slotnames; - if (required && obj->ob_type->tp_itemsize) { + if (required && Py_TYPE(obj)->tp_itemsize) { PyErr_Format(PyExc_TypeError, "cannot pickle '%.200s' object", Py_TYPE(obj)->tp_name); @@ -4248,13 +4248,13 @@ _PyObject_GetState(PyObject *obj, int required) assert(slotnames == Py_None || PyList_Check(slotnames)); if (required) { Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize; - if (obj->ob_type->tp_dictoffset) + if (Py_TYPE(obj)->tp_dictoffset) basicsize += sizeof(PyObject *); - if (obj->ob_type->tp_weaklistoffset) + if (Py_TYPE(obj)->tp_weaklistoffset) basicsize += sizeof(PyObject *); if (slotnames != Py_None) basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slotnames); - if (obj->ob_type->tp_basicsize > basicsize) { + if (Py_TYPE(obj)->tp_basicsize > basicsize) { Py_DECREF(slotnames); Py_DECREF(state); PyErr_Format(PyExc_TypeError, @@ -4725,7 +4725,7 @@ object___format___impl(PyObject *self, PyObject *format_spec) if (PyUnicode_GET_LENGTH(format_spec) > 0) { PyErr_Format(PyExc_TypeError, "unsupported format string passed to %.200s.__format__", - self->ob_type->tp_name); + Py_TYPE(self)->tp_name); return NULL; } return PyObject_Str(self); @@ -4744,10 +4744,10 @@ object___sizeof___impl(PyObject *self) Py_ssize_t res, isize; res = 0; - isize = self->ob_type->tp_itemsize; + isize = Py_TYPE(self)->tp_itemsize; if (isize > 0) res = Py_SIZE(self) * isize; - res += self->ob_type->tp_basicsize; + res += Py_TYPE(self)->tp_basicsize; return PyLong_FromSsize_t(res); } @@ -4794,7 +4794,7 @@ object___dir___impl(PyObject *self) if (_PyObject_LookupAttrId(self, &PyId___class__, &itsclass) < 0) { goto error; } - /* XXX(tomer): Perhaps fall back to obj->ob_type if no + /* XXX(tomer): Perhaps fall back to Py_TYPE(obj) if no __class__ exists? */ if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0) goto error; @@ -7537,7 +7537,7 @@ set_names(PyTypeObject *type) _PyErr_FormatFromCause(PyExc_RuntimeError, "Error calling __set_name__ on '%.100s' instance %R " "in '%.100s'", - value->ob_type->tp_name, key, type->tp_name); + Py_TYPE(value)->tp_name, key, type->tp_name); Py_DECREF(names_to_set); return -1; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fa48ee1ac78..fd08ddbf574 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8401,7 +8401,7 @@ charmapencode_lookup(Py_UCS4 c, PyObject *mapping) /* wrong return value */ PyErr_Format(PyExc_TypeError, "character mapping must return integer, bytes or None, not %.400s", - x->ob_type->tp_name); + Py_TYPE(x)->tp_name); Py_DECREF(x); return NULL; } @@ -11082,8 +11082,8 @@ PyUnicode_Compare(PyObject *left, PyObject *right) } PyErr_Format(PyExc_TypeError, "Can't compare %.100s and %.100s", - left->ob_type->tp_name, - right->ob_type->tp_name); + Py_TYPE(left)->tp_name, + Py_TYPE(right)->tp_name); return -1; } @@ -11353,7 +11353,7 @@ PyUnicode_Concat(PyObject *left, PyObject *right) if (!PyUnicode_Check(right)) { PyErr_Format(PyExc_TypeError, "can only concatenate str (not \"%.200s\") to str", - right->ob_type->tp_name); + Py_TYPE(right)->tp_name); return NULL; } if (PyUnicode_READY(right) < 0) From daa9756cb6395323d6f291efe5c7d7fdc6b2e9d8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 03:37:06 +0100 Subject: [PATCH 318/380] bpo-39573: Use Py_TYPE() macro in Modules directory (GH-18393) Replace direct access to PyObject.ob_type with Py_TYPE(). --- Modules/_collectionsmodule.c | 4 ++-- Modules/_csv.c | 6 +++--- Modules/_ctypes/cfield.c | 14 +++++++------- Modules/_ctypes/ctypes.h | 4 ++-- Modules/_ctypes/stgdict.c | 2 +- Modules/_cursesmodule.c | 2 +- Modules/_datetimemodule.c | 2 +- Modules/_dbmmodule.c | 2 +- Modules/_decimal/_decimal.c | 6 +++--- Modules/_gdbmmodule.c | 2 +- Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- Modules/_json.c | 2 +- Modules/_pickle.c | 2 +- Modules/_sqlite/microprotocols.c | 2 +- Modules/_testbuffer.c | 2 +- Modules/_testcapimodule.c | 4 ++-- Modules/_tkinter.c | 4 ++-- Modules/_xxsubinterpretersmodule.c | 2 +- Modules/cjkcodecs/multibytecodec.c | 2 +- Modules/cjkcodecs/multibytecodec.h | 2 +- Modules/gcmodule.c | 2 +- Modules/grpmodule.c | 2 +- Modules/parsermodule.c | 2 +- Modules/sha512module.c | 2 +- Modules/socketmodule.c | 2 +- 26 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 1d23973fd05..97d7de47d2d 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -539,7 +539,7 @@ deque_concat(dequeobject *deque, PyObject *other) if (rv == 0) { PyErr_Format(PyExc_TypeError, "can only concatenate deque (not \"%.200s\") to deque", - other->ob_type->tp_name); + Py_TYPE(other)->tp_name); } return NULL; } @@ -2395,7 +2395,7 @@ tuplegetter_descr_get(PyObject *self, PyObject *obj, PyObject *type) "descriptor for index '%zd' for tuple subclasses " "doesn't apply to '%s' object", index, - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return NULL; } diff --git a/Modules/_csv.c b/Modules/_csv.c index aaf377650c0..2d541bb3af8 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -236,7 +236,7 @@ _set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt) if (!PyUnicode_Check(src)) { PyErr_Format(PyExc_TypeError, "\"%s\" must be string, not %.200s", name, - src->ob_type->tp_name); + Py_TYPE(src)->tp_name); return -1; } len = PyUnicode_GetLength(src); @@ -807,7 +807,7 @@ Reader_iternext(ReaderObj *self) "iterator should return strings, " "not %.200s " "(did you open the file in text mode?)", - lineobj->ob_type->tp_name + Py_TYPE(lineobj)->tp_name ); Py_DECREF(lineobj); return NULL; @@ -1168,7 +1168,7 @@ csv_writerow(WriterObj *self, PyObject *seq) if (iter == NULL) return PyErr_Format(_csvstate_global->error_obj, "iterable expected, not %.200s", - seq->ob_type->tp_name); + Py_TYPE(seq)->tp_name); /* Join all fields in internal buffer. */ diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index e0a50fde6a0..f860e6e51b2 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -274,7 +274,7 @@ static void PyCField_dealloc(PyObject *self) { PyCField_clear((CFieldObject *)self); - self->ob_type->tp_free((PyObject *)self); + Py_TYPE(self)->tp_free((PyObject *)self); } static PyObject * @@ -1175,7 +1175,7 @@ u_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } else Py_INCREF(value); @@ -1234,7 +1234,7 @@ U_set(void *ptr, PyObject *value, Py_ssize_t length) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1289,7 +1289,7 @@ s_set(void *ptr, PyObject *value, Py_ssize_t length) if(!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "expected bytes, %s found", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1334,7 +1334,7 @@ z_set(void *ptr, PyObject *value, Py_ssize_t size) } PyErr_Format(PyExc_TypeError, "bytes or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1373,7 +1373,7 @@ Z_set(void *ptr, PyObject *value, Py_ssize_t size) if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string or integer address expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } @@ -1416,7 +1416,7 @@ BSTR_set(void *ptr, PyObject *value, Py_ssize_t size) } else if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", - value->ob_type->tp_name); + Py_TYPE(value)->tp_name); return NULL; } diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index e58f85233cb..351f996be05 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -102,7 +102,7 @@ typedef struct { } PyCFuncPtrObject; extern PyTypeObject PyCStgDict_Type; -#define PyCStgDict_CheckExact(v) ((v)->ob_type == &PyCStgDict_Type) +#define PyCStgDict_CheckExact(v) (Py_TYPE(v) == &PyCStgDict_Type) #define PyCStgDict_Check(v) PyObject_TypeCheck(v, &PyCStgDict_Type) extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct); @@ -314,7 +314,7 @@ struct tagPyCArgObject { }; extern PyTypeObject PyCArg_Type; -#define PyCArg_CheckExact(v) ((v)->ob_type == &PyCArg_Type) +#define PyCArg_CheckExact(v) (Py_TYPE(v) == &PyCArg_Type) extern PyCArgObject *PyCArgObject_new(void); extern PyObject * diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c index 1d45ade5efd..c8001a97810 100644 --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -190,7 +190,7 @@ PyType_stgdict(PyObject *obj) StgDictObject * PyObject_stgdict(PyObject *self) { - PyTypeObject *type = self->ob_type; + PyTypeObject *type = Py_TYPE(self); if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict)) return NULL; return (StgDictObject *)type->tp_dict; diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index c2ce3a968fa..5b29000a24e 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -2924,7 +2924,7 @@ _curses_getwin(PyObject *module, PyObject *file) if (!PyBytes_Check(data)) { PyErr_Format(PyExc_TypeError, "f.read() returned %.100s instead of bytes", - data->ob_type->tp_name); + Py_TYPE(data)->tp_name); Py_DECREF(data); goto error; } diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 0b98cca67d4..bc03c504380 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1810,7 +1810,7 @@ checked_divmod(PyObject *a, PyObject *b) if (!PyTuple_Check(result)) { PyErr_Format(PyExc_TypeError, "divmod() returned non-tuple (type %.200s)", - result->ob_type->tp_name); + Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index b317b57e7ae..072e9775236 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -255,7 +255,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "dbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index e2ac1980031..75a8ddba1fe 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -2584,7 +2584,7 @@ PyDecType_FromObjectExact(PyTypeObject *type, PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2633,7 +2633,7 @@ PyDec_FromObject(PyObject *v, PyObject *context) else { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); return NULL; } } @@ -2696,7 +2696,7 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context) if (type_err) { PyErr_Format(PyExc_TypeError, "conversion from %s to Decimal is not supported", - v->ob_type->tp_name); + Py_TYPE(v)->tp_name); } else { Py_INCREF(Py_NotImplemented); diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index dd4a348d136..a815819ee90 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -349,7 +349,7 @@ dbm_contains(PyObject *self, PyObject *arg) else if (!PyBytes_Check(arg)) { PyErr_Format(PyExc_TypeError, "gdbm key must be bytes or string, not %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return -1; } else { diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index 5932363f3af..d609fa4afec 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -544,7 +544,7 @@ PyNumber_AsOff_t(PyObject *item, PyObject *err) /* Otherwise replace the error with caller's error object. */ PyErr_Format(err, "cannot fit '%.200s' into an offset-sized integer", - item->ob_type->tp_name); + Py_TYPE(item)->tp_name); } finish: diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 5ebeb024e57..c4c56cb04de 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -1094,7 +1094,7 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer, PyErr_Format( PyExc_TypeError, "TextIOWrapper() argument 'errors' must be str or None, not %.50s", - errors->ob_type->tp_name); + Py_TYPE(errors)->tp_name); return -1; } else if (io_check_errors(errors)) { diff --git a/Modules/_json.c b/Modules/_json.c index 3e4fe795a05..a70043b605f 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1617,7 +1617,7 @@ encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, else { PyErr_Format(PyExc_TypeError, "keys must be str, int, float, bool or None, " - "not %.100s", key->ob_type->tp_name); + "not %.100s", Py_TYPE(key)->tp_name); goto bail; } diff --git a/Modules/_pickle.c b/Modules/_pickle.c index fc48d605786..f67fb6a65c3 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -1976,7 +1976,7 @@ fast_save_enter(PicklerObject *self, PyObject *obj) PyErr_Format(PyExc_ValueError, "fast mode: can't pickle cyclic objects " "including object type %.200s at %p", - obj->ob_type->tp_name, obj); + Py_TYPE(obj)->tp_name, obj); self->fast_nesting = -1; return 0; } diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 59a5e228454..bdcb174be43 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -84,7 +84,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) way to get a quotable object to be its instance */ /* look for an adapter in the registry */ - key = Py_BuildValue("(OO)", (PyObject*)obj->ob_type, proto); + key = Py_BuildValue("(OO)", (PyObject*)Py_TYPE(obj), proto); if (!key) { return NULL; } diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index d7d3cc8d0d5..047e3d3974c 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -1854,7 +1854,7 @@ ndarray_subscript(NDArrayObject *self, PyObject *key) type_error: PyErr_Format(PyExc_TypeError, "cannot index memory using \"%.200s\"", - key->ob_type->tp_name); + Py_TYPE(key)->tp_name); err_occurred: Py_DECREF(nd); return NULL; diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index d8bf3735046..3bb1bf1e274 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -274,7 +274,7 @@ dict_hassplittable(PyObject *self, PyObject *arg) if (!PyDict_Check(arg)) { PyErr_Format(PyExc_TypeError, "dict_hassplittable() argument must be dict, not '%s'", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return NULL; } @@ -2724,7 +2724,7 @@ test_thread_state(PyObject *self, PyObject *args) if (!PyCallable_Check(fn)) { PyErr_Format(PyExc_TypeError, "'%s' object is not callable", - fn->ob_type->tp_name); + Py_TYPE(fn)->tp_name); return NULL; } diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 4f7d1b78ebe..87bc7ae8aee 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -833,7 +833,7 @@ typedef struct { } PyTclObject; static PyObject *PyTclObject_Type; -#define PyTclObject_Check(v) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type) +#define PyTclObject_Check(v) (Py_TYPE(v) == (PyTypeObject *) PyTclObject_Type) static PyObject * newPyTclObject(Tcl_Obj *arg) @@ -1734,7 +1734,7 @@ varname_converter(PyObject *in, void *_out) } PyErr_Format(PyExc_TypeError, "must be str, bytes or Tcl_Obj, not %.50s", - in->ob_type->tp_name); + Py_TYPE(in)->tp_name); return 0; } diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c index fa20bc5dcec..cc4f5d9e6dc 100644 --- a/Modules/_xxsubinterpretersmodule.c +++ b/Modules/_xxsubinterpretersmodule.c @@ -1428,7 +1428,7 @@ channel_id_converter(PyObject *arg, void *ptr) else { PyErr_Format(PyExc_TypeError, "channel ID must be an int, got %.100s", - arg->ob_type->tp_name); + Py_TYPE(arg)->tp_name); return 0; } *(int64_t *)ptr = cid; diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index f24ec933508..2dd63a9531e 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1450,7 +1450,7 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, PyErr_Format(PyExc_TypeError, "stream function returned a " "non-bytes object (%.100s)", - cres->ob_type->tp_name); + Py_TYPE(cres)->tp_name); goto errorexit; } diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 6d34534ee68..94670ecafef 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -65,7 +65,7 @@ typedef struct { MultibyteCodec *codec; } MultibyteCodecObject; -#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type) +#define MultibyteCodec_Check(op) (Py_TYPE(op) == &MultibyteCodec_Type) #define _MultibyteStatefulCodec_HEAD \ PyObject_HEAD \ diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 99a6c9ed91d..7e9eae50a8e 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -653,7 +653,7 @@ untrack_dicts(PyGC_Head *head) static int has_legacy_finalizer(PyObject *op) { - return op->ob_type->tp_del != NULL; + return Py_TYPE(op)->tp_del != NULL; } /* Move the objects in unreachable with tp_del slots into `finalizers`. diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c index 81f969c51dd..0e2801fce50 100644 --- a/Modules/grpmodule.c +++ b/Modules/grpmodule.c @@ -116,7 +116,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id) PyErr_Clear(); if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "group id must be int, not %.200", - id->ob_type->tp_name) < 0) { + Py_TYPE(id)->tp_name) < 0) { return NULL; } py_int_id = PyNumber_Long(id); diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index ef63ca936e9..f00329b3541 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -256,7 +256,7 @@ PyTypeObject PyST_Type = { /* PyST_Type isn't subclassable, so just check ob_type */ -#define PyST_Object_Check(v) ((v)->ob_type == &PyST_Type) +#define PyST_Object_Check(v) (Py_TYPE(v) == &PyST_Type) static int parser_compare_nodes(node *left, node *right) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index df4f9d2d741..4045698387f 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -478,7 +478,7 @@ SHA512Type_copy_impl(SHAobject *self) { SHAobject *newobj; - if (((PyObject*)self)->ob_type == &SHA512type) { + if (Py_TYPE((PyObject*)self) == &SHA512type) { if ( (newobj = newSHA512object())==NULL) return NULL; } else { diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index d42fa7ce182..e54f7a9b1c2 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1670,7 +1670,7 @@ idna_converter(PyObject *obj, struct maybe_idna *data) } else { PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s", - obj->ob_type->tp_name); + Py_TYPE(obj)->tp_name); return 0; } if (strlen(data->buf) != len) { From d2ec81a8c99796b51fb8c49b77a7fe369863226f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 09:17:07 +0100 Subject: [PATCH 319/380] bpo-39573: Add Py_SET_TYPE() function (GH-18394) Add Py_SET_TYPE() function to set the type of an object. --- Doc/c-api/structures.rst | 7 +++++++ Include/cpython/objimpl.h | 2 +- Include/object.h | 6 ++++++ .../C API/2020-02-07-03-39-03.bpo-39573.Oa8cL1.rst | 1 + Modules/_blake2/blake2module.c | 4 ++-- Modules/_ctypes/_ctypes.c | 12 ++++++------ Modules/_ctypes/ctypes.h | 2 +- Modules/_sha3/sha3module.c | 2 +- Modules/_sqlite/prepare_protocol.c | 2 +- Modules/_testbuffer.c | 4 ++-- Modules/_testcapimodule.c | 4 ++-- Modules/arraymodule.c | 2 +- Modules/itertoolsmodule.c | 8 +++++--- Modules/md5module.c | 8 +++++--- Modules/sha1module.c | 8 +++++--- Modules/sha256module.c | 10 ++++++---- Modules/sha512module.c | 13 ++++++++----- Modules/socketmodule.c | 2 +- Modules/unicodedata.c | 2 +- Objects/floatobject.c | 2 +- Objects/moduleobject.c | 2 +- Objects/object.c | 2 +- Objects/typeobject.c | 10 ++++++---- Objects/weakrefobject.c | 10 ++++++---- 24 files changed, 77 insertions(+), 48 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-07-03-39-03.bpo-39573.Oa8cL1.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 100573c5693..8a1431c2de7 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -70,6 +70,13 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_type) +.. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type) + + Set the object *o* type to *type*. + + .. versionadded:: 3.9 + + .. c:macro:: Py_REFCNT(o) This macro is used to access the :attr:`ob_refcnt` member of a Python diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index 3f148146f67..ebb3e234e36 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -15,7 +15,7 @@ static inline PyObject* _PyObject_INIT(PyObject *op, PyTypeObject *typeobj) { assert(op != NULL); - Py_TYPE(op) = typeobj; + Py_SET_TYPE(op, typeobj); if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(typeobj); } diff --git a/Include/object.h b/Include/object.h index 0b630513375..eb887f4c6eb 100644 --- a/Include/object.h +++ b/Include/object.h @@ -128,6 +128,12 @@ static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { } #define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) +static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { + ob->ob_type = type; +} +#define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) + + /* Type objects contain a string containing the type name (to help somewhat in debugging), the allocation parameters (see PyObject_New() and diff --git a/Misc/NEWS.d/next/C API/2020-02-07-03-39-03.bpo-39573.Oa8cL1.rst b/Misc/NEWS.d/next/C API/2020-02-07-03-39-03.bpo-39573.Oa8cL1.rst new file mode 100644 index 00000000000..22d3d693ac0 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-07-03-39-03.bpo-39573.Oa8cL1.rst @@ -0,0 +1 @@ +Add :c:func:`Py_SET_TYPE` function to set the type of an object. diff --git a/Modules/_blake2/blake2module.c b/Modules/_blake2/blake2module.c index e2a3d420d4e..9d280a9ccd5 100644 --- a/Modules/_blake2/blake2module.c +++ b/Modules/_blake2/blake2module.c @@ -62,7 +62,7 @@ PyInit__blake2(void) return NULL; /* BLAKE2b */ - Py_TYPE(&PyBlake2_BLAKE2bType) = &PyType_Type; + Py_SET_TYPE(&PyBlake2_BLAKE2bType, &PyType_Type); if (PyType_Ready(&PyBlake2_BLAKE2bType) < 0) { return NULL; } @@ -82,7 +82,7 @@ PyInit__blake2(void) PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); /* BLAKE2s */ - Py_TYPE(&PyBlake2_BLAKE2sType) = &PyType_Type; + Py_SET_TYPE(&PyBlake2_BLAKE2sType, &PyType_Type); if (PyType_Ready(&PyBlake2_BLAKE2sType) < 0) { return NULL; } diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index cb6e03f2ca1..4747195c2e6 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -5758,42 +5758,42 @@ PyInit__ctypes(void) if (PyType_Ready(&PyCData_Type) < 0) return NULL; - Py_TYPE(&Struct_Type) = &PyCStructType_Type; + 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_TYPE(&Union_Type) = &UnionType_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_TYPE(&PyCPointer_Type) = &PyCPointerType_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_TYPE(&PyCArray_Type) = &PyCArrayType_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_TYPE(&Simple_Type) = &PyCSimpleType_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_TYPE(&PyCFuncPtr_Type) = &PyCFuncPtrType_Type; + Py_SET_TYPE(&PyCFuncPtr_Type, &PyCFuncPtrType_Type); PyCFuncPtr_Type.tp_base = &PyCData_Type; if (PyType_Ready(&PyCFuncPtr_Type) < 0) return NULL; diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 351f996be05..a232a4bc832 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -68,7 +68,7 @@ typedef struct { ffi_type *atypes[1]; } CThunkObject; extern PyTypeObject PyCThunk_Type; -#define CThunk_CheckExact(v) ((v)->ob_type == &PyCThunk_Type) +#define CThunk_CheckExact(v) (Py_TYPE(v) == &PyCThunk_Type) typedef struct { /* First part identical to tagCDataObject */ diff --git a/Modules/_sha3/sha3module.c b/Modules/_sha3/sha3module.c index d4ca9a111da..9cdee5869a2 100644 --- a/Modules/_sha3/sha3module.c +++ b/Modules/_sha3/sha3module.c @@ -713,7 +713,7 @@ PyInit__sha3(void) #define init_sha3type(name, type) \ do { \ - Py_TYPE(type) = &PyType_Type; \ + Py_SET_TYPE(type, &PyType_Type); \ if (PyType_Ready(type) < 0) { \ goto error; \ } \ diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c index 181c7edf96b..05a2ca5a652 100644 --- a/Modules/_sqlite/prepare_protocol.c +++ b/Modules/_sqlite/prepare_protocol.c @@ -78,6 +78,6 @@ PyTypeObject pysqlite_PrepareProtocolType= { extern int pysqlite_prepare_protocol_setup_types(void) { pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew; - Py_TYPE(&pysqlite_PrepareProtocolType)= &PyType_Type; + Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type); return PyType_Ready(&pysqlite_PrepareProtocolType); } diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 047e3d3974c..600a52aa872 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -2835,11 +2835,11 @@ PyInit__testbuffer(void) if (m == NULL) return NULL; - Py_TYPE(&NDArray_Type) = &PyType_Type; + Py_SET_TYPE(&NDArray_Type, &PyType_Type); Py_INCREF(&NDArray_Type); PyModule_AddObject(m, "ndarray", (PyObject *)&NDArray_Type); - Py_TYPE(&StaticArray_Type) = &PyType_Type; + Py_SET_TYPE(&StaticArray_Type, &PyType_Type); Py_INCREF(&StaticArray_Type); PyModule_AddObject(m, "staticarray", (PyObject *)&StaticArray_Type); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 3bb1bf1e274..e6d30341cdf 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6605,9 +6605,9 @@ PyInit__testcapi(void) if (m == NULL) return NULL; - Py_TYPE(&_HashInheritanceTester_Type)=&PyType_Type; + Py_SET_TYPE(&_HashInheritanceTester_Type, &PyType_Type); - Py_TYPE(&test_structmembersType)=&PyType_Type; + Py_SET_TYPE(&test_structmembersType, &PyType_Type); Py_INCREF(&test_structmembersType); /* don't use a name starting with "test", since we don't want test_capi to automatically call this */ diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index edb56ab6e18..5065d28dafb 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2996,7 +2996,7 @@ array_modexec(PyObject *m) if (PyType_Ready(&Arraytype) < 0) return -1; - Py_TYPE(&PyArrayIter_Type) = &PyType_Type; + Py_SET_TYPE(&PyArrayIter_Type, &PyType_Type); Py_INCREF((PyObject *)&Arraytype); if (PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype) < 0) { diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 0cb472966d1..0dafb65c288 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -4750,14 +4750,16 @@ PyInit_itertools(void) NULL }; - Py_TYPE(&teedataobject_type) = &PyType_Type; + Py_SET_TYPE(&teedataobject_type, &PyType_Type); m = PyModule_Create(&itertoolsmodule); - if (m == NULL) + if (m == NULL) { return NULL; + } for (i=0 ; typelist[i] != NULL ; i++) { - if (PyType_Ready(typelist[i]) < 0) + if (PyType_Ready(typelist[i]) < 0) { return NULL; + } name = _PyType_Name(typelist[i]); Py_INCREF(typelist[i]); PyModule_AddObject(m, name, (PyObject *)typelist[i]); diff --git a/Modules/md5module.c b/Modules/md5module.c index f2c2d32cbe7..d783ae5a765 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -572,13 +572,15 @@ PyInit__md5(void) { PyObject *m; - Py_TYPE(&MD5type) = &PyType_Type; - if (PyType_Ready(&MD5type) < 0) + Py_SET_TYPE(&MD5type, &PyType_Type); + if (PyType_Ready(&MD5type) < 0) { return NULL; + } m = PyModule_Create(&_md5module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&MD5type); PyModule_AddObject(m, "MD5Type", (PyObject *)&MD5type); diff --git a/Modules/sha1module.c b/Modules/sha1module.c index 4d191c3c488..e066b880229 100644 --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -549,13 +549,15 @@ PyInit__sha1(void) { PyObject *m; - Py_TYPE(&SHA1type) = &PyType_Type; - if (PyType_Ready(&SHA1type) < 0) + Py_SET_TYPE(&SHA1type, &PyType_Type); + if (PyType_Ready(&SHA1type) < 0) { return NULL; + } m = PyModule_Create(&_sha1module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA1type); PyModule_AddObject(m, "SHA1Type", (PyObject *)&SHA1type); diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 245f4c04542..0e0c4461880 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -713,12 +713,14 @@ PyInit__sha256(void) { PyObject *m; - Py_TYPE(&SHA224type) = &PyType_Type; - if (PyType_Ready(&SHA224type) < 0) + Py_SET_TYPE(&SHA224type, &PyType_Type); + if (PyType_Ready(&SHA224type) < 0) { return NULL; - Py_TYPE(&SHA256type) = &PyType_Type; - if (PyType_Ready(&SHA256type) < 0) + } + Py_SET_TYPE(&SHA256type, &PyType_Type); + if (PyType_Ready(&SHA256type) < 0) { return NULL; + } m = PyModule_Create(&_sha256module); if (m == NULL) diff --git a/Modules/sha512module.c b/Modules/sha512module.c index 4045698387f..07bf2835188 100644 --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -778,16 +778,19 @@ PyInit__sha512(void) { PyObject *m; - Py_TYPE(&SHA384type) = &PyType_Type; - if (PyType_Ready(&SHA384type) < 0) + Py_SET_TYPE(&SHA384type, &PyType_Type); + if (PyType_Ready(&SHA384type) < 0) { return NULL; - Py_TYPE(&SHA512type) = &PyType_Type; - if (PyType_Ready(&SHA512type) < 0) + } + Py_SET_TYPE(&SHA512type, &PyType_Type); + if (PyType_Ready(&SHA512type) < 0) { return NULL; + } m = PyModule_Create(&_sha512module); - if (m == NULL) + if (m == NULL) { return NULL; + } Py_INCREF((PyObject *)&SHA384type); PyModule_AddObject(m, "SHA384Type", (PyObject *)&SHA384type); diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index e54f7a9b1c2..37b312396f9 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7100,7 +7100,7 @@ PyInit__socket(void) } #endif - Py_TYPE(&sock_type) = &PyType_Type; + Py_SET_TYPE(&sock_type, &PyType_Type); m = PyModule_Create(&socketmodule); if (m == NULL) return NULL; diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index e99d914b797..58b1bc2d0a1 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -1455,7 +1455,7 @@ PyInit_unicodedata(void) { PyObject *m, *v; - Py_TYPE(&UCD_Type) = &PyType_Type; + Py_SET_TYPE(&UCD_Type, &PyType_Type); m = PyModule_Create(&unicodedatamodule); if (!m) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 26e238cf05a..dfc5b196f18 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -221,7 +221,7 @@ float_dealloc(PyFloatObject *op) return; } numfree++; - Py_TYPE(op) = (struct _typeobject *)free_list; + Py_SET_TYPE(op, (PyTypeObject *)free_list); free_list = op; } else diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index da329b4fbac..0a593261c41 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -52,7 +52,7 @@ PyModuleDef_Init(struct PyModuleDef* def) if (def->m_base.m_index == 0) { max_module_number++; Py_SET_REFCNT(def, 1); - Py_TYPE(def) = &PyModuleDef_Type; + Py_SET_TYPE(def, &PyModuleDef_Type); def->m_base.m_index = max_module_number; } return (PyObject*)def; diff --git a/Objects/object.c b/Objects/object.c index 58065424881..503fb867802 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -144,7 +144,7 @@ PyObject_Init(PyObject *op, PyTypeObject *tp) return PyErr_NoMemory(); } - Py_TYPE(op) = tp; + Py_SET_TYPE(op, tp); if (PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(tp); } diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 5b8d5a228e5..e6a84b017aa 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4097,9 +4097,10 @@ object_set_class(PyObject *self, PyObject *value, void *closure) } if (compatible_for_assignment(oldto, newto, "__class__")) { - if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) + if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) { Py_INCREF(newto); - Py_TYPE(self) = newto; + } + Py_SET_TYPE(self, newto); if (oldto->tp_flags & Py_TPFLAGS_HEAPTYPE) Py_DECREF(oldto); return 0; @@ -5334,8 +5335,9 @@ PyType_Ready(PyTypeObject *type) NULL when type is &PyBaseObject_Type, and we know its ob_type is not NULL (it's initialized to &PyType_Type). But coverity doesn't know that. */ - if (Py_TYPE(type) == NULL && base != NULL) - Py_TYPE(type) = Py_TYPE(base); + if (Py_TYPE(type) == NULL && base != NULL) { + Py_SET_TYPE(type, Py_TYPE(base)); + } /* Initialize tp_bases */ bases = type->tp_bases; diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index d104b646f01..18c737e7e40 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -882,10 +882,12 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback) if (result != NULL) { PyWeakReference *prev; - if (PyCallable_Check(ob)) - Py_TYPE(result) = &_PyWeakref_CallableProxyType; - else - Py_TYPE(result) = &_PyWeakref_ProxyType; + if (PyCallable_Check(ob)) { + Py_SET_TYPE(result, &_PyWeakref_CallableProxyType); + } + else { + Py_SET_TYPE(result, &_PyWeakref_ProxyType); + } get_basic_refs(*list, &ref, &proxy); if (callback == NULL) { if (proxy != NULL) { From bec4186c67345f1e6cd3f8a531bc228f14d7ed7b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 09:20:22 +0100 Subject: [PATCH 320/380] bpo-35134: Create Include/cpython/listobject.h (GH-18395) Move listobject.h code surrounded by "#ifndef Py_LIMITED_API" to a new Include/cpython/listobject.h header file. Add cpython/ header files to Makefile.pre.in and pythoncore project of PCbuild. Add _PyList_CAST() macro. --- Include/cpython/listobject.h | 44 +++++++++++++++++++++++ Include/listobject.h | 58 ++++++++---------------------- Makefile.pre.in | 1 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 ++ 5 files changed, 64 insertions(+), 43 deletions(-) create mode 100644 Include/cpython/listobject.h diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h new file mode 100644 index 00000000000..4b6f2f7741c --- /dev/null +++ b/Include/cpython/listobject.h @@ -0,0 +1,44 @@ +#ifndef Py_CPYTHON_LISTOBJECT_H +# error "this header file must not be included directly" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject_VAR_HEAD + /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ + PyObject **ob_item; + + /* ob_item contains space for 'allocated' elements. The number + * currently in use is ob_size. + * Invariants: + * 0 <= ob_size <= allocated + * len(list) == ob_size + * ob_item == NULL implies ob_size == allocated == 0 + * list.sort() temporarily sets allocated to -1 to detect mutations. + * + * Items must normally not be NULL, except during construction when + * the list is not yet visible outside the function that builds it. + */ + Py_ssize_t allocated; +} PyListObject; + +PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); +PyAPI_FUNC(int) PyList_ClearFreeList(void); +PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); + +/* Macro, trading safety for speed */ + +/* Cast argument to PyTupleObject* type. */ +#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_GET_SIZE(op) Py_SIZE(_PyList_CAST(op)) +#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) + +#ifdef __cplusplus +} +#endif diff --git a/Include/listobject.h b/Include/listobject.h index baf94152792..34dfcf92ec9 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -1,16 +1,14 @@ +/* List object interface -/* List object interface */ + Another generally useful object type is a list of object pointers. + This is a mutable type: the list items can be changed, and items can be + added or removed. Out-of-range indices or non-list objects are ignored. -/* -Another generally useful object type is a list of object pointers. -This is a mutable type: the list items can be changed, and items can be -added or removed. Out-of-range indices or non-list objects are ignored. - -*** WARNING *** PyList_SetItem does not increment the new item's reference -count, but does decrement the reference count of the item it replaces, -if not nil. It does *decrement* the reference count if it is *not* -inserted in the list. Similarly, PyList_GetItem does not increment the -returned item's reference count. + WARNING: PyList_SetItem does not increment the new item's reference count, + but does decrement the reference count of the item it replaces, if not nil. + It does *decrement* the reference count if it is *not* inserted in the list. + Similarly, PyList_GetItem does not increment the returned item's reference + count. */ #ifndef Py_LISTOBJECT_H @@ -19,27 +17,6 @@ returned item's reference count. extern "C" { #endif -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ - PyObject **ob_item; - - /* ob_item contains space for 'allocated' elements. The number - * currently in use is ob_size. - * Invariants: - * 0 <= ob_size <= allocated - * len(list) == ob_size - * ob_item == NULL implies ob_size == allocated == 0 - * list.sort() temporarily sets allocated to -1 to detect mutations. - * - * Items must normally not be NULL, except during construction when - * the list is not yet visible outside the function that builds it. - */ - Py_ssize_t allocated; -} PyListObject; -#endif - PyAPI_DATA(PyTypeObject) PyList_Type; PyAPI_DATA(PyTypeObject) PyListIter_Type; PyAPI_DATA(PyTypeObject) PyListRevIter_Type; @@ -50,28 +27,23 @@ PyAPI_DATA(PyTypeObject) PyListRevIter_Type; PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetItem(PyObject *, Py_ssize_t); PyAPI_FUNC(int) PyList_SetItem(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Insert(PyObject *, Py_ssize_t, PyObject *); PyAPI_FUNC(int) PyList_Append(PyObject *, PyObject *); + PyAPI_FUNC(PyObject *) PyList_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t); PyAPI_FUNC(int) PyList_SetSlice(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *); + PyAPI_FUNC(int) PyList_Sort(PyObject *); PyAPI_FUNC(int) PyList_Reverse(PyObject *); PyAPI_FUNC(PyObject *) PyList_AsTuple(PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyList_Extend(PyListObject *, PyObject *); -PyAPI_FUNC(int) PyList_ClearFreeList(void); -PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); -#endif - -/* Macro, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyList_GET_ITEM(op, i) (((PyListObject *)(op))->ob_item[i]) -#define PyList_SET_ITEM(op, i, v) (((PyListObject *)(op))->ob_item[i] = (v)) -#define PyList_GET_SIZE(op) (assert(PyList_Check(op)),Py_SIZE(op)) -#define _PyList_ITEMS(op) (((PyListObject *)(op))->ob_item) +# define Py_CPYTHON_LISTOBJECT_H +# include "cpython/listobject.h" +# undef Py_CPYTHON_LISTOBJECT_H #endif #ifdef __cplusplus diff --git a/Makefile.pre.in b/Makefile.pre.in index d430dc30bb6..510f227ed4d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1063,6 +1063,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/import.h \ $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ + $(srcdir)/Include/cpython/listobject.h \ $(srcdir)/Include/cpython/object.h \ $(srcdir)/Include/cpython/objimpl.h \ $(srcdir)/Include/cpython/pyerrors.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index cfab2fa4e18..36a27f46740 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -132,6 +132,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index ba1839f8a38..0301557b3e5 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -99,6 +99,9 @@ Include + + Include + Include From c65b320a95784d2b2133926921d67ac439259e9f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 11:18:33 +0100 Subject: [PATCH 321/380] bpo-39573: Use Py_TYPE() macro in object.c (GH-18398) Replace direct acccess to PyVarObject.ob_size with usage of the Py_SIZE() macro. --- Objects/object.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index 503fb867802..ff6c497900c 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1041,13 +1041,11 @@ _PyObject_GetDictPtr(PyObject *obj) if (dictoffset == 0) return NULL; if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); dictoffset += (long)size; _PyObject_ASSERT(obj, dictoffset > 0); @@ -1219,13 +1217,11 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name, dictoffset = tp->tp_dictoffset; if (dictoffset != 0) { if (dictoffset < 0) { - Py_ssize_t tsize; - size_t size; - - tsize = ((PyVarObject *)obj)->ob_size; - if (tsize < 0) + Py_ssize_t tsize = Py_SIZE(obj); + if (tsize < 0) { tsize = -tsize; - size = _PyObject_VAR_SIZE(tp, tsize); + } + size_t size = _PyObject_VAR_SIZE(tp, tsize); _PyObject_ASSERT(obj, size <= PY_SSIZE_T_MAX); dictoffset += (Py_ssize_t)size; From 877ea88934a5164be4d9f15207694fad4173d87d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 11:22:54 +0100 Subject: [PATCH 322/380] bpo-38644: Add Py_EnterRecursiveCall() to python3.def (GH-18399) Add Py_EnterRecursiveCall and Py_LeaveRecursiveCall functions to python3.def. --- PC/python3.def | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PC/python3.def b/PC/python3.def index 4689b777a69..c7aed8789cf 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -727,6 +727,7 @@ EXPORTS Py_DecodeLocale=python39.Py_DecodeLocale Py_EncodeLocale=python39.Py_EncodeLocale Py_EndInterpreter=python39.Py_EndInterpreter + Py_EnterRecursiveCall=python39.Py_EnterRecursiveCall Py_Exit=python39.Py_Exit Py_FatalError=python39.Py_FatalError Py_FileSystemDefaultEncodeErrors=python39.Py_FileSystemDefaultEncodeErrors DATA @@ -750,6 +751,7 @@ EXPORTS Py_Initialize=python39.Py_Initialize Py_InitializeEx=python39.Py_InitializeEx Py_IsInitialized=python39.Py_IsInitialized + Py_LeaveRecursiveCall=python39.Py_LeaveRecursiveCall Py_Main=python39.Py_Main Py_MakePendingCalls=python39.Py_MakePendingCalls Py_NewInterpreter=python39.Py_NewInterpreter From b10dc3e7a11fcdb97e285882eba6da92594f90f9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 12:05:12 +0100 Subject: [PATCH 323/380] bpo-39573: Add Py_SET_SIZE() function (GH-18400) Add Py_SET_SIZE() function to set the size of an object. --- Doc/c-api/structures.rst | 7 +++++++ Include/cpython/objimpl.h | 2 +- Include/object.h | 5 +++++ .../next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst | 1 + Objects/object.c | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 8a1431c2de7..75e2383beb2 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -101,6 +101,13 @@ the definition of all other Python objects. (((PyVarObject*)(o))->ob_size) +.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) + + Set the object *o* size of *size*. + + .. versionadded:: 3.9 + + .. c:macro:: PyObject_HEAD_INIT(type) This is a macro which expands to initialization values for a new diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index ebb3e234e36..8e3c964cf44 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -30,7 +30,7 @@ static inline PyVarObject* _PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) { assert(op != NULL); - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); PyObject_INIT((PyObject *)op, typeobj); return op; } diff --git a/Include/object.h b/Include/object.h index eb887f4c6eb..68200f7666f 100644 --- a/Include/object.h +++ b/Include/object.h @@ -133,6 +133,11 @@ static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) +static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t refcnt) { + ob->ob_size = refcnt; +} +#define Py_SET_SIZE(ob, refcnt) _Py_SET_SIZE(_PyVarObject_CAST(ob), refcnt) + /* Type objects contain a string containing the type name (to help somewhat diff --git a/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst b/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst new file mode 100644 index 00000000000..d84cddc5763 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-07-10-41-53.bpo-39573.EG9VDI.rst @@ -0,0 +1 @@ +Add :c:func:`Py_SET_SIZE` function to set the size of an object. diff --git a/Objects/object.c b/Objects/object.c index ff6c497900c..81de3b82530 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -160,7 +160,7 @@ PyObject_InitVar(PyVarObject *op, PyTypeObject *tp, Py_ssize_t size) return (PyVarObject *) PyErr_NoMemory(); } - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); PyObject_Init((PyObject *)op, tp); return op; } From de6f38db4859f7b8fe4da4556f06c52675fff24a Mon Sep 17 00:00:00 2001 From: Michael Felt Date: Fri, 7 Feb 2020 18:56:16 +0100 Subject: [PATCH 324/380] bpo-39502: Fix 64-bit Python PyTime_localtime() on AIX (GH-18285) Fix time.localtime() on 64-bit AIX to support years before 1902 and after 2038. --- .../Core and Builtins/2020-01-30-14-36-31.bpo-39502.IJu0rl.rst | 2 ++ Python/pytime.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-30-14-36-31.bpo-39502.IJu0rl.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-30-14-36-31.bpo-39502.IJu0rl.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-30-14-36-31.bpo-39502.IJu0rl.rst new file mode 100644 index 00000000000..93b3639c80c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-30-14-36-31.bpo-39502.IJu0rl.rst @@ -0,0 +1,2 @@ +Fix :func:`time.localtime` on 64-bit AIX to support years before 1902 and after 2038. +Patch by M Felt. diff --git a/Python/pytime.c b/Python/pytime.c index 54ddfc952b8..9b2b74af5c0 100644 --- a/Python/pytime.c +++ b/Python/pytime.c @@ -1059,7 +1059,7 @@ _PyTime_localtime(time_t t, struct tm *tm) return 0; #else /* !MS_WINDOWS */ -#ifdef _AIX +#if defined(_AIX) && (SIZEOF_TIME_T < 8) /* bpo-34373: AIX does not return NULL if t is too small or too large */ if (t < -2145916800 /* 1902-01-01 */ || t > 2145916800 /* 2038-01-01 */) { From 60ac6ed5579f6666130fc264d3b748ee9575e3aa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 23:18:08 +0100 Subject: [PATCH 325/380] bpo-39573: Use Py_SET_SIZE() function (GH-18402) Replace direct acccess to PyVarObject.ob_size with usage of the Py_SET_SIZE() function. --- Modules/_asynciomodule.c | 2 +- Modules/_collectionsmodule.c | 16 ++++----- Modules/_decimal/_decimal.c | 4 +-- Modules/_pickle.c | 24 +++++++------ Modules/arraymodule.c | 10 +++--- Modules/gcmodule.c | 2 +- Objects/bytearrayobject.c | 10 +++--- Objects/bytesobject.c | 2 +- Objects/listobject.c | 26 +++++++------- Objects/longobject.c | 68 ++++++++++++++++++++---------------- Objects/odictobject.c | 5 +-- Objects/stringlib/split.h | 2 +- Objects/structseq.c | 2 +- Python/ceval.c | 2 +- Python/hamt.c | 4 +-- Python/marshal.c | 2 +- 16 files changed, 95 insertions(+), 86 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 70da40a8a3b..2e293757fb7 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1007,7 +1007,7 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn) } if (j < len) { - Py_SIZE(newlist) = j; + Py_SET_SIZE(newlist, j); } j = PyList_GET_SIZE(newlist); len = PyList_GET_SIZE(self->fut_callbacks); diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 97d7de47d2d..10030606711 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -172,7 +172,7 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds) MARK_END(b->rightlink); assert(BLOCKLEN >= 2); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -196,7 +196,7 @@ deque_pop(dequeobject *deque, PyObject *unused) } item = deque->rightblock->data[deque->rightindex]; deque->rightindex--; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->rightindex < 0) { @@ -234,7 +234,7 @@ deque_popleft(dequeobject *deque, PyObject *unused) assert(deque->leftblock != NULL); item = deque->leftblock->data[deque->leftindex]; deque->leftindex++; - Py_SIZE(deque)--; + Py_SET_SIZE(deque, Py_SIZE(deque) - 1); deque->state++; if (deque->leftindex == BLOCKLEN) { @@ -287,7 +287,7 @@ deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->rightlink); deque->rightindex = -1; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->rightindex++; deque->rightblock->data[deque->rightindex] = item; if (NEEDS_TRIM(deque, maxlen)) { @@ -324,7 +324,7 @@ deque_appendleft_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen) MARK_END(b->leftlink); deque->leftindex = BLOCKLEN; } - Py_SIZE(deque)++; + Py_SET_SIZE(deque, Py_SIZE(deque) + 1); deque->leftindex--; deque->leftblock->data[deque->leftindex] = item; if (NEEDS_TRIM(deque, deque->maxlen)) { @@ -597,7 +597,7 @@ deque_clear(dequeobject *deque) /* Set the deque to be empty using the newly allocated block */ MARK_END(b->leftlink); MARK_END(b->rightlink); - Py_SIZE(deque) = 0; + Py_SET_SIZE(deque, 0); deque->leftblock = b; deque->rightblock = b; deque->leftindex = CENTER + 1; @@ -680,7 +680,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) if (deque->rightindex == BLOCKLEN - 1) { block *b = newblock(); if (b == NULL) { - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); return NULL; } b->leftlink = deque->rightblock; @@ -700,7 +700,7 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n) deque->rightblock->data[deque->rightindex] = item; } } - Py_SIZE(deque) += i; + Py_SET_SIZE(deque, Py_SIZE(deque) + i); Py_INCREF(deque); return (PyObject *)deque; } diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 75a8ddba1fe..0fbbb73a6bd 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -3253,9 +3253,9 @@ dec_as_long(PyObject *dec, PyObject *context, int round) i--; } - Py_SIZE(pylong) = i; + Py_SET_SIZE(pylong, i); if (mpd_isnegative(x) && !mpd_iszero(x)) { - Py_SIZE(pylong) = -i; + Py_SET_SIZE(pylong, -i); } mpd_del(x); diff --git a/Modules/_pickle.c b/Modules/_pickle.c index f67fb6a65c3..5f11fe5c88c 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -461,7 +461,7 @@ Pdata_New(void) if (!(self = PyObject_New(Pdata, &Pdata_Type))) return NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->mark_set = 0; self->fence = 0; self->allocated = 8; @@ -488,7 +488,7 @@ Pdata_clear(Pdata *self, Py_ssize_t clearto) while (--i >= clearto) { Py_CLEAR(self->data[i]); } - Py_SIZE(self) = clearto; + Py_SET_SIZE(self, clearto); return 0; } @@ -539,7 +539,8 @@ Pdata_pop(Pdata *self) Pdata_stack_underflow(self); return NULL; } - return self->data[--Py_SIZE(self)]; + Py_SET_SIZE(self, Py_SIZE(self) - 1); + return self->data[Py_SIZE(self)]; } #define PDATA_POP(D, V) do { (V) = Pdata_pop((D)); } while (0) @@ -549,7 +550,8 @@ Pdata_push(Pdata *self, PyObject *obj) if (Py_SIZE(self) == self->allocated && Pdata_grow(self) < 0) { return -1; } - self->data[Py_SIZE(self)++] = obj; + self->data[Py_SIZE(self)] = obj; + Py_SET_SIZE(self, Py_SIZE(self) + 1); return 0; } @@ -579,7 +581,7 @@ Pdata_poptuple(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyTuple_SET_ITEM(tuple, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return tuple; } @@ -596,7 +598,7 @@ Pdata_poplist(Pdata *self, Py_ssize_t start) for (i = start, j = 0; j < len; i++, j++) PyList_SET_ITEM(list, j, self->data[i]); - Py_SIZE(self) = start; + Py_SET_SIZE(self, start); return list; } @@ -6134,7 +6136,7 @@ load_pop(UnpicklerObject *self) else { len--; Py_DECREF(self->stack->data[len]); - Py_SIZE(self->stack) = len; + Py_SET_SIZE(self->stack, len); } return 0; } @@ -6495,13 +6497,13 @@ do_append(UnpicklerObject *self, Py_ssize_t x) result = _Pickle_FastCall(append_func, value); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = x; + Py_SET_SIZE(self->stack, x); Py_DECREF(append_func); } } @@ -6623,12 +6625,12 @@ load_additems(UnpicklerObject *self) result = _Pickle_FastCall(add_func, item); if (result == NULL) { Pdata_clear(self->stack, i + 1); - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); return -1; } Py_DECREF(result); } - Py_SIZE(self->stack) = mark; + Py_SET_SIZE(self->stack, mark); } return 0; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 5065d28dafb..eeda714d6a9 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -128,14 +128,14 @@ array_resize(arrayobject *self, Py_ssize_t newsize) if (self->allocated >= newsize && Py_SIZE(self) < newsize + 16 && self->ob_item != NULL) { - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } if (newsize == 0) { PyMem_FREE(self->ob_item); self->ob_item = NULL; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->allocated = 0; return 0; } @@ -165,7 +165,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = _new_size; return 0; } @@ -593,7 +593,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des op->ob_descr = descr; op->allocated = size; op->weakreflist = NULL; - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); if (size <= 0) { op->ob_item = NULL; } @@ -2696,7 +2696,7 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } self->ob_item = item; - Py_SIZE(self) = n / sizeof(Py_UNICODE); + Py_SET_SIZE(self, n / sizeof(Py_UNICODE)); memcpy(item, ustr, n); self->allocated = Py_SIZE(self); } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 7e9eae50a8e..5673f602837 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2294,7 +2294,7 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) if (g == NULL) return (PyVarObject *)PyErr_NoMemory(); op = (PyVarObject *) FROM_GC(g); - Py_SIZE(op) = nitems; + Py_SET_SIZE(op, nitems); return op; } diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index a019b4905a8..b2808c05b40 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -148,7 +148,7 @@ PyByteArray_FromStringAndSize(const char *bytes, Py_ssize_t size) memcpy(new->ob_bytes, bytes, size); new->ob_bytes[size] = '\0'; /* Trailing null byte */ } - Py_SIZE(new) = size; + Py_SET_SIZE(new, size); new->ob_alloc = alloc; new->ob_start = new->ob_bytes; new->ob_exports = 0; @@ -206,7 +206,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } else { /* Minor downsize; quick exit */ - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); PyByteArray_AS_STRING(self)[size] = '\0'; /* Trailing null */ return 0; } @@ -246,7 +246,7 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t requested_size) } obj->ob_bytes = obj->ob_start = sval; - Py_SIZE(self) = size; + Py_SET_SIZE(self, size); obj->ob_alloc = alloc; obj->ob_bytes[size] = '\0'; /* Trailing null byte */ @@ -498,7 +498,7 @@ bytearray_setslice_linear(PyByteArrayObject *self, } /* memmove() removed bytes, the bytearray object cannot be restored in its previous state. */ - Py_SIZE(self) += growth; + Py_SET_SIZE(self, Py_SIZE(self) + growth); res = -1; } buf = PyByteArray_AS_STRING(self); @@ -886,7 +886,7 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) /* Append the byte */ if (Py_SIZE(self) + 1 < self->ob_alloc) { - Py_SIZE(self)++; + Py_SET_SIZE(self, Py_SIZE(self) + 1); PyByteArray_AS_STRING(self)[Py_SIZE(self)] = '\0'; } else if (PyByteArray_Resize((PyObject *)self, Py_SIZE(self)+1) < 0) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 4edd93d4b8d..e139bed71bf 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2963,7 +2963,7 @@ _PyBytes_Resize(PyObject **pv, Py_ssize_t newsize) } _Py_NewReference(*pv); sv = (PyBytesObject *) *pv; - Py_SIZE(sv) = newsize; + Py_SET_SIZE(sv, newsize); sv->ob_sval[newsize] = '\0'; sv->ob_shash = -1; /* invalidate cached hash value */ return 0; diff --git a/Objects/listobject.c b/Objects/listobject.c index d83e3cfcf1a..a406e70694a 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -45,7 +45,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) */ if (allocated >= newsize && newsize >= (allocated >> 1)) { assert(self->ob_item != NULL || newsize == 0); - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); return 0; } @@ -73,7 +73,7 @@ list_resize(PyListObject *self, Py_ssize_t newsize) return -1; } self->ob_item = items; - Py_SIZE(self) = newsize; + Py_SET_SIZE(self, newsize); self->allocated = new_allocated; return 0; } @@ -156,7 +156,7 @@ PyList_New(Py_ssize_t size) return PyErr_NoMemory(); } } - Py_SIZE(op) = size; + Py_SET_SIZE(op, size); op->allocated = size; _PyObject_GC_TRACK(op); return (PyObject *) op; @@ -457,7 +457,7 @@ list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = len; + Py_SET_SIZE(np, len); return (PyObject *)np; } @@ -518,7 +518,7 @@ list_concat(PyListObject *a, PyObject *bb) Py_INCREF(v); dest[i] = v; } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *)np; #undef b } @@ -561,7 +561,7 @@ list_repeat(PyListObject *a, Py_ssize_t n) } } } - Py_SIZE(np) = size; + Py_SET_SIZE(np, size); return (PyObject *) np; } @@ -574,7 +574,7 @@ _list_clear(PyListObject *a) /* Because XDECREF can recursively invoke operations on this list, we make it empty first. */ i = Py_SIZE(a); - Py_SIZE(a) = 0; + Py_SET_SIZE(a, 0); a->ob_item = NULL; a->allocated = 0; while (--i >= 0) { @@ -913,7 +913,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (list_resize(self, mn) < 0) goto error; /* Make the list sane again. */ - Py_SIZE(self) = m; + Py_SET_SIZE(self, m); } /* Run iterator to exhaustion. */ @@ -931,7 +931,7 @@ list_extend(PyListObject *self, PyObject *iterable) if (Py_SIZE(self) < self->allocated) { /* steals ref */ PyList_SET_ITEM(self, Py_SIZE(self), item); - ++Py_SIZE(self); + Py_SET_SIZE(self, Py_SIZE(self) + 1); } else { int status = app1(self, item); @@ -2204,7 +2204,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) saved_ob_size = Py_SIZE(self); saved_ob_item = self->ob_item; saved_allocated = self->allocated; - Py_SIZE(self) = 0; + Py_SET_SIZE(self, 0); self->ob_item = NULL; self->allocated = -1; /* any operation will reset it to >= 0 */ @@ -2421,7 +2421,7 @@ fail: keyfunc_fail: final_ob_item = self->ob_item; i = Py_SIZE(self); - Py_SIZE(self) = saved_ob_size; + Py_SET_SIZE(self, saved_ob_size); self->ob_item = saved_ob_item; self->allocated = saved_allocated; if (final_ob_item != NULL) { @@ -2811,7 +2811,7 @@ list_subscript(PyListObject* self, PyObject* item) Py_INCREF(it); dest[i] = it; } - Py_SIZE(result) = slicelength; + Py_SET_SIZE(result, slicelength); return result; } } @@ -2904,7 +2904,7 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) sizeof(PyObject *)); } - Py_SIZE(self) -= slicelength; + Py_SET_SIZE(self, Py_SIZE(self) - slicelength); res = list_resize(self, Py_SIZE(self)); for (i = 0; i < slicelength; i++) { diff --git a/Objects/longobject.c b/Objects/longobject.c index 67cbc7b27e3..b4d0b0575bc 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -73,7 +73,7 @@ _PyLong_Negate(PyLongObject **x_p) x = (PyLongObject *)*x_p; if (Py_REFCNT(x) == 1) { - Py_SIZE(x) = -Py_SIZE(x); + Py_SET_SIZE(x, -Py_SIZE(x)); return; } @@ -112,8 +112,9 @@ long_normalize(PyLongObject *v) while (i > 0 && v->ob_digit[i-1] == 0) --i; - if (i != j) - Py_SIZE(v) = (Py_SIZE(v) < 0) ? -(i) : i; + if (i != j) { + Py_SET_SIZE(v, (Py_SIZE(v) < 0) ? -(i) : i); + } return v; } @@ -281,9 +282,10 @@ _PyLong_Copy(PyLongObject *src) } result = _PyLong_New(i); if (result != NULL) { - Py_SIZE(result) = Py_SIZE(src); - while (--i >= 0) + Py_SET_SIZE(result, Py_SIZE(src)); + while (--i >= 0) { result->ob_digit[i] = src->ob_digit[i]; + } } return (PyObject *)result; } @@ -318,7 +320,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> PyLong_SHIFT)) { v = _PyLong_New(1); if (v) { - Py_SIZE(v) = sign; + Py_SET_SIZE(v, sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival, unsigned long, digit); } @@ -330,7 +332,7 @@ PyLong_FromLong(long ival) if (!(abs_ival >> 2*PyLong_SHIFT)) { v = _PyLong_New(2); if (v) { - Py_SIZE(v) = 2*sign; + Py_SET_SIZE(v, 2 * sign); v->ob_digit[0] = Py_SAFE_DOWNCAST( abs_ival & PyLong_MASK, unsigned long, digit); v->ob_digit[1] = Py_SAFE_DOWNCAST( @@ -349,7 +351,7 @@ PyLong_FromLong(long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = ndigits*sign; + Py_SET_SIZE(v, ndigits * sign); t = abs_ival; while (t) { *p++ = Py_SAFE_DOWNCAST( @@ -445,8 +447,9 @@ PyLong_FromDouble(double dval) frac = frac - (double)bits; frac = ldexp(frac, PyLong_SHIFT); } - if (neg) - Py_SIZE(v) = -(Py_SIZE(v)); + if (neg) { + Py_SET_SIZE(v, -(Py_SIZE(v))); + } return (PyObject *)v; } @@ -930,7 +933,7 @@ _PyLong_FromByteArray(const unsigned char* bytes, size_t n, } } - Py_SIZE(v) = is_signed ? -idigit : idigit; + Py_SET_SIZE(v, is_signed ? -idigit : idigit); return (PyObject *)long_normalize(v); } @@ -1158,7 +1161,7 @@ PyLong_FromLongLong(long long ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -1201,7 +1204,7 @@ PyLong_FromSsize_t(Py_ssize_t ival) v = _PyLong_New(ndigits); if (v != NULL) { digit *p = v->ob_digit; - Py_SIZE(v) = negative ? -ndigits : ndigits; + Py_SET_SIZE(v, negative ? -ndigits : ndigits); t = abs_ival; while (t) { *p++ = (digit)(t & PyLong_MASK); @@ -2443,7 +2446,7 @@ digit beyond the first. if (z == NULL) { return NULL; } - Py_SIZE(z) = 0; + Py_SET_SIZE(z, 0); /* `convwidth` consecutive input digits are treated as a single * digit in base `convmultmax`. @@ -2493,7 +2496,7 @@ digit beyond the first. assert(c < PyLong_BASE); if (Py_SIZE(z) < size_z) { *pz = (digit)c; - ++Py_SIZE(z); + Py_SET_SIZE(z, Py_SIZE(z) + 1); } else { PyLongObject *tmp; @@ -2532,7 +2535,7 @@ digit beyond the first. goto onError; } if (sign < 0) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } while (*str && Py_ISSPACE(*str)) { str++; @@ -3165,7 +3168,7 @@ x_sub(PyLongObject *a, PyLongObject *b) } assert(borrow == 0); if (sign < 0) { - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } return maybe_small_long(long_normalize(z)); } @@ -3189,7 +3192,7 @@ long_add(PyLongObject *a, PyLongObject *b) That also means z is not an element of small_ints, so negating it in-place is safe. */ assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } } else @@ -3222,7 +3225,7 @@ long_sub(PyLongObject *a, PyLongObject *b) z = x_add(a, b); if (z != NULL) { assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); } } } @@ -3615,7 +3618,7 @@ k_lopsided_mul(PyLongObject *a, PyLongObject *b) /* Multiply the next slice of b by a. */ memcpy(bslice->ob_digit, b->ob_digit + nbdone, nbtouse * sizeof(digit)); - Py_SIZE(bslice) = nbtouse; + Py_SET_SIZE(bslice, nbtouse); product = k_mul(a, bslice); if (product == NULL) goto fail; @@ -4431,7 +4434,7 @@ long_neg(PyLongObject *v) return PyLong_FromLong(-MEDIUM_VALUE(v)); z = (PyLongObject *)_PyLong_Copy(v); if (z != NULL) - Py_SIZE(z) = -(Py_SIZE(v)); + Py_SET_SIZE(z, -(Py_SIZE(v))); return (PyObject *)z; } @@ -4576,7 +4579,7 @@ long_lshift1(PyLongObject *a, Py_ssize_t wordshift, digit remshift) return NULL; if (Py_SIZE(a) < 0) { assert(Py_REFCNT(z) == 1); - Py_SIZE(z) = -Py_SIZE(z); + Py_SET_SIZE(z, -Py_SIZE(z)); } for (i = 0; i < wordshift; i++) z->ob_digit[i] = 0; @@ -4760,7 +4763,7 @@ long_bitwise(PyLongObject *a, /* Complement result if negative. */ if (negz) { - Py_SIZE(z) = -(Py_SIZE(z)); + Py_SET_SIZE(z, -(Py_SIZE(z))); z->ob_digit[size_z] = PyLong_MASK; v_complement(z->ob_digit, z->ob_digit, size_z+1); } @@ -4907,8 +4910,9 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) T = -A; A = -B; B = T; T = -C; C = -D; D = T; } - if (c != NULL) - Py_SIZE(c) = size_a; + if (c != NULL) { + Py_SET_SIZE(c, size_a); + } else if (Py_REFCNT(a) == 1) { Py_INCREF(a); c = a; @@ -4920,12 +4924,13 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg) goto error; } - if (d != NULL) - Py_SIZE(d) = size_a; + if (d != NULL) { + Py_SET_SIZE(d, size_a); + } else if (Py_REFCNT(b) == 1 && size_a <= alloc_b) { Py_INCREF(b); d = b; - Py_SIZE(d) = size_a; + Py_SET_SIZE(d, size_a); } else { alloc_b = size_a; @@ -5105,9 +5110,10 @@ long_subtype_new(PyTypeObject *type, PyObject *x, PyObject *obase) return NULL; } assert(PyLong_Check(newobj)); - Py_SIZE(newobj) = Py_SIZE(tmp); - for (i = 0; i < n; i++) + Py_SET_SIZE(newobj, Py_SIZE(tmp)); + for (i = 0; i < n; i++) { newobj->ob_digit[i] = tmp->ob_digit[i]; + } Py_DECREF(tmp); return (PyObject *)newobj; } @@ -5744,7 +5750,7 @@ _PyLong_Init(PyThreadState *tstate) return -1; } - Py_SIZE(v) = size; + Py_SET_SIZE(v, size); v->ob_digit[0] = (digit)abs(ival); tstate->interp->small_ints[i] = v; diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 45e089be287..f412220e8cc 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1417,8 +1417,9 @@ odict_repr(PyODictObject *self) } count++; } - if (count < PyList_GET_SIZE(pieces)) - Py_SIZE(pieces) = count; + if (count < PyList_GET_SIZE(pieces)) { + Py_SET_SIZE(pieces, count); + } } else { PyObject *items = _PyObject_CallMethodIdNoArgs((PyObject *)self, diff --git a/Objects/stringlib/split.h b/Objects/stringlib/split.h index 31f77a77243..068047f9874 100644 --- a/Objects/stringlib/split.h +++ b/Objects/stringlib/split.h @@ -48,7 +48,7 @@ /* Always force the list to the expected size. */ -#define FIX_PREALLOC_SIZE(list) Py_SIZE(list) = count +#define FIX_PREALLOC_SIZE(list) Py_SET_SIZE(list, count) Py_LOCAL_INLINE(PyObject *) STRINGLIB(split_whitespace)(PyObject* str_obj, diff --git a/Objects/structseq.c b/Objects/structseq.c index c86fbe50b97..1865e2461a2 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -47,7 +47,7 @@ PyStructSequence_New(PyTypeObject *type) return NULL; /* Hack the size of the variable object, so invisible fields don't appear to Python code. */ - Py_SIZE(obj) = VISIBLE_SIZE_TP(type); + Py_SET_SIZE(obj, VISIBLE_SIZE_TP(type)); for (i = 0; i < size; i++) obj->ob_item[i] = NULL; diff --git a/Python/ceval.c b/Python/ceval.c index c36a38e2113..deba99ed7ac 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4436,7 +4436,7 @@ unpack_iterable(PyThreadState *tstate, PyObject *v, *--sp = PyList_GET_ITEM(l, ll - j); } /* Resize the list. */ - Py_SIZE(l) = ll - argcntafter; + Py_SET_SIZE(l, ll - argcntafter); Py_DECREF(it); return 1; diff --git a/Python/hamt.c b/Python/hamt.c index f5586eec5b0..a0fee4c7a63 100644 --- a/Python/hamt.c +++ b/Python/hamt.c @@ -551,7 +551,7 @@ hamt_node_bitmap_new(Py_ssize_t size) return NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); for (i = 0; i < size; i++) { node->b_array[i] = NULL; @@ -1288,7 +1288,7 @@ hamt_node_collision_new(int32_t hash, Py_ssize_t size) node->c_array[i] = NULL; } - Py_SIZE(node) = size; + Py_SET_SIZE(node, size); node->c_hash = hash; _PyObject_GC_TRACK(node); diff --git a/Python/marshal.c b/Python/marshal.c index 8d441a4f081..04a8dc59898 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -813,7 +813,7 @@ r_PyLong(RFILE *p) if (ob == NULL) return NULL; - Py_SIZE(ob) = n > 0 ? size : -size; + Py_SET_SIZE(ob, n > 0 ? size : -size); for (i = 0; i < size-1; i++) { d = 0; From dc7a50d73a3d16918529669ff7b8783c08cff090 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 7 Feb 2020 23:42:51 +0100 Subject: [PATCH 326/380] bpo-39350: Fix fractions for int subclasses (GH-18375) Fix regression in fractions.Fraction if the numerator and/or the denominator is an int subclass. The math.gcd() function is now used to normalize the numerator and denominator. math.gcd() always return a int type. Previously, the GCD type depended on numerator and denominator. --- Doc/library/fractions.rst | 4 ++++ Lib/fractions.py | 10 +++------ Lib/test/test_fractions.py | 22 +++++++++++++++++++ .../2020-02-06-13-34-52.bpo-39350.wRwup1.rst | 5 +++++ 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-06-13-34-52.bpo-39350.wRwup1.rst diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index d3a42762e3f..a4d006eb58f 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -84,6 +84,10 @@ another rational number, or from a string. The :class:`Fraction` constructor now accepts :class:`float` and :class:`decimal.Decimal` instances. + .. versionchanged:: 3.9 + The :func:`math.gcd` function is now used to normalize the *numerator* + and *denominator*. :func:`math.gcd` always return a :class:`int` type. + Previously, the GCD type depended on *numerator* and *denominator*. .. attribute:: numerator diff --git a/Lib/fractions.py b/Lib/fractions.py index f5a854414c1..de3e23b7592 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -155,13 +155,9 @@ class Fraction(numbers.Rational): if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator) if _normalize: - if type(numerator) is int is type(denominator): - # *very* normal case - g = math.gcd(numerator, denominator) - if denominator < 0: - g = -g - else: - g = _gcd(numerator, denominator) + g = math.gcd(numerator, denominator) + if denominator < 0: + g = -g numerator //= g denominator //= g self._numerator = numerator diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 4649a34bcc1..c748533c791 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -703,6 +703,28 @@ class FractionTest(unittest.TestCase): r = F(13, 7) self.assertRaises(AttributeError, setattr, r, 'a', 10) + def test_int_subclass(self): + class myint(int): + def __mul__(self, other): + return type(self)(int(self) * int(other)) + def __floordiv__(self, other): + return type(self)(int(self) // int(other)) + def __mod__(self, other): + x = type(self)(int(self) % int(other)) + return x + @property + def numerator(self): + return type(self)(int(self)) + @property + def denominator(self): + return type(self)(1) + + f = fractions.Fraction(myint(1 * 3), myint(2 * 3)) + self.assertEqual(f.numerator, 1) + self.assertEqual(f.denominator, 2) + self.assertEqual(type(f.numerator), myint) + self.assertEqual(type(f.denominator), myint) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2020-02-06-13-34-52.bpo-39350.wRwup1.rst b/Misc/NEWS.d/next/Library/2020-02-06-13-34-52.bpo-39350.wRwup1.rst new file mode 100644 index 00000000000..1a09358082e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-06-13-34-52.bpo-39350.wRwup1.rst @@ -0,0 +1,5 @@ +Fix regression in :class:`fractions.Fraction` if the numerator and/or the +denominator is an :class:`int` subclass. The :func:`math.gcd` function is now +used to normalize the *numerator* and *denominator*. :func:`math.gcd` always +return a :class:`int` type. Previously, the GCD type depended on *numerator* +and *denominator*. From d2e1098641f98594702ef29049c3c4a3f394786f Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Sat, 8 Feb 2020 00:36:32 +0100 Subject: [PATCH 327/380] bpo-39579: Fix Attribute end_col_offset to point at the current node (GH-18405) --- Lib/test/test_ast.py | 8 ++++++++ .../2020-02-07-15-18-35.bpo-39579.itNmC0.rst | 1 + Python/ast.c | 5 +++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-07-15-18-35.bpo-39579.itNmC0.rst diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index aa0d214b8a6..6d1e4199322 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -142,6 +142,8 @@ exec_tests = [ "@deco1\n@deco2()\n@deco3(1)\nclass C: pass", # Decorator with generator argument "@deco(a for a in b)\ndef f(): pass", + # Decorator with attribute + "@a.b.c\ndef f(): pass", # Simple assignment expression "(a := 1)", # Positional-only arguments @@ -616,6 +618,11 @@ class AST_Tests(unittest.TestCase): self.assertEqual(grandchild_binop.end_col_offset, 3) self.assertEqual(grandchild_binop.end_lineno, 1) + def test_issue39579_dotted_name_end_col_offset(self): + tree = ast.parse('@a.b.c\ndef f(): pass') + attr_b = tree.body[0].decorator_list[0].value + self.assertEqual(attr_b.end_col_offset, 4) + class ASTHelpers_Test(unittest.TestCase): maxDiff = None @@ -1903,6 +1910,7 @@ exec_results = [ ('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []), ('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []), ('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []), +('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []), ('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []), ('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []), ('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []), diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-07-15-18-35.bpo-39579.itNmC0.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-07-15-18-35.bpo-39579.itNmC0.rst new file mode 100644 index 00000000000..36d5c425670 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-07-15-18-35.bpo-39579.itNmC0.rst @@ -0,0 +1 @@ +Change the ending column offset of `Attribute` nodes constructed in `ast_for_dotted_name` to point at the end of the current node and not at the end of the last `NAME` node. \ No newline at end of file diff --git a/Python/ast.c b/Python/ast.c index 9c48d71d154..bab672b2958 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1715,11 +1715,12 @@ ast_for_dotted_name(struct compiling *c, const node *n) return NULL; for (i = 2; i < NCH(n); i+=2) { - id = NEW_IDENTIFIER(CHILD(n, i)); + const node *child = CHILD(n, i); + id = NEW_IDENTIFIER(child); if (!id) return NULL; e = Attribute(e, id, Load, lineno, col_offset, - n->n_end_lineno, n->n_end_col_offset, c->c_arena); + child->n_end_lineno, child->n_end_col_offset, c->c_arena); if (!e) return NULL; } From 9a978ddb93bf5eaa519916d9a40c4fa4edf5d854 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 7 Feb 2020 15:46:29 -0800 Subject: [PATCH 328/380] closes bpo-39575: Change -lgcov to --coverage. (GH-18382) This allows clang to get rid of the dependency on libgcov. When linking, GCC passes -lgcov while clang passes the path to libclang_rt.profile-$arch.a --- Makefile.pre.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 510f227ed4d..3da104bac87 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -513,7 +513,7 @@ profile-opt: profile-run-stamp coverage: @echo "Building with support for coverage checking:" $(MAKE) clean - $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov" + $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg --coverage" LIBS="$(LIBS) --coverage" coverage-lcov: @echo "Creating Coverage HTML report with LCOV:" From 0edc2c7678266c39a7ceb2df885cb050f887e32b Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Fri, 7 Feb 2020 16:48:06 -0800 Subject: [PATCH 329/380] Doc: sys.__unraisablehook__ and bytearray.hex separators are new in 3.8 (GH-17884) Minor fix in documentation: - `sys.__unraisablehook__` is new in version 3.8 - Optional `sep` and `bytes_per_sep` parameters for `bytearray.hex` is also supported in Python 3.8 (just like `bytes.hex`) --- Doc/library/stdtypes.rst | 16 +++++++++++++--- Doc/library/sys.rst | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index fd3401fd18a..47d64f1e8d6 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2416,7 +2416,7 @@ data and are closely related to string objects in a variety of other ways. A reverse conversion function exists to transform a bytes object into its hexadecimal representation. - .. method:: hex() + .. method:: hex([sep[, bytes_per_sep]]) Return a string object containing two hexadecimal digits for each byte in the instance. @@ -2510,7 +2510,7 @@ objects. A reverse conversion function exists to transform a bytearray object into its hexadecimal representation. - .. method:: hex() + .. method:: hex([sep[, bytes_per_sep]]) Return a string object containing two hexadecimal digits for each byte in the instance. @@ -2520,6 +2520,11 @@ objects. .. versionadded:: 3.5 + .. versionchanged:: 3.8 + Similar to :meth:`bytes.hex`, :meth:`bytearray.hex` now supports + optional *sep* and *bytes_per_sep* parameters to insert separators + between bytes in the hex output. + Since bytearray objects are sequences of integers (akin to a list), for a bytearray object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be a bytearray object of length 1. (This contrasts with text strings, where @@ -3673,7 +3678,7 @@ copying. in-memory Fortran order is preserved. For non-contiguous views, the data is converted to C first. *order=None* is the same as *order='C'*. - .. method:: hex() + .. method:: hex([sep[, bytes_per_sep]]) Return a string object containing two hexadecimal digits for each byte in the buffer. :: @@ -3684,6 +3689,11 @@ copying. .. versionadded:: 3.5 + .. versionchanged:: 3.8 + Similar to :meth:`bytes.hex`, :meth:`memoryview.hex` now supports + optional *sep* and *bytes_per_sep* parameters to insert separators + between bytes in the hex output. + .. method:: tolist() Return the data in the buffer as a list of elements. :: diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index d28b3565c1c..f67bf630ff8 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -343,6 +343,8 @@ always available. .. versionadded:: 3.7 __breakpointhook__ + .. versionadded:: 3.8 + __unraisablehook__ .. function:: exc_info() From 7f6f7eef5206858030cbe4f80a7c04b02781cc9a Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 9 Feb 2020 08:45:52 +0900 Subject: [PATCH 330/380] bpo-39573: Use Py_TYPE() macro in ctypes.h (GH-18411) --- Modules/_ctypes/ctypes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index a232a4bc832..a93d573b72b 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -112,12 +112,12 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig extern PyTypeObject PyCData_Type; -#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type) +#define CDataObject_CheckExact(v) (Py_TYPE(v) == &PyCData_Type) #define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type) #define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value) extern PyTypeObject PyCSimpleType_Type; -#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type) +#define PyCSimpleTypeObject_CheckExact(v) (Py_TYPE(v) == &PyCSimpleType_Type) #define PyCSimpleTypeObject_Check(v) PyObject_TypeCheck(v, &PyCSimpleType_Type) extern PyTypeObject PyCField_Type; From c6dedde160a9fce5d049e860f586ad8f93aec822 Mon Sep 17 00:00:00 2001 From: sweeneyde <36520290+sweeneyde@users.noreply.github.com> Date: Sun, 9 Feb 2020 03:16:43 -0500 Subject: [PATCH 331/380] bpo-39590: make deque.__contains__ and deque.count hold strong references (GH-18421) --- Lib/test/test_deque.py | 12 ++++++++++++ .../Library/2020-02-09-05-51-05.bpo-39590.rf98GU.rst | 1 + Modules/_collectionsmodule.c | 4 ++++ 3 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-02-09-05-51-05.bpo-39590.rf98GU.rst diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 51b66b76aca..c0f7138254f 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -183,6 +183,18 @@ class TestBasic(unittest.TestCase): with self.assertRaises(RuntimeError): n in d + def test_contains_count_stop_crashes(self): + class A: + def __eq__(self, other): + d.clear() + return NotImplemented + d = deque([A(), A()]) + with self.assertRaises(RuntimeError): + _ = 3 in d + d = deque([A(), A()]) + with self.assertRaises(RuntimeError): + _ = d.count(3) + def test_extend(self): d = deque('a') self.assertRaises(TypeError, d.extend, 1) diff --git a/Misc/NEWS.d/next/Library/2020-02-09-05-51-05.bpo-39590.rf98GU.rst b/Misc/NEWS.d/next/Library/2020-02-09-05-51-05.bpo-39590.rf98GU.rst new file mode 100644 index 00000000000..68625028fb7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-09-05-51-05.bpo-39590.rf98GU.rst @@ -0,0 +1 @@ +Collections.deque now holds strong references during deque.__contains__ and deque.count, fixing crashes. \ No newline at end of file diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 10030606711..25e4c96943e 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -965,7 +965,9 @@ deque_count(dequeobject *deque, PyObject *v) while (--n >= 0) { CHECK_NOT_END(b); item = b->data[index]; + Py_INCREF(item); cmp = PyObject_RichCompareBool(item, v, Py_EQ); + Py_DECREF(item); if (cmp < 0) return NULL; count += cmp; @@ -1002,7 +1004,9 @@ deque_contains(dequeobject *deque, PyObject *v) while (--n >= 0) { CHECK_NOT_END(b); item = b->data[index]; + Py_INCREF(item); cmp = PyObject_RichCompareBool(item, v, Py_EQ); + Py_DECREF(item); if (cmp) { return cmp; } From 3ed4d251587c36c3853daf42602eaad121b59bba Mon Sep 17 00:00:00 2001 From: Don Kirkby Date: Sun, 9 Feb 2020 16:57:46 -0800 Subject: [PATCH 332/380] Grammar fix in tutorial (GH-18425) --- Doc/tutorial/controlflow.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 7dfd33af258..f05f5edd5cc 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -142,7 +142,7 @@ the list, thus saving space. We say such an object is :term:`iterable`, that is, suitable as a target for functions and constructs that expect something from which they can obtain successive items until the supply is exhausted. We have seen that -the :keyword:`for` statement is such a construct, while an example of function +the :keyword:`for` statement is such a construct, while an example of a function that takes an iterable is :func:`sum`:: >>> sum(range(4)) # 0 + 1 + 2 + 3 From 5305cc9dbfe8a5a0ab666511f3ba7f026c8983f8 Mon Sep 17 00:00:00 2001 From: idomic Date: Mon, 10 Feb 2020 04:48:40 -0500 Subject: [PATCH 333/380] bpo-39128: Added happy_eyeballs_delay, interleave to function signature (GH-18315) --- Doc/library/asyncio-eventloop.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 0029d94f0b5..3acd79d2835 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -359,7 +359,8 @@ Opening network connections host=None, port=None, \*, ssl=None, \ family=0, proto=0, flags=0, sock=None, \ local_addr=None, server_hostname=None, \ - ssl_handshake_timeout=None) + ssl_handshake_timeout=None, \ + happy_eyeballs_delay=None, interleave=None) Open a streaming transport connection to a given address specified by *host* and *port*. @@ -448,7 +449,7 @@ Opening network connections .. versionadded:: 3.8 - The *happy_eyeballs_delay* and *interleave* parameters. + Added the *happy_eyeballs_delay* and *interleave* parameters. .. versionadded:: 3.7 From 29b3fc0a18f105de666fdd586b537f34e349766d Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 10 Feb 2020 15:26:40 +0200 Subject: [PATCH 334/380] bpo-39586: Deprecate distutils bdist_msi command (GH-18415) --- Doc/distutils/apiref.rst | 3 +++ Doc/distutils/builtdist.rst | 9 +++++++++ Doc/whatsnew/3.9.rst | 4 ++++ Lib/distutils/command/bdist_msi.py | 10 +++++++++- Lib/distutils/tests/test_bdist_msi.py | 5 +++-- Misc/ACKS | 1 + .../Library/2020-02-08-13-37-00.bpo-39586.nfTPxX.rst | 2 ++ 7 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-08-13-37-00.bpo-39586.nfTPxX.rst diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index 12e0c0b2c97..b14197c2f94 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1855,6 +1855,9 @@ Subclasses of :class:`Command` must define the following methods. .. class:: bdist_msi +.. deprecated:: 3.9 + Use bdist_wheel (wheel packages) instead. + Builds a `Windows Installer`_ (.msi) binary package. .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index b814f2e9508..e032c03e229 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -149,6 +149,9 @@ generated by each, are: .. note:: bdist_wininst is deprecated since Python 3.8. +.. note:: + bdist_msi is deprecated since Python 3.9. + The following sections give details on the individual :command:`bdist_\*` commands. @@ -304,6 +307,9 @@ Creating Windows Installers .. warning:: bdist_wininst is deprecated since Python 3.8. +.. warning:: + bdist_msi is deprecated since Python 3.9. + Executable installers are the natural format for binary distributions on Windows. They display a nice graphical user interface, display some information about the module distribution to be installed taken from the metadata in the @@ -468,3 +474,6 @@ installed for all users) and 'force' (meaning always prompt for elevation). .. note:: bdist_wininst is deprecated since Python 3.8. + +.. note:: + bdist_msi is deprecated since Python 3.9. diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 4991e56759b..4f4c7f2808d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -398,6 +398,10 @@ Build and C API Changes Deprecated ========== +* The distutils ``bdist_msi`` command is now deprecated, use + ``bdist_wheel`` (wheel packages) instead. + (Contributed by Hugo van Kemenade in :issue:`39586`.) + * Currently :func:`math.factorial` accepts :class:`float` instances with non-negative integer values (like ``5.0``). It raises a :exc:`ValueError` for non-integral and negative floats. It is now deprecated. In future diff --git a/Lib/distutils/command/bdist_msi.py b/Lib/distutils/command/bdist_msi.py index f335a348986..0863a1883e7 100644 --- a/Lib/distutils/command/bdist_msi.py +++ b/Lib/distutils/command/bdist_msi.py @@ -6,7 +6,9 @@ Implements the bdist_msi command. """ -import sys, os +import os +import sys +import warnings from distutils.core import Command from distutils.dir_util import remove_tree from distutils.sysconfig import get_python_version @@ -122,6 +124,12 @@ class bdist_msi(Command): '3.5', '3.6', '3.7', '3.8', '3.9'] other_version = 'X' + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + warnings.warn("bdist_msi command is deprecated since Python 3.9, " + "use bdist_wheel (wheel packages) instead", + DeprecationWarning, 2) + def initialize_options(self): self.bdist_dir = None self.plat_name = None diff --git a/Lib/distutils/tests/test_bdist_msi.py b/Lib/distutils/tests/test_bdist_msi.py index 15d8bdff2b4..418e60ec729 100644 --- a/Lib/distutils/tests/test_bdist_msi.py +++ b/Lib/distutils/tests/test_bdist_msi.py @@ -1,7 +1,7 @@ """Tests for distutils.command.bdist_msi.""" import sys import unittest -from test.support import run_unittest +from test.support import run_unittest, check_warnings from distutils.tests import support @@ -14,7 +14,8 @@ class BDistMSITestCase(support.TempdirManager, # minimal test XXX need more tests from distutils.command.bdist_msi import bdist_msi project_dir, dist = self.create_dist() - cmd = bdist_msi(dist) + with check_warnings(("", DeprecationWarning)): + cmd = bdist_msi(dist) cmd.ensure_finalized() diff --git a/Misc/ACKS b/Misc/ACKS index f3e36807812..5a779833e68 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -843,6 +843,7 @@ Dmitry Kazakov Brian Kearns Sebastien Keim Ryan Kelly +Hugo van Kemenade Dan Kenigsberg Randall Kern Robert Kern diff --git a/Misc/NEWS.d/next/Library/2020-02-08-13-37-00.bpo-39586.nfTPxX.rst b/Misc/NEWS.d/next/Library/2020-02-08-13-37-00.bpo-39586.nfTPxX.rst new file mode 100644 index 00000000000..5189f131afd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-08-13-37-00.bpo-39586.nfTPxX.rst @@ -0,0 +1,2 @@ +The distutils ``bdist_msi`` command is deprecated in Python 3.9, use +``bdist_wheel`` (wheel packages) instead. \ No newline at end of file From e00c1d0c45975c0e9367f05f8c68bb32d68c2fbf Mon Sep 17 00:00:00 2001 From: Brian Curtin Date: Mon, 10 Feb 2020 10:47:17 -0700 Subject: [PATCH 335/380] Remove note saying patch is straightforward (#18431) While `unittest.mock.patch` is a great thing, it is not straightforward. If it were straightforward there wouldn't be such a huge amount of documentation for it, and frankly, when myself and others who I've read about often struggle to figure out what on earth `patch()` wants, coming to the docs to read that it's straightforward is not helpful. --- Doc/library/unittest.mock.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 515bdd060a1..3643d1ad96e 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1327,8 +1327,7 @@ patch .. note:: - :func:`patch` is straightforward to use. The key is to do the patching in the - right namespace. See the section `where to patch`_. + The key is to do the patching in the right namespace. See the section `where to patch`_. .. function:: patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs) From ed335cf53b5d4bca9a08c9b83ba684ba17be0f10 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 10 Feb 2020 20:41:26 +0100 Subject: [PATCH 336/380] bpo-39600, IDLE: Remove duplicated font names (GH-18430) In the font configuration window, remove duplicated font names. --- Lib/idlelib/configdialog.py | 5 +++-- .../next/IDLE/2020-02-10-17-09-48.bpo-39600.X6NsyM.rst | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2020-02-10-17-09-48.bpo-39600.X6NsyM.rst diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 22359735874..7b844f00e77 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -607,8 +607,9 @@ class FontPage(Frame): font_bold = configured_font[2]=='bold' # Set editor font selection list and font_name. - fonts = list(tkFont.families(self)) - fonts.sort() + fonts = tkFont.families(self) + # remove duplicated names and sort + fonts = sorted(set(fonts)) for font in fonts: self.fontlist.insert(END, font) self.font_name.set(font_name) diff --git a/Misc/NEWS.d/next/IDLE/2020-02-10-17-09-48.bpo-39600.X6NsyM.rst b/Misc/NEWS.d/next/IDLE/2020-02-10-17-09-48.bpo-39600.X6NsyM.rst new file mode 100644 index 00000000000..102aa75f581 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2020-02-10-17-09-48.bpo-39600.X6NsyM.rst @@ -0,0 +1 @@ +In the font configuration window, remove duplicated font names. From 6c9974e12c50150149b989aaef68be1fe46ea670 Mon Sep 17 00:00:00 2001 From: Wellington Pardim Date: Mon, 10 Feb 2020 17:13:41 -0300 Subject: [PATCH 337/380] bpo-39369 Doc: Update mmap readline method documentation (GH-17957) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update mmap readline method documentation Update mmap `readline` method description. The fact that the `readline` method does update the file position should not be ignored since this might give the impression for the programmer that it doesn't update it. * 📜🤖 Added by blurb_it. Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Doc/library/mmap.rst | 3 ++- .../Documentation/2020-01-17-13-59-21.bpo-39369.Bx5yE3.rst | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Documentation/2020-01-17-13-59-21.bpo-39369.Bx5yE3.rst diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 12b14d69332..1f3fbc340fc 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -244,7 +244,8 @@ To map anonymous memory, -1 should be passed as the fileno along with the length .. method:: readline() Returns a single line, starting at the current file position and up to the - next newline. + next newline. The file position is updated to point after the bytes that were + returned. .. method:: resize(newsize) diff --git a/Misc/NEWS.d/next/Documentation/2020-01-17-13-59-21.bpo-39369.Bx5yE3.rst b/Misc/NEWS.d/next/Documentation/2020-01-17-13-59-21.bpo-39369.Bx5yE3.rst new file mode 100644 index 00000000000..7f41735b9d3 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2020-01-17-13-59-21.bpo-39369.Bx5yE3.rst @@ -0,0 +1 @@ +Update mmap readline method description. The fact that the readline method does update the file position should not be ignored since this might give the impression for the programmer that it doesn't update it. \ No newline at end of file From 3c5dec65e99ab7b641f1663c88e3332fff944881 Mon Sep 17 00:00:00 2001 From: Christophe Nanteuil <35002064+christopheNan@users.noreply.github.com> Date: Mon, 10 Feb 2020 21:17:54 +0100 Subject: [PATCH 338/380] Remove redundant references in struct doc (GH-18053) --- Doc/library/struct.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst index 1f90e3d1ba8..856b6da8bb2 100644 --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -259,7 +259,7 @@ Notes: called to convert the argument to an integer before packing. .. versionchanged:: 3.2 - Use of the :meth:`__index__` method for non-integers is new in 3.2. + Added use of the :meth:`__index__` method for non-integers. (3) The ``'n'`` and ``'N'`` conversion codes are only available for the native @@ -312,7 +312,7 @@ When packing a value ``x`` using one of the integer formats (``'b'``, then :exc:`struct.error` is raised. .. versionchanged:: 3.1 - In 3.0, some of the integer formats wrapped out-of-range values and + Previously, some of the integer formats wrapped out-of-range values and raised :exc:`DeprecationWarning` instead of :exc:`struct.error`. The ``'p'`` format character encodes a "Pascal string", meaning a short From d68e0a8a165761604e820c8cb4f20abc735e717f Mon Sep 17 00:00:00 2001 From: Carl Date: Mon, 10 Feb 2020 13:15:34 -0800 Subject: [PATCH 339/380] Issue3950: Fix docs for default locale used by gettext to match implementation (#18435) documentation for default locale directory Doc/library/gettext.rst changed to match gettext implementation line 63. --- Doc/library/gettext.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst index 937330bb201..ec2c12806b4 100644 --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -724,8 +724,8 @@ implementations, and valuable experience to the creation of this module: .. [#] The default locale directory is system dependent; for example, on RedHat Linux it is :file:`/usr/share/locale`, but on Solaris it is :file:`/usr/lib/locale`. The :mod:`gettext` module does not try to support these system dependent - defaults; instead its default is :file:`{sys.prefix}/share/locale` (see - :data:`sys.prefix`). For this reason, it is always best to call + defaults; instead its default is :file:`{sys.base_prefix}/share/locale` (see + :data:`sys.base_prefix`). For this reason, it is always best to call :func:`bindtextdomain` with an explicit absolute path at the start of your application. From 37c55b2b49a3acb7c56c9f6a5062bc6e4e35bc1c Mon Sep 17 00:00:00 2001 From: Roger Hurwitz Date: Mon, 10 Feb 2020 14:50:19 -0800 Subject: [PATCH 340/380] bpo-39594: Fix typo in os.times documentation (GH-18443) There was an extra space in the url markup, causing the documentation not rendered properly. https://bugs.python.org/issue39594 --- Doc/library/os.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index bfc03227e4e..b06a318c3d7 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3912,10 +3912,8 @@ written in Python, such as a mail server's external command delivery program. See the Unix manual page :manpage:`times(2)` and :manpage:`times(3)` manual page on Unix or `the GetProcessTimes MSDN - ` - _ on Windows. - On Windows, only :attr:`user` and :attr:`system` are known; the other - attributes are zero. + `_ + on Windows. On Windows, only :attr:`user` and :attr:`system` are known; the other attributes are zero. .. availability:: Unix, Windows. From 95d024d585bd3ed627437a2f0cbc783c8a014c8a Mon Sep 17 00:00:00 2001 From: "Tim D. Smith" Date: Mon, 10 Feb 2020 14:51:01 -0800 Subject: [PATCH 341/380] bpo-13826: Clarify Popen constructor example (GH-18438) Clarifies that the use of `shlex.split` is more instructive than normative, and provides a simpler example. https://bugs.python.org/issue13826 --- Doc/library/subprocess.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 74857480360..24497a2edd3 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -356,14 +356,20 @@ functions. arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass *args* as a sequence. + An example of passing some arguments to an external program + as a sequence is:: + + Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."]) + On POSIX, if *args* is a string, the string is interpreted as the name or path of the program to execute. However, this can only be done if not passing arguments to the program. .. note:: - :meth:`shlex.split` can be useful when determining the correct - tokenization for *args*, especially in complex cases:: + It may not be obvious how to break a shell command into a sequence of arguments, + especially in complex cases. :meth:`shlex.split` can illustrate how to + determine the correct tokenization for *args*:: >>> import shlex, subprocess >>> command_line = input() From bf15d5b775c31e65584926998ff141edc75226d4 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Mon, 10 Feb 2020 23:32:18 +0000 Subject: [PATCH 342/380] Correct the documented default encoding (GH-18429) From the source for `PyUnicode_Decode`, the implementation is: ``` if (encoding == NULL) { return PyUnicode_DecodeUTF8Stateful(s, size, errors, NULL); } ``` which is pretty clearly not defaulting to ASCII. --- I assume this needs neither a news entry nor bpo link. --- Doc/c-api/unicode.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 77f123cf1f2..96d77c40841 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -978,7 +978,7 @@ have the same semantics as the ones of the built-in :func:`str` string object constructor. Setting encoding to ``NULL`` causes the default encoding to be used -which is ASCII. The file system calls should use +which is UTF-8. The file system calls should use :c:func:`PyUnicode_FSConverter` for encoding file names. This uses the variable :c:data:`Py_FileSystemDefaultEncoding` internally. This variable should be treated as read-only: on some systems, it will be a From c4a65ed7fe342bd18b5a5b0eea3470dc4fc31160 Mon Sep 17 00:00:00 2001 From: Ogi Moore Date: Mon, 10 Feb 2020 15:51:01 -0800 Subject: [PATCH 343/380] bpo-39417: Fix broken link to guide to building venvs (GH-18432) --- Doc/library/venv.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index d778486b0a5..8abadc4df3c 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -27,7 +27,7 @@ See :pep:`405` for more information about Python virtual environments. .. seealso:: `Python Packaging User Guide: Creating and using virtual environments - `__ + `__ Creating virtual environments From 038770edc4680e9a3dc39bacb35a8358034fb901 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 11 Feb 2020 00:58:23 +0100 Subject: [PATCH 344/380] bpo-38325: Skip non-BMP tests of test_winconsoleio (GH-18448) Skip tests on non-BMP characters of test_winconsoleio. --- Lib/test/test_winconsoleio.py | 6 ++++++ .../next/Tests/2020-02-11-00-38-32.bpo-38325.HgmfoE.rst | 1 + 2 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2020-02-11-00-38-32.bpo-38325.HgmfoE.rst diff --git a/Lib/test/test_winconsoleio.py b/Lib/test/test_winconsoleio.py index 9a61e48881d..a44f7bbd27b 100644 --- a/Lib/test/test_winconsoleio.py +++ b/Lib/test/test_winconsoleio.py @@ -144,6 +144,10 @@ class WindowsConsoleIOTests(unittest.TestCase): self.assertStdinRoundTrip('ϼўТλФЙ') # Combining characters self.assertStdinRoundTrip('A͏B ﬖ̳AA̝') + + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") + def test_input_nonbmp(self): # Non-BMP self.assertStdinRoundTrip('\U00100000\U0010ffff\U0010fffd') @@ -163,6 +167,8 @@ class WindowsConsoleIOTests(unittest.TestCase): self.assertEqual(actual, expected, 'stdin.read({})'.format(read_count)) + # bpo-38325 + @unittest.skipIf(True, "Handling Non-BMP characters is broken") def test_partial_surrogate_reads(self): # Test that reading less than 1 full character works when stdin # contains surrogate pairs that cannot be decoded to UTF-8 without diff --git a/Misc/NEWS.d/next/Tests/2020-02-11-00-38-32.bpo-38325.HgmfoE.rst b/Misc/NEWS.d/next/Tests/2020-02-11-00-38-32.bpo-38325.HgmfoE.rst new file mode 100644 index 00000000000..75033799152 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2020-02-11-00-38-32.bpo-38325.HgmfoE.rst @@ -0,0 +1 @@ +Skip tests on non-BMP characters of test_winconsoleio. From 96ce22706735779cf8cc46eaaa5ac61359364b5a Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 10 Feb 2020 20:08:58 -0500 Subject: [PATCH 345/380] bpo-39600: Adjust code, add idlelib/NEWS item (GH-18449) Complete previous patch. --- Lib/idlelib/NEWS.txt | 2 ++ Lib/idlelib/configdialog.py | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index d57ba7e6bac..838120964b2 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,8 @@ Released on 2020-10-05? ====================================== +bpo-39600: Remove duplicate font names from configuration list. + bpo-38792: Close a shell calltip if a :exc:`KeyboardInterrupt` or shell restart occurs. Patch by Zackery Spytz. diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 7b844f00e77..9d5c2cde04b 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -606,10 +606,8 @@ class FontPage(Frame): font_size = configured_font[1] font_bold = configured_font[2]=='bold' - # Set editor font selection list and font_name. - fonts = tkFont.families(self) - # remove duplicated names and sort - fonts = sorted(set(fonts)) + # Set sorted no-duplicate editor font selection list and font_name. + fonts = sorted(set(tkFont.families(self))) for font in fonts: self.fontlist.insert(END, font) self.font_name.set(font_name) From 4eb9f4313cfaea6a9611221024a1c54f5662cc37 Mon Sep 17 00:00:00 2001 From: Roger Hurwitz Date: Mon, 10 Feb 2020 22:56:02 -0800 Subject: [PATCH 346/380] bpo-38374: Remove weakref.ReferenceError from docs (GH-18452) Reflecting changes to the code, removed weakref.ReferenceError from weakref.rst and exceptions.rst. Issue submitter provided evidence that the `weakref.ReferenceError` alias for `ReferenceError` was removed from the code in 2007. Working with @gvanrossum at PyCascades CPython sprint we looked at the code and confirmed that `weakref.ReferenceError` was no longer in `weakref.py`. Based on that analysis I removed references `weakref.ReferenceError` from the two documents where it was still being referenced: `weakref.rst` and `exceptions.rst`. https://bugs.python.org/issue38374 --- Doc/c-api/exceptions.rst | 3 --- Doc/library/weakref.rst | 6 ------ 2 files changed, 9 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 2edcbf788d2..b7175166a6f 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -983,9 +983,6 @@ Notes: This is a base class for other standard exceptions. (2) - This is the same as :exc:`weakref.ReferenceError`. - -(3) Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index c3519e45beb..8636e76c52a 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -327,12 +327,6 @@ objects. types. -.. exception:: ReferenceError - - Exception raised when a proxy object is used but the underlying object has been - collected. This is the same as the standard :exc:`ReferenceError` exception. - - .. seealso:: :pep:`205` - Weak References From 1ea45ae257971ee7b648e3b031603a31fc059f81 Mon Sep 17 00:00:00 2001 From: Hai Shi Date: Tue, 11 Feb 2020 05:16:38 -0600 Subject: [PATCH 347/380] bpo-1635741: Port _codecs extension module to multiphase initialization (PEP 489) (GH-18065) https://bugs.python.org/issue1635741 --- .../2020-01-19-11-06-30.bpo-1635741.0mjsfm.rst | 1 + Modules/_codecsmodule.c | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-19-11-06-30.bpo-1635741.0mjsfm.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-19-11-06-30.bpo-1635741.0mjsfm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-19-11-06-30.bpo-1635741.0mjsfm.rst new file mode 100644 index 00000000000..10fc23bcfa1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-19-11-06-30.bpo-1635741.0mjsfm.rst @@ -0,0 +1 @@ +Port _codecs extension module to multiphase initialization (:pep:`489`). \ No newline at end of file diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index a8ffb699557..952072102d5 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -1039,13 +1039,17 @@ static PyMethodDef _codecs_functions[] = { {NULL, NULL} /* sentinel */ }; +static PyModuleDef_Slot _codecs_slots[] = { + {0, NULL} +}; + static struct PyModuleDef codecsmodule = { PyModuleDef_HEAD_INIT, "_codecs", NULL, - -1, + 0, _codecs_functions, - NULL, + _codecs_slots, NULL, NULL, NULL @@ -1054,5 +1058,5 @@ static struct PyModuleDef codecsmodule = { PyMODINIT_FUNC PyInit__codecs(void) { - return PyModule_Create(&codecsmodule); + return PyModuleDef_Init(&codecsmodule); } From f3e7ea5b8c220cd63101e419d529c8563f9c6115 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 11 Feb 2020 14:29:33 +0100 Subject: [PATCH 348/380] bpo-39500: Document PyUnicode_IsIdentifier() function (GH-18397) PyUnicode_IsIdentifier() does not call Py_FatalError() anymore if the string is not ready. --- Doc/c-api/unicode.rst | 10 ++++ .../2020-02-07-09-35-43.bpo-39500.xRAEgX.rst | 2 + Objects/unicodeobject.c | 47 +++++++++++++------ Parser/tokenizer.c | 3 +- 4 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-02-07-09-35-43.bpo-39500.xRAEgX.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 96d77c40841..b1787ed1ce8 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -240,6 +240,16 @@ access internal read-only data of Unicode objects: :c:func:`PyUnicode_nBYTE_DATA` family of macros. +.. c:function:: int PyUnicode_IsIdentifier(PyObject *o) + + Return ``1`` if the string is a valid identifier according to the language + definition, section :ref:`identifiers`. Return ``0`` otherwise. + + .. versionchanged:: 3.9 + The function does not call :c:func:`Py_FatalError` anymore if the string + is not ready. + + Unicode Character Properties """""""""""""""""""""""""""" diff --git a/Misc/NEWS.d/next/C API/2020-02-07-09-35-43.bpo-39500.xRAEgX.rst b/Misc/NEWS.d/next/C API/2020-02-07-09-35-43.bpo-39500.xRAEgX.rst new file mode 100644 index 00000000000..2ca359f0ec1 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-07-09-35-43.bpo-39500.xRAEgX.rst @@ -0,0 +1,2 @@ +:c:func:`PyUnicode_IsIdentifier` does not call :c:func:`Py_FatalError` +anymore if the string is not ready. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fd08ddbf574..aa874f2a12d 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12198,22 +12198,33 @@ unicode_isnumeric_impl(PyObject *self) int PyUnicode_IsIdentifier(PyObject *self) { - int kind; - void *data; Py_ssize_t i; - Py_UCS4 first; + int ready = PyUnicode_IS_READY(self); - if (PyUnicode_READY(self) == -1) { - Py_FatalError("identifier not ready"); + Py_ssize_t len = ready ? PyUnicode_GET_LENGTH(self) : PyUnicode_GET_SIZE(self); + if (len == 0) { + /* an empty string is not a valid identifier */ return 0; } - /* Special case for empty strings */ - if (PyUnicode_GET_LENGTH(self) == 0) - return 0; - kind = PyUnicode_KIND(self); - data = PyUnicode_DATA(self); + int kind; + void *data; + wchar_t *wstr; + if (ready) { + kind = PyUnicode_KIND(self); + data = PyUnicode_DATA(self); + } + else { + wstr = _PyUnicode_WSTR(self); + } + Py_UCS4 ch; + if (ready) { + ch = PyUnicode_READ(kind, data, 0); + } + else { + ch = wstr[0]; + } /* PEP 3131 says that the first character must be in XID_Start and subsequent characters in XID_Continue, and for the ASCII range, the 2.x rules apply (i.e @@ -12222,13 +12233,21 @@ PyUnicode_IsIdentifier(PyObject *self) definition of XID_Start and XID_Continue, it is sufficient to check just for these, except that _ must be allowed as starting an identifier. */ - first = PyUnicode_READ(kind, data, 0); - if (!_PyUnicode_IsXidStart(first) && first != 0x5F /* LOW LINE */) + if (!_PyUnicode_IsXidStart(ch) && ch != 0x5F /* LOW LINE */) { return 0; + } - for (i = 1; i < PyUnicode_GET_LENGTH(self); i++) - if (!_PyUnicode_IsXidContinue(PyUnicode_READ(kind, data, i))) + for (i = 1; i < len; i++) { + if (ready) { + ch = PyUnicode_READ(kind, data, i); + } + else { + ch = wstr[i]; + } + if (!_PyUnicode_IsXidContinue(ch)) { return 0; + } + } return 1; } diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index f73c32684c7..c37cd927df5 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1079,8 +1079,9 @@ verify_identifier(struct tok_state *tok) } result = PyUnicode_IsIdentifier(s); Py_DECREF(s); - if (result == 0) + if (result == 0) { tok->done = E_IDENTIFIER; + } return result; } From ffd9753a944916ced659b2c77aebe66a6c9fbab5 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Tue, 11 Feb 2020 17:46:57 +0100 Subject: [PATCH 349/380] bpo-39245: Switch to public API for Vectorcall (GH-18460) The bulk of this patch was generated automatically with: for name in \ PyObject_Vectorcall \ Py_TPFLAGS_HAVE_VECTORCALL \ PyObject_VectorcallMethod \ PyVectorcall_Function \ PyObject_CallOneArg \ PyObject_CallMethodNoArgs \ PyObject_CallMethodOneArg \ ; do echo $name git grep -lwz _$name | xargs -0 sed -i "s/\b_$name\b/$name/g" done old=_PyObject_FastCallDict new=PyObject_VectorcallDict git grep -lwz $old | xargs -0 sed -i "s/\b$old\b/$new/g" and then cleaned up: - Revert changes to in docs & news - Revert changes to backcompat defines in headers - Nudge misaligned comments --- Include/cpython/abstract.h | 6 ++--- Lib/test/test_call.py | 6 ++--- Modules/_asynciomodule.c | 22 ++++++++-------- Modules/_collectionsmodule.c | 2 +- Modules/_csv.c | 6 ++--- Modules/_ctypes/callproc.c | 8 +++--- Modules/_elementtree.c | 16 ++++++------ Modules/_functoolsmodule.c | 4 +-- Modules/_io/bufferedio.c | 30 ++++++++++----------- Modules/_io/iobase.c | 16 ++++++------ Modules/_io/stringio.c | 2 +- Modules/_io/textio.c | 42 +++++++++++++++--------------- Modules/_json.c | 12 ++++----- Modules/_operator.c | 2 +- Modules/_pickle.c | 10 +++---- Modules/_posixsubprocess.c | 6 ++--- Modules/_randommodule.c | 2 +- Modules/_sqlite/cache.c | 2 +- Modules/_sqlite/connection.c | 6 ++--- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/microprotocols.c | 6 ++--- Modules/_sre.c | 2 +- Modules/_struct.c | 2 +- Modules/_testcapimodule.c | 10 +++---- Modules/_xxtestfuzz/fuzzer.c | 4 +-- Modules/cjkcodecs/cjkcodecs.h | 2 +- Modules/cjkcodecs/multibytecodec.c | 2 +- Modules/gcmodule.c | 2 +- Modules/itertoolsmodule.c | 8 +++--- Modules/pyexpat.c | 2 +- Objects/abstract.c | 8 +++--- Objects/bytearrayobject.c | 4 +-- Objects/bytesobject.c | 2 +- Objects/call.c | 14 +++++----- Objects/classobject.c | 2 +- Objects/descrobject.c | 8 +++--- Objects/dictobject.c | 2 +- Objects/fileobject.c | 2 +- Objects/floatobject.c | 2 +- Objects/funcobject.c | 2 +- Objects/genobject.c | 8 +++--- Objects/listobject.c | 2 +- Objects/longobject.c | 2 +- Objects/memoryobject.c | 4 +-- Objects/methodobject.c | 2 +- Objects/moduleobject.c | 2 +- Objects/typeobject.c | 20 +++++++------- Objects/unicodeobject.c | 8 +++--- Objects/weakrefobject.c | 2 +- Python/_warnings.c | 8 +++--- Python/bltinmodule.c | 16 ++++++------ Python/ceval.c | 12 ++++----- Python/codecs.c | 4 +-- Python/errors.c | 6 ++--- Python/import.c | 2 +- Python/sysmodule.c | 2 +- 56 files changed, 194 insertions(+), 194 deletions(-) diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 76eaedfc4b7..c0b0182fd5d 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -67,7 +67,7 @@ PyVectorcall_Function(PyObject *callable) { assert(callable != NULL); PyTypeObject *tp = Py_TYPE(callable); - if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { + if (!PyType_HasFeature(tp, Py_TPFLAGS_HAVE_VECTORCALL)) { return NULL; } assert(PyCallable_Check(callable)); @@ -178,7 +178,7 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod( static inline PyObject * PyObject_CallMethodNoArgs(PyObject *self, PyObject *name) { - return _PyObject_VectorcallMethod(name, &self, + return PyObject_VectorcallMethod(name, &self, 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); } @@ -187,7 +187,7 @@ PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg) { assert(arg != NULL); PyObject *args[2] = {self, arg}; - return _PyObject_VectorcallMethod(name, args, + return PyObject_VectorcallMethod(name, args, 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); } diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py index d178aa4ec2b..b3077ad1d1c 100644 --- a/Lib/test/test_call.py +++ b/Lib/test/test_call.py @@ -468,7 +468,7 @@ class FastCallTests(unittest.TestCase): self.check_result(result, expected) def test_vectorcall_dict(self): - # Test _PyObject_FastCallDict() + # Test PyObject_VectorcallDict() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -487,7 +487,7 @@ class FastCallTests(unittest.TestCase): self.check_result(result, expected) def test_vectorcall(self): - # Test _PyObject_Vectorcall() + # Test PyObject_Vectorcall() for func, args, expected in self.CALLS_POSARGS: with self.subTest(func=func, args=args): @@ -594,7 +594,7 @@ class TestPEP590(unittest.TestCase): # 1. vectorcall using PyVectorcall_Call() # (only for objects that support vectorcall directly) # 2. normal call - # 3. vectorcall using _PyObject_Vectorcall() + # 3. vectorcall using PyObject_Vectorcall() # 4. call as bound method # 5. call using functools.partial diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 2e293757fb7..5aea74332c5 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -142,7 +142,7 @@ _is_coroutine(PyObject *coro) Do this check after 'future_init()'; in case we need to raise an error, __del__ needs a properly initialized object. */ - PyObject *res = _PyObject_CallOneArg(asyncio_iscoroutine_func, coro); + PyObject *res = PyObject_CallOneArg(asyncio_iscoroutine_func, coro); if (res == NULL) { return -1; } @@ -367,7 +367,7 @@ call_soon(PyObject *loop, PyObject *func, PyObject *arg, PyObject *ctx) } stack[nargs] = (PyObject *)ctx; - handle = _PyObject_Vectorcall(callable, stack, nargs, context_kwname); + handle = PyObject_Vectorcall(callable, stack, nargs, context_kwname); Py_DECREF(callable); } @@ -1287,7 +1287,7 @@ static PyObject * _asyncio_Future__repr_info_impl(FutureObj *self) /*[clinic end generated code: output=fa69e901bd176cfb input=f21504d8e2ae1ca2]*/ { - return _PyObject_CallOneArg(asyncio_future_repr_info_func, (PyObject *)self); + return PyObject_CallOneArg(asyncio_future_repr_info_func, (PyObject *)self); } static PyObject * @@ -1363,7 +1363,7 @@ FutureObj_finalize(FutureObj *fut) func = _PyObject_GetAttrId(fut->fut_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = _PyObject_CallOneArg(func, context); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -2126,13 +2126,13 @@ _asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop) Py_DECREF(current_task_func); return NULL; } - ret = _PyObject_CallOneArg(current_task_func, loop); + ret = PyObject_CallOneArg(current_task_func, loop); Py_DECREF(current_task_func); Py_DECREF(loop); return ret; } else { - ret = _PyObject_CallOneArg(current_task_func, loop); + ret = PyObject_CallOneArg(current_task_func, loop); Py_DECREF(current_task_func); return ret; } @@ -2168,7 +2168,7 @@ _asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop) return NULL; } - res = _PyObject_CallOneArg(all_tasks_func, loop); + res = PyObject_CallOneArg(all_tasks_func, loop); Py_DECREF(all_tasks_func); return res; } @@ -2181,7 +2181,7 @@ static PyObject * _asyncio_Task__repr_info_impl(TaskObj *self) /*[clinic end generated code: output=6a490eb66d5ba34b input=3c6d051ed3ddec8b]*/ { - return _PyObject_CallOneArg(asyncio_task_repr_info_func, (PyObject *)self); + return PyObject_CallOneArg(asyncio_task_repr_info_func, (PyObject *)self); } /*[clinic input] @@ -2431,7 +2431,7 @@ TaskObj_finalize(TaskObj *task) func = _PyObject_GetAttrId(task->task_loop, &PyId_call_exception_handler); if (func != NULL) { - PyObject *res = _PyObject_CallOneArg(func, context); + PyObject *res = PyObject_CallOneArg(func, context); if (res == NULL) { PyErr_WriteUnraisable(func); } @@ -2571,7 +2571,7 @@ task_set_error_soon(TaskObj *task, PyObject *et, const char *format, ...) return NULL; } - PyObject *e = _PyObject_CallOneArg(et, msg); + PyObject *e = PyObject_CallOneArg(et, msg); Py_DECREF(msg); if (e == NULL) { return NULL; @@ -2841,7 +2841,7 @@ task_step_impl(TaskObj *task, PyObject *exc) PyObject *stack[2]; stack[0] = wrapper; stack[1] = (PyObject *)task->task_context; - res = _PyObject_Vectorcall(add_cb, stack, 1, context_kwname); + res = PyObject_Vectorcall(add_cb, stack, 1, context_kwname); Py_DECREF(add_cb); Py_DECREF(wrapper); if (res == NULL) { diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 25e4c96943e..057d4044183 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -512,7 +512,7 @@ deque_copy(PyObject *deque, PyObject *Py_UNUSED(ignored)) return NULL; } if (old_deque->maxlen < 0) - result = _PyObject_CallOneArg((PyObject *)(Py_TYPE(deque)), deque); + result = PyObject_CallOneArg((PyObject *)(Py_TYPE(deque)), deque); else result = PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi", deque, old_deque->maxlen, NULL); diff --git a/Modules/_csv.c b/Modules/_csv.c index 2d541bb3af8..42437728f2e 100644 --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -514,10 +514,10 @@ _call_dialect(PyObject *dialect_inst, PyObject *kwargs) { PyObject *type = (PyObject *)&Dialect_Type; if (dialect_inst) { - return _PyObject_FastCallDict(type, &dialect_inst, 1, kwargs); + return PyObject_VectorcallDict(type, &dialect_inst, 1, kwargs); } else { - return _PyObject_FastCallDict(type, NULL, 0, kwargs); + return PyObject_VectorcallDict(type, NULL, 0, kwargs); } } @@ -1240,7 +1240,7 @@ csv_writerow(WriterObj *self, PyObject *seq) if (line == NULL) { return NULL; } - result = _PyObject_CallOneArg(self->write, line); + result = PyObject_CallOneArg(self->write, line); Py_DECREF(line); return result; } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 65c6eb15a29..5f29f95b128 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -945,7 +945,7 @@ static PyObject *GetResult(PyObject *restype, void *result, PyObject *checker) if (!checker || !retval) return retval; - v = _PyObject_CallOneArg(checker, retval); + v = PyObject_CallOneArg(checker, retval); if (v == NULL) _PyTraceback_Add("GetResult", "_ctypes/callproc.c", __LINE__-2); Py_DECREF(retval); @@ -1138,7 +1138,7 @@ PyObject *_ctypes_callproc(PPROC pProc, if (argtypes && argtype_count > i) { PyObject *v; converter = PyTuple_GET_ITEM(argtypes, i); - v = _PyObject_CallOneArg(converter, arg); + v = PyObject_CallOneArg(converter, arg); if (v == NULL) { _ctypes_extend_error(PyExc_ArgError, "argument %zd: ", i+1); goto cleanup; @@ -1835,7 +1835,7 @@ pointer(PyObject *self, PyObject *arg) typ = PyDict_GetItemWithError(_ctypes_ptrtype_cache, (PyObject *)Py_TYPE(arg)); if (typ) { - return _PyObject_CallOneArg(typ, arg); + return PyObject_CallOneArg(typ, arg); } else if (PyErr_Occurred()) { return NULL; @@ -1843,7 +1843,7 @@ pointer(PyObject *self, PyObject *arg) typ = POINTER(NULL, (PyObject *)Py_TYPE(arg)); if (typ == NULL) return NULL; - result = _PyObject_CallOneArg(typ, arg); + result = PyObject_CallOneArg(typ, arg); Py_DECREF(typ); return result; } diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index c096eab43ea..a04b295378e 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2671,7 +2671,7 @@ treebuilder_append_event(TreeBuilderObject *self, PyObject *action, PyObject *event = PyTuple_Pack(2, action, node); if (event == NULL) return -1; - res = _PyObject_CallOneArg(self->events_append, event); + res = PyObject_CallOneArg(self->events_append, event); Py_DECREF(event); if (res == NULL) return -1; @@ -2837,7 +2837,7 @@ treebuilder_handle_comment(TreeBuilderObject* self, PyObject* text) } if (self->comment_factory) { - comment = _PyObject_CallOneArg(self->comment_factory, text); + comment = PyObject_CallOneArg(self->comment_factory, text); if (!comment) return NULL; @@ -3179,7 +3179,7 @@ expat_set_error(enum XML_Error error_code, Py_ssize_t line, Py_ssize_t column, if (errmsg == NULL) return; - error = _PyObject_CallOneArg(st->parseerror_obj, errmsg); + error = PyObject_CallOneArg(st->parseerror_obj, errmsg); Py_DECREF(errmsg); if (!error) return; @@ -3242,7 +3242,7 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in, (TreeBuilderObject*) self->target, value ); else if (self->handle_data) - res = _PyObject_CallOneArg(self->handle_data, value); + res = PyObject_CallOneArg(self->handle_data, value); else res = NULL; Py_XDECREF(res); @@ -3353,7 +3353,7 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in, /* shortcut */ res = treebuilder_handle_data((TreeBuilderObject*) self->target, data); else if (self->handle_data) - res = _PyObject_CallOneArg(self->handle_data, data); + res = PyObject_CallOneArg(self->handle_data, data); else res = NULL; @@ -3380,7 +3380,7 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) else if (self->handle_end) { tag = makeuniversal(self, tag_in); if (tag) { - res = _PyObject_CallOneArg(self->handle_end, tag); + res = PyObject_CallOneArg(self->handle_end, tag); Py_DECREF(tag); } } @@ -3467,7 +3467,7 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) if (!prefix) return; - res = _PyObject_CallOneArg(self->handle_end_ns, prefix); + res = PyObject_CallOneArg(self->handle_end_ns, prefix); Py_DECREF(prefix); } @@ -3499,7 +3499,7 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) if (!comment) return; - res = _PyObject_CallOneArg(self->handle_comment, comment); + res = PyObject_CallOneArg(self->handle_comment, comment); Py_XDECREF(res); Py_DECREF(comment); } diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 50d8c58e954..88c02d82dca 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -213,7 +213,7 @@ partial_vectorcall(partialobject *pto, PyObject *const *args, static void partial_setvectorcall(partialobject *pto) { - if (_PyVectorcall_Function(pto->fn) == NULL) { + if (PyVectorcall_Function(pto->fn) == NULL) { /* Don't use vectorcall if the underlying function doesn't support it */ pto->vectorcall = NULL; } @@ -440,7 +440,7 @@ static PyTypeObject partial_type = { 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ partial_doc, /* tp_doc */ (traverseproc)partial_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index ddd17a2863c..6f55577813c 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -461,7 +461,7 @@ static PyObject * buffered_simple_flush(buffered *self, PyObject *args) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_flush); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_flush); } static int @@ -513,7 +513,7 @@ buffered_close(buffered *self, PyObject *args) } /* flush() will most probably re-take the lock, so drop it first */ LEAVE_BUFFERED(self) - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (!ENTER_BUFFERED(self)) return NULL; if (res == NULL) @@ -521,7 +521,7 @@ buffered_close(buffered *self, PyObject *args) else Py_DECREF(res); - res = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_close); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_close); if (self->buffer) { PyMem_Free(self->buffer); @@ -545,7 +545,7 @@ buffered_detach(buffered *self, PyObject *Py_UNUSED(ignored)) { PyObject *raw, *res; CHECK_INITIALIZED(self) - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -562,21 +562,21 @@ static PyObject * buffered_seekable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_seekable); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_seekable); } static PyObject * buffered_readable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_readable); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_readable); } static PyObject * buffered_writable(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_writable); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_writable); } static PyObject * @@ -599,14 +599,14 @@ static PyObject * buffered_fileno(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_fileno); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_fileno); } static PyObject * buffered_isatty(buffered *self, PyObject *Py_UNUSED(ignored)) { CHECK_INITIALIZED(self) - return _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_isatty); + return PyObject_CallMethodNoArgs(self->raw, _PyIO_str_isatty); } /* Forward decls */ @@ -670,7 +670,7 @@ _buffered_raw_tell(buffered *self) { Py_off_t n; PyObject *res; - res = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_tell); + res = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_tell); if (res == NULL) return -1; n = PyNumber_AsOff_t(res, PyExc_ValueError); @@ -1324,7 +1324,7 @@ _io__Buffered_truncate_impl(buffered *self, PyObject *pos) goto end; Py_CLEAR(res); } - res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_truncate, pos); if (res == NULL) goto end; /* Reset cached position */ @@ -1351,7 +1351,7 @@ buffered_iternext(buffered *self) line = _buffered_readline(self, -1); } else { - line = _PyObject_CallMethodNoArgs((PyObject *)self, + line = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_readline); if (line && !PyBytes_Check(line)) { PyErr_Format(PyExc_OSError, @@ -1470,7 +1470,7 @@ _bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len) raised (see issue #10956). */ do { - res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_readinto, memobj); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_readinto, memobj); } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); if (res == NULL) @@ -1569,7 +1569,7 @@ _bufferedreader_read_all(buffered *self) } /* Read until EOF or until read() would block. */ - data = _PyObject_CallMethodNoArgs(self->raw, _PyIO_str_read); + data = PyObject_CallMethodNoArgs(self->raw, _PyIO_str_read); if (data == NULL) goto cleanup; if (data != Py_None && !PyBytes_Check(data)) { @@ -1818,7 +1818,7 @@ _bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len) */ do { errno = 0; - res = _PyObject_CallMethodOneArg(self->raw, _PyIO_str_write, memobj); + res = PyObject_CallMethodOneArg(self->raw, _PyIO_str_write, memobj); errnum = errno; } while (res == NULL && _PyIO_trap_eintr()); Py_DECREF(memobj); diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index d51fc944e1a..1ff35648e55 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -235,7 +235,7 @@ _io__IOBase_close_impl(PyObject *self) Py_RETURN_NONE; } - res = _PyObject_CallMethodNoArgs(self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs(self, _PyIO_str_flush); PyErr_Fetch(&exc, &val, &tb); rc = _PyObject_SetAttrId(self, &PyId___IOBase_closed, Py_True); @@ -281,7 +281,7 @@ iobase_finalize(PyObject *self) finalization process. */ if (_PyObject_SetAttrId(self, &PyId__finalizing, Py_True)) PyErr_Clear(); - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_close); /* Silencing I/O errors is bad, but printing spurious tracebacks is equally as bad, and potentially more frequent (because of shutdown issues). */ @@ -382,7 +382,7 @@ _io__IOBase_seekable_impl(PyObject *self) PyObject * _PyIOBase_check_seekable(PyObject *self, PyObject *args) { - PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_seekable); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_seekable); if (res == NULL) return NULL; if (res != Py_True) { @@ -415,7 +415,7 @@ _io__IOBase_readable_impl(PyObject *self) PyObject * _PyIOBase_check_readable(PyObject *self, PyObject *args) { - PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_readable); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_readable); if (res == NULL) return NULL; if (res != Py_True) { @@ -448,7 +448,7 @@ _io__IOBase_writable_impl(PyObject *self) PyObject * _PyIOBase_check_writable(PyObject *self, PyObject *args) { - PyObject *res = _PyObject_CallMethodNoArgs(self, _PyIO_str_writable); + PyObject *res = PyObject_CallMethodNoArgs(self, _PyIO_str_writable); if (res == NULL) return NULL; if (res != Py_True) { @@ -477,7 +477,7 @@ iobase_enter(PyObject *self, PyObject *args) static PyObject * iobase_exit(PyObject *self, PyObject *args) { - return _PyObject_CallMethodNoArgs(self, _PyIO_str_close); + return PyObject_CallMethodNoArgs(self, _PyIO_str_close); } /* Lower-level APIs */ @@ -556,7 +556,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_One); if (readahead == NULL) { /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR occurs so we needn't do it ourselves. */ @@ -655,7 +655,7 @@ iobase_iter(PyObject *self) static PyObject * iobase_iternext(PyObject *self) { - PyObject *line = _PyObject_CallMethodNoArgs(self, _PyIO_str_readline); + PyObject *line = PyObject_CallMethodNoArgs(self, _PyIO_str_readline); if (line == NULL) return NULL; diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c index 89b29bb8fbb..28d54e00d8a 100644 --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -408,7 +408,7 @@ stringio_iternext(stringio *self) } else { /* XXX is subclassing StringIO really supported? */ - line = _PyObject_CallMethodNoArgs((PyObject *)self, + line = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index c4c56cb04de..1d45c7ae2fa 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -527,7 +527,7 @@ _io_IncrementalNewlineDecoder_getstate_impl(nldecoder_object *self) unsigned long long flag; if (self->decoder != Py_None) { - PyObject *state = _PyObject_CallMethodNoArgs(self->decoder, + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_getstate); if (state == NULL) return NULL; @@ -601,7 +601,7 @@ _io_IncrementalNewlineDecoder_reset_impl(nldecoder_object *self) self->seennl = 0; self->pendingcr = 0; if (self->decoder != Py_None) - return _PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); + return PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else Py_RETURN_NONE; } @@ -963,7 +963,7 @@ _textiowrapper_fix_encoder_state(textio *self) self->encoding_start_of_stream = 1; - PyObject *cookieObj = _PyObject_CallMethodNoArgs( + PyObject *cookieObj = PyObject_CallMethodNoArgs( self->buffer, _PyIO_str_tell); if (cookieObj == NULL) { return -1; @@ -977,7 +977,7 @@ _textiowrapper_fix_encoder_state(textio *self) if (cmp == 0) { self->encoding_start_of_stream = 0; - PyObject *res = _PyObject_CallMethodOneArg( + PyObject *res = PyObject_CallMethodOneArg( self->encoder, _PyIO_str_setstate, _PyLong_Zero); if (res == NULL) { return -1; @@ -1386,7 +1386,7 @@ _io_TextIOWrapper_reconfigure_impl(textio *self, PyObject *encoding, return NULL; } - PyObject *res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + PyObject *res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) { return NULL; } @@ -1525,7 +1525,7 @@ _io_TextIOWrapper_detach_impl(textio *self) { PyObject *buffer, *res; CHECK_ATTACHED(self); - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); @@ -1597,7 +1597,7 @@ _textiowrapper_writeflush(textio *self) PyObject *ret; do { - ret = _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_write, b); + ret = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_write, b); } while (ret == NULL && _PyIO_trap_eintr()); Py_DECREF(b); if (ret == NULL) @@ -1667,7 +1667,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) self->encoding_start_of_stream = 0; } else - b = _PyObject_CallMethodOneArg(self->encoder, _PyIO_str_encode, text); + b = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_encode, text); Py_DECREF(text); if (b == NULL) @@ -1718,7 +1718,7 @@ _io_TextIOWrapper_write_impl(textio *self, PyObject *text) } if (needflush) { - ret = _PyObject_CallMethodNoArgs(self->buffer, _PyIO_str_flush); + ret = PyObject_CallMethodNoArgs(self->buffer, _PyIO_str_flush); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1808,7 +1808,7 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) /* To prepare for tell(), we need to snapshot a point in the file * where the decoder's input buffer is empty. */ - PyObject *state = _PyObject_CallMethodNoArgs(self->decoder, + PyObject *state = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_getstate); if (state == NULL) return -1; @@ -1849,7 +1849,7 @@ textiowrapper_read_chunk(textio *self, Py_ssize_t size_hint) if (chunk_size == NULL) goto fail; - input_chunk = _PyObject_CallMethodOneArg(self->buffer, + input_chunk = PyObject_CallMethodOneArg(self->buffer, (self->has_read1 ? _PyIO_str_read1: _PyIO_str_read), chunk_size); Py_DECREF(chunk_size); @@ -2393,7 +2393,7 @@ _textiowrapper_decoder_setstate(textio *self, cookie_type *cookie) utf-16, that we are expecting a BOM). */ if (cookie->start_pos == 0 && cookie->dec_flags == 0) - res = _PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); + res = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_reset); else res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "((yi))", "", cookie->dec_flags); @@ -2408,11 +2408,11 @@ _textiowrapper_encoder_reset(textio *self, int start_of_stream) { PyObject *res; if (start_of_stream) { - res = _PyObject_CallMethodNoArgs(self->encoder, _PyIO_str_reset); + res = PyObject_CallMethodNoArgs(self->encoder, _PyIO_str_reset); self->encoding_start_of_stream = 1; } else { - res = _PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate, + res = PyObject_CallMethodOneArg(self->encoder, _PyIO_str_setstate, _PyLong_Zero); self->encoding_start_of_stream = 0; } @@ -2537,7 +2537,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) goto fail; } - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) goto fail; Py_DECREF(res); @@ -2552,7 +2552,7 @@ _io_TextIOWrapper_seek_impl(textio *self, PyObject *cookieObj, int whence) posobj = PyLong_FromOff_t(cookie.start_pos); if (posobj == NULL) goto fail; - res = _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_seek, posobj); + res = PyObject_CallMethodOneArg(self->buffer, _PyIO_str_seek, posobj); Py_DECREF(posobj); if (res == NULL) goto fail; @@ -2700,14 +2700,14 @@ _io_TextIOWrapper_tell_impl(textio *self) chars_to_skip = self->decoded_chars_used; /* Decoder state will be restored at the end */ - saved_state = _PyObject_CallMethodNoArgs(self->decoder, + saved_state = PyObject_CallMethodNoArgs(self->decoder, _PyIO_str_getstate); if (saved_state == NULL) goto fail; #define DECODER_GETSTATE() do { \ PyObject *dec_buffer; \ - PyObject *_state = _PyObject_CallMethodNoArgs(self->decoder, \ + PyObject *_state = PyObject_CallMethodNoArgs(self->decoder, \ _PyIO_str_getstate); \ if (_state == NULL) \ goto fail; \ @@ -2870,12 +2870,12 @@ _io_TextIOWrapper_truncate_impl(textio *self, PyObject *pos) CHECK_ATTACHED(self) - res = _PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); + res = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_flush); if (res == NULL) return NULL; Py_DECREF(res); - return _PyObject_CallMethodOneArg(self->buffer, _PyIO_str_truncate, pos); + return PyObject_CallMethodOneArg(self->buffer, _PyIO_str_truncate, pos); } static PyObject * @@ -3084,7 +3084,7 @@ textiowrapper_iternext(textio *self) line = _textiowrapper_readline(self, -1); } else { - line = _PyObject_CallMethodNoArgs((PyObject *)self, + line = PyObject_CallMethodNoArgs((PyObject *)self, _PyIO_str_readline); if (line && !PyUnicode_Check(line)) { PyErr_Format(PyExc_OSError, diff --git a/Modules/_json.c b/Modules/_json.c index a70043b605f..ee2070c043e 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -777,14 +777,14 @@ _parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ss *next_idx_ptr = idx + 1; if (has_pairs_hook) { - val = _PyObject_CallOneArg(s->object_pairs_hook, rval); + val = PyObject_CallOneArg(s->object_pairs_hook, rval); Py_DECREF(rval); return val; } /* if object_hook is not None: rval = object_hook(rval) */ if (s->object_hook != Py_None) { - val = _PyObject_CallOneArg(s->object_hook, rval); + val = PyObject_CallOneArg(s->object_hook, rval); Py_DECREF(rval); return val; } @@ -890,7 +890,7 @@ _parse_constant(PyScannerObject *s, const char *constant, Py_ssize_t idx, Py_ssi return NULL; /* rval = parse_constant(constant) */ - rval = _PyObject_CallOneArg(s->parse_constant, cstr); + rval = PyObject_CallOneArg(s->parse_constant, cstr); idx += PyUnicode_GET_LENGTH(cstr); Py_DECREF(cstr); *next_idx_ptr = idx; @@ -989,7 +989,7 @@ _match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ idx - start); if (numstr == NULL) return NULL; - rval = _PyObject_CallOneArg(custom_func, numstr); + rval = PyObject_CallOneArg(custom_func, numstr); } else { Py_ssize_t i, n; @@ -1399,7 +1399,7 @@ encoder_encode_string(PyEncoderObject *s, PyObject *obj) if (s->fast_encode) { return s->fast_encode(NULL, obj); } - encoded = _PyObject_CallOneArg(s->encoder, obj); + encoded = PyObject_CallOneArg(s->encoder, obj); if (encoded != NULL && !PyUnicode_Check(encoded)) { PyErr_Format(PyExc_TypeError, "encoder() must return a string, not %.80s", @@ -1485,7 +1485,7 @@ encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, return -1; } } - newobj = _PyObject_CallOneArg(s->defaultfn, obj); + newobj = PyObject_CallOneArg(s->defaultfn, obj); if (newobj == NULL) { Py_XDECREF(ident); return -1; diff --git a/Modules/_operator.c b/Modules/_operator.c index 5aa229fa781..adee5fd7968 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -1682,7 +1682,7 @@ methodcaller_reduce(methodcallerobject *mc, PyObject *Py_UNUSED(ignored)) newargs[0] = (PyObject *)Py_TYPE(mc); newargs[1] = mc->name; - constructor = _PyObject_FastCallDict(partial, newargs, 2, mc->kwds); + constructor = PyObject_VectorcallDict(partial, newargs, 2, mc->kwds); Py_DECREF(partial); return Py_BuildValue("NO", constructor, mc->args); diff --git a/Modules/_pickle.c b/Modules/_pickle.c index 5f11fe5c88c..2ba7a168d0e 100644 --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -359,7 +359,7 @@ _Pickle_FastCall(PyObject *func, PyObject *obj) { PyObject *result; - result = _PyObject_CallOneArg(func, obj); + result = PyObject_CallOneArg(func, obj); Py_DECREF(obj); return result; } @@ -420,7 +420,7 @@ call_method(PyObject *func, PyObject *self, PyObject *obj) return PyObject_CallFunctionObjArgs(func, self, obj, NULL); } else { - return _PyObject_CallOneArg(func, obj); + return PyObject_CallOneArg(func, obj); } } @@ -2298,7 +2298,7 @@ _Pickler_write_bytes(PicklerObject *self, return -1; } } - result = _PyObject_CallOneArg(self->write, payload); + result = PyObject_CallOneArg(self->write, payload); Py_XDECREF(mem); if (result == NULL) { return -1; @@ -2506,7 +2506,7 @@ save_picklebuffer(PicklerObject *self, PyObject *obj) } int in_band = 1; if (self->buffer_callback != NULL) { - PyObject *ret = _PyObject_CallOneArg(self->buffer_callback, obj); + PyObject *ret = PyObject_CallOneArg(self->buffer_callback, obj); if (ret == NULL) { return -1; } @@ -4323,7 +4323,7 @@ save(PicklerObject *self, PyObject *obj, int pers_save) * regular reduction mechanism. */ if (self->reducer_override != NULL) { - reduce_value = _PyObject_CallOneArg(self->reducer_override, obj); + reduce_value = PyObject_CallOneArg(self->reducer_override, obj); if (reduce_value == NULL) { goto error; } diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 80bb44dce90..2aed79e14c4 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -80,7 +80,7 @@ _enable_gc(int need_to_reenable_gc, PyObject *gc_module) if (need_to_reenable_gc) { PyErr_Fetch(&exctype, &val, &tb); - result = _PyObject_CallMethodNoArgs( + result = PyObject_CallMethodNoArgs( gc_module, _posixsubprocessstate_global->enable); if (exctype != NULL) { PyErr_Restore(exctype, val, tb); @@ -657,7 +657,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) return NULL; - result = _PyObject_CallMethodNoArgs( + result = PyObject_CallMethodNoArgs( gc_module, _posixsubprocessstate_global->isenabled); if (result == NULL) { Py_DECREF(gc_module); @@ -669,7 +669,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) Py_DECREF(gc_module); return NULL; } - result = _PyObject_CallMethodNoArgs( + result = PyObject_CallMethodNoArgs( gc_module, _posixsubprocessstate_global->disable); if (result == NULL) { Py_DECREF(gc_module); diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 1f4bf74fc7a..f0fdb0382c5 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -287,7 +287,7 @@ random_seed(RandomObject *self, PyObject *arg) /* Calling int.__abs__() prevents calling arg.__abs__(), which might return an invalid value. See issue #31478. */ args[0] = arg; - n = _PyObject_Vectorcall(_randomstate_global->Long___abs__, args, 0, + n = PyObject_Vectorcall(_randomstate_global->Long___abs__, args, 0, NULL); } else { diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c index 7552d1b1453..758fc022f78 100644 --- a/Modules/_sqlite/cache.c +++ b/Modules/_sqlite/cache.c @@ -183,7 +183,7 @@ PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key) } } - /* We cannot replace this by _PyObject_CallOneArg() since + /* We cannot replace this by PyObject_CallOneArg() since * PyObject_CallFunction() has a special case when using a * single tuple as argument. */ data = PyObject_CallFunction(self->factory, "O", key); diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 64051669185..697295da9ce 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -308,7 +308,7 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args, factory = (PyObject*)&pysqlite_CursorType; } - cursor = _PyObject_CallOneArg(factory, (PyObject *)self); + cursor = PyObject_CallOneArg(factory, (PyObject *)self); if (cursor == NULL) return NULL; if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) { @@ -975,7 +975,7 @@ static void _trace_callback(void* user_arg, const char* statement_string) py_statement = PyUnicode_DecodeUTF8(statement_string, strlen(statement_string), "replace"); if (py_statement) { - ret = _PyObject_CallOneArg((PyObject*)user_arg, py_statement); + ret = PyObject_CallOneArg((PyObject*)user_arg, py_statement); Py_DECREF(py_statement); } @@ -1472,7 +1472,7 @@ pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args) goto finally; } - retval = _PyObject_CallOneArg(pyfn_iterdump, (PyObject *)self); + retval = PyObject_CallOneArg(pyfn_iterdump, (PyObject *)self); finally: Py_XDECREF(module); diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 06275ecb268..ab276db7826 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -266,7 +266,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self) item = PyBytes_FromStringAndSize(val_str, nbytes); if (!item) goto error; - converted = _PyObject_CallOneArg(converter, item); + converted = PyObject_CallOneArg(converter, item); Py_DECREF(item); } } else { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index bdcb174be43..bb0d19f653b 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -92,7 +92,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) Py_DECREF(key); if (adapter) { Py_INCREF(adapter); - adapted = _PyObject_CallOneArg(adapter, obj); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); return adapted; } @@ -105,7 +105,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = _PyObject_CallOneArg(adapter, obj); + adapted = PyObject_CallOneArg(adapter, obj); Py_DECREF(adapter); if (adapted == Py_None) { @@ -124,7 +124,7 @@ pysqlite_microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt) return NULL; } if (adapter) { - adapted = _PyObject_CallOneArg(adapter, proto); + adapted = PyObject_CallOneArg(adapter, proto); Py_DECREF(adapter); if (adapted == Py_None) { diff --git a/Modules/_sre.c b/Modules/_sre.c index 6518e98f04e..80c41849229 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1081,7 +1081,7 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, match = pattern_new_match(self, &state, 1); if (!match) goto error; - item = _PyObject_CallOneArg(filter, match); + item = PyObject_CallOneArg(filter, match); Py_DECREF(match); if (!item) goto error; diff --git a/Modules/_struct.c b/Modules/_struct.c index cc536b46a62..0cdfe268e64 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -2097,7 +2097,7 @@ cache_struct_converter(PyObject *fmt, PyStructObject **ptr) return 0; } - s_object = _PyObject_CallOneArg(_structmodulestate_global->PyStructType, fmt); + s_object = PyObject_CallOneArg(_structmodulestate_global->PyStructType, fmt); if (s_object != NULL) { if (PyDict_GET_SIZE(cache) >= MAXCACHE) PyDict_Clear(cache); diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index e6d30341cdf..eb31a0ef5c9 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -4846,7 +4846,7 @@ test_pyobject_fastcalldict(PyObject *self, PyObject *args) return NULL; } - return _PyObject_FastCallDict(func, stack, nargs, kwargs); + return PyObject_VectorcallDict(func, stack, nargs, kwargs); } @@ -4880,7 +4880,7 @@ test_pyobject_vectorcall(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "kwnames must be None or a tuple"); return NULL; } - return _PyObject_Vectorcall(func, stack, nargs, kwnames); + return PyObject_Vectorcall(func, stack, nargs, kwnames); } @@ -5253,7 +5253,7 @@ meth_fastcall_keywords(PyObject* self, PyObject* const* args, if (pyargs == NULL) { return NULL; } - PyObject *pykwargs = _PyObject_Vectorcall((PyObject*)&PyDict_Type, + PyObject *pykwargs = PyObject_Vectorcall((PyObject*)&PyDict_Type, args + nargs, 0, kwargs); return Py_BuildValue("NNN", _null_to_none(self), pyargs, pykwargs); } @@ -6133,7 +6133,7 @@ static PyTypeObject MethodDescriptorBase_Type = { .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptorObject, vectorcall), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_METHOD_DESCRIPTOR | _Py_TPFLAGS_HAVE_VECTORCALL, + Py_TPFLAGS_METHOD_DESCRIPTOR | Py_TPFLAGS_HAVE_VECTORCALL, .tp_descr_get = func_descr_get, }; @@ -6172,7 +6172,7 @@ static PyTypeObject MethodDescriptor2_Type = { .tp_new = MethodDescriptor2_new, .tp_call = PyVectorcall_Call, .tp_vectorcall_offset = offsetof(MethodDescriptor2Object, vectorcall), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | _Py_TPFLAGS_HAVE_VECTORCALL, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_VECTORCALL, }; PyDoc_STRVAR(heapgctype__doc__, diff --git a/Modules/_xxtestfuzz/fuzzer.c b/Modules/_xxtestfuzz/fuzzer.c index dae1eaeabd0..74ba819b8b5 100644 --- a/Modules/_xxtestfuzz/fuzzer.c +++ b/Modules/_xxtestfuzz/fuzzer.c @@ -104,7 +104,7 @@ static int fuzz_json_loads(const char* data, size_t size) { if (input_bytes == NULL) { return 0; } - PyObject* parsed = _PyObject_CallOneArg(json_loads_method, input_bytes); + PyObject* parsed = PyObject_CallOneArg(json_loads_method, input_bytes); if (parsed == NULL) { /* Ignore ValueError as the fuzzer will more than likely generate some invalid json and values */ @@ -263,7 +263,7 @@ static int fuzz_sre_match(const char* data, size_t size) { PyObject* pattern = compiled_patterns[idx]; PyObject* match_callable = PyObject_GetAttrString(pattern, "match"); - PyObject* matches = _PyObject_CallOneArg(match_callable, to_match); + PyObject* matches = PyObject_CallOneArg(match_callable, to_match); Py_XDECREF(matches); Py_DECREF(match_callable); diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h index 7ed836598b3..8f6f880cadf 100644 --- a/Modules/cjkcodecs/cjkcodecs.h +++ b/Modules/cjkcodecs/cjkcodecs.h @@ -291,7 +291,7 @@ getcodec(PyObject *self, PyObject *encoding) if (codecobj == NULL) return NULL; - r = _PyObject_CallOneArg(cofunc, codecobj); + r = PyObject_CallOneArg(cofunc, codecobj); Py_DECREF(codecobj); return r; diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 2dd63a9531e..3bc07b2d8d5 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -92,7 +92,7 @@ call_error_callback(PyObject *errors, PyObject *exc) if (cb == NULL) return NULL; - r = _PyObject_CallOneArg(cb, exc); + r = PyObject_CallOneArg(cb, exc); Py_DECREF(cb); return r; } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 5673f602837..cf164c17d7b 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -872,7 +872,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) _PyObject_ASSERT(op, callback != NULL); /* copy-paste of weakrefobject.c's handle_callback() */ - temp = _PyObject_CallOneArg(callback, (PyObject *)wr); + temp = PyObject_CallOneArg(callback, (PyObject *)wr); if (temp == NULL) PyErr_WriteUnraisable(callback); else diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 0dafb65c288..c00c2745d3f 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -134,7 +134,7 @@ groupby_step(groupbyobject *gbo) newkey = newvalue; Py_INCREF(newvalue); } else { - newkey = _PyObject_CallOneArg(gbo->keyfunc, newvalue); + newkey = PyObject_CallOneArg(gbo->keyfunc, newvalue); if (newkey == NULL) { Py_DECREF(newvalue); return -1; @@ -1219,7 +1219,7 @@ dropwhile_next(dropwhileobject *lz) if (lz->start == 1) return item; - good = _PyObject_CallOneArg(lz->func, item); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1382,7 +1382,7 @@ takewhile_next(takewhileobject *lz) if (item == NULL) return NULL; - good = _PyObject_CallOneArg(lz->func, item); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -3918,7 +3918,7 @@ filterfalse_next(filterfalseobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = _PyObject_CallOneArg(lz->func, item); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 90167342fee..a7f8b5086bb 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -119,7 +119,7 @@ set_error(xmlparseobject *self, enum XML_Error code) XML_ErrorString(code), lineno, column); if (buffer == NULL) return NULL; - err = _PyObject_CallOneArg(ErrorObject, buffer); + err = PyObject_CallOneArg(ErrorObject, buffer); Py_DECREF(buffer); if ( err != NULL && set_error_attr(err, "code", code) diff --git a/Objects/abstract.c b/Objects/abstract.c index 7ab58a8bd52..f0e01f7691b 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -179,7 +179,7 @@ PyObject_GetItem(PyObject *o, PyObject *key) return NULL; } if (meth) { - result = _PyObject_CallOneArg(meth, key); + result = PyObject_CallOneArg(meth, key); Py_DECREF(meth); return result; } @@ -780,7 +780,7 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) } /* And call it. */ - result = _PyObject_CallOneArg(meth, format_spec); + result = PyObject_CallOneArg(meth, format_spec); Py_DECREF(meth); if (result && !PyUnicode_Check(result)) { @@ -2502,7 +2502,7 @@ object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls return -1; } - PyObject *res = _PyObject_CallOneArg(checker, inst); + PyObject *res = PyObject_CallOneArg(checker, inst); _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); @@ -2588,7 +2588,7 @@ object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls) Py_DECREF(checker); return ok; } - PyObject *res = _PyObject_CallOneArg(checker, derived); + PyObject *res = PyObject_CallOneArg(checker, derived); _Py_LeaveRecursiveCall(tstate); Py_DECREF(checker); if (res != NULL) { diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index b2808c05b40..a3fc35ca4d2 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -89,7 +89,7 @@ _canresize(PyByteArrayObject *self) PyObject * PyByteArray_FromObject(PyObject *input) { - return _PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input); + return PyObject_CallOneArg((PyObject *)&PyByteArray_Type, input); } static PyObject * @@ -2015,7 +2015,7 @@ bytearray_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, type == &PyByteArray_Type); if (type != &PyByteArray_Type && result != NULL) { - Py_SETREF(result, _PyObject_CallOneArg((PyObject *)type, result)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index e139bed71bf..df3eddae6a3 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2259,7 +2259,7 @@ bytes_fromhex_impl(PyTypeObject *type, PyObject *string) { PyObject *result = _PyBytes_FromHex(string, 0); if (type != &PyBytes_Type && result != NULL) { - Py_SETREF(result, _PyObject_CallOneArg((PyObject *)type, result)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; } diff --git a/Objects/call.c b/Objects/call.c index d1d50b647f3..37d079d169d 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -95,7 +95,7 @@ _PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable, { assert(callable != NULL); - /* _PyObject_FastCallDict() must not be called with an exception set, + /* PyObject_VectorcallDict() must not be called with an exception set, because it can clear it (directly or indirectly) and so the caller loses its exception */ assert(!_PyErr_Occurred(tstate)); @@ -105,7 +105,7 @@ _PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable, assert(nargs == 0 || args != NULL); assert(kwargs == NULL || PyDict_Check(kwargs)); - vectorcallfunc func = _PyVectorcall_Function(callable); + vectorcallfunc func = PyVectorcall_Function(callable); if (func == NULL) { /* Use tp_call instead */ return _PyObject_MakeTpCall(tstate, callable, args, nargs, kwargs); @@ -133,7 +133,7 @@ _PyObject_FastCallDictTstate(PyThreadState *tstate, PyObject *callable, PyObject * -_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, +PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwargs) { PyThreadState *tstate = _PyThreadState_GET(); @@ -204,8 +204,8 @@ PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) { PyThreadState *tstate = _PyThreadState_GET(); - /* get vectorcallfunc as in _PyVectorcall_Function, but without - * the _Py_TPFLAGS_HAVE_VECTORCALL check */ + /* get vectorcallfunc as in PyVectorcall_Function, but without + * the Py_TPFLAGS_HAVE_VECTORCALL check */ Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset; if (offset <= 0) { _PyErr_Format(tstate, PyExc_TypeError, @@ -259,7 +259,7 @@ _PyObject_Call(PyThreadState *tstate, PyObject *callable, assert(PyTuple_Check(args)); assert(kwargs == NULL || PyDict_Check(kwargs)); - if (_PyVectorcall_Function(callable) != NULL) { + if (PyVectorcall_Function(callable) != NULL) { return PyVectorcall_Call(callable, args, kwargs); } else { @@ -796,7 +796,7 @@ object_vacall(PyThreadState *tstate, PyObject *base, PyObject * -_PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, +PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) { assert(name != NULL); diff --git a/Objects/classobject.c b/Objects/classobject.c index fb89b8aa693..33afbcd8747 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -350,7 +350,7 @@ PyTypeObject PyMethod_Type = { PyObject_GenericSetAttr, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ method_doc, /* tp_doc */ (traverseproc)method_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Objects/descrobject.c b/Objects/descrobject.c index 49c26eb0692..aaaa4479e4b 100644 --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -454,7 +454,7 @@ classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args, if (bound == NULL) { return NULL; } - PyObject *res = _PyObject_FastCallDict(bound, _PyTuple_ITEMS(args)+1, + PyObject *res = PyObject_VectorcallDict(bound, _PyTuple_ITEMS(args)+1, argc-1, kwds); Py_DECREF(bound); return res; @@ -673,7 +673,7 @@ PyTypeObject PyMethodDescr_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ 0, /* tp_doc */ descr_traverse, /* tp_traverse */ @@ -1493,7 +1493,7 @@ property_descr_get(PyObject *self, PyObject *obj, PyObject *type) return NULL; } - return _PyObject_CallOneArg(gs->prop_get, obj); + return PyObject_CallOneArg(gs->prop_get, obj); } static int @@ -1514,7 +1514,7 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value) return -1; } if (value == NULL) - res = _PyObject_CallOneArg(func, obj); + res = PyObject_CallOneArg(func, obj); else res = PyObject_CallFunctionObjArgs(func, obj, value, NULL); if (res == NULL) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 164104ed7e1..8f6ce3996a1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2127,7 +2127,7 @@ dict_subscript(PyDictObject *mp, PyObject *key) _Py_IDENTIFIER(__missing__); missing = _PyObject_LookupSpecial((PyObject *)mp, &PyId___missing__); if (missing != NULL) { - res = _PyObject_CallOneArg(missing, key); + res = PyObject_CallOneArg(missing, key); Py_DECREF(missing); return res; } diff --git a/Objects/fileobject.c b/Objects/fileobject.c index c0eff8bed51..840d17bee66 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -137,7 +137,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) Py_DECREF(writer); return -1; } - result = _PyObject_CallOneArg(writer, value); + result = PyObject_CallOneArg(writer, value); Py_DECREF(value); Py_DECREF(writer); if (result == NULL) diff --git a/Objects/floatobject.c b/Objects/floatobject.c index dfc5b196f18..648030b659c 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1490,7 +1490,7 @@ float_fromhex(PyTypeObject *type, PyObject *string) goto parse_error; result = PyFloat_FromDouble(negate ? -x : x); if (type != &PyFloat_Type && result != NULL) { - Py_SETREF(result, _PyObject_CallOneArg((PyObject *)type, result)); + Py_SETREF(result, PyObject_CallOneArg((PyObject *)type, result)); } return result; diff --git a/Objects/funcobject.c b/Objects/funcobject.c index ebe68adc336..419db33602a 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -654,7 +654,7 @@ PyTypeObject PyFunction_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL | + Py_TPFLAGS_HAVE_VECTORCALL | Py_TPFLAGS_METHOD_DESCRIPTOR, /* tp_flags */ func_new__doc__, /* tp_doc */ (traverseproc)func_traverse, /* tp_traverse */ diff --git a/Objects/genobject.c b/Objects/genobject.c index 652c2903dd2..576d6856c7f 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -58,7 +58,7 @@ _PyGen_Finalize(PyObject *self) /* Save the current exception, if any. */ PyErr_Fetch(&error_type, &error_value, &error_traceback); - res = _PyObject_CallOneArg(finalizer, self); + res = PyObject_CallOneArg(finalizer, self); if (res == NULL) { PyErr_WriteUnraisable(self); @@ -563,7 +563,7 @@ _PyGen_SetStopIterationValue(PyObject *value) return 0; } /* Construct an exception instance manually with - * _PyObject_CallOneArg and pass it to PyErr_SetObject. + * PyObject_CallOneArg and pass it to PyErr_SetObject. * * We do this to handle a situation when "value" is a tuple, in which * case PyErr_SetObject would set the value of StopIteration to @@ -571,7 +571,7 @@ _PyGen_SetStopIterationValue(PyObject *value) * * (See PyErr_SetObject/_PyErr_CreateException code for details.) */ - e = _PyObject_CallOneArg(PyExc_StopIteration, value); + e = PyObject_CallOneArg(PyExc_StopIteration, value); if (e == NULL) { return -1; } @@ -1264,7 +1264,7 @@ async_gen_init_hooks(PyAsyncGenObject *o) PyObject *res; Py_INCREF(firstiter); - res = _PyObject_CallOneArg(firstiter, (PyObject *)o); + res = PyObject_CallOneArg(firstiter, (PyObject *)o); Py_DECREF(firstiter); if (res == NULL) { return 1; diff --git a/Objects/listobject.c b/Objects/listobject.c index a406e70694a..3c39c6444bf 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2226,7 +2226,7 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse) } for (i = 0; i < saved_ob_size ; i++) { - keys[i] = _PyObject_CallOneArg(keyfunc, saved_ob_item[i]); + keys[i] = PyObject_CallOneArg(keyfunc, saved_ob_item[i]); if (keys[i] == NULL) { for (i=i-1 ; i>=0 ; i--) Py_DECREF(keys[i]); diff --git a/Objects/longobject.c b/Objects/longobject.c index b4d0b0575bc..5d225cbd2fb 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -5547,7 +5547,7 @@ int_from_bytes_impl(PyTypeObject *type, PyObject *bytes_obj, Py_DECREF(bytes); if (long_obj != NULL && type != &PyLong_Type) { - Py_SETREF(long_obj, _PyObject_CallOneArg((PyObject *)type, long_obj)); + Py_SETREF(long_obj, PyObject_CallOneArg((PyObject *)type, long_obj)); } return long_obj; diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index d9dd11733ef..906d1cef69b 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1963,7 +1963,7 @@ struct_get_unpacker(const char *fmt, Py_ssize_t itemsize) if (format == NULL) goto error; - structobj = _PyObject_CallOneArg(Struct, format); + structobj = PyObject_CallOneArg(Struct, format); if (structobj == NULL) goto error; @@ -2002,7 +2002,7 @@ struct_unpack_single(const char *ptr, struct unpacker *x) PyObject *v; memcpy(x->item, ptr, x->itemsize); - v = _PyObject_CallOneArg(x->unpack_from, x->mview); + v = PyObject_CallOneArg(x->unpack_from, x->mview); if (v == NULL) return NULL; diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 2a8111fea1c..1d54c4cea69 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -298,7 +298,7 @@ PyTypeObject PyCFunction_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ 0, /* tp_doc */ (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 0a593261c41..30de53d902b 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -738,7 +738,7 @@ module_getattro(PyModuleObject *m, PyObject *name) _Py_IDENTIFIER(__getattr__); getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__); if (getattr) { - return _PyObject_CallOneArg(getattr, name); + return PyObject_CallOneArg(getattr, name); } mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__); if (mod_name && PyUnicode_Check(mod_name)) { diff --git a/Objects/typeobject.c b/Objects/typeobject.c index e6a84b017aa..f32ccb13798 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1465,7 +1465,7 @@ static PyObject* call_unbound_noarg(int unbound, PyObject *func, PyObject *self) { if (unbound) { - return _PyObject_CallOneArg(func, self); + return PyObject_CallOneArg(func, self); } else { return _PyObject_CallNoArg(func); @@ -3665,7 +3665,7 @@ PyTypeObject PyType_Type = { 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS | - _Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ + Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ type_doc, /* tp_doc */ (traverseproc)type_traverse, /* tp_traverse */ (inquiry)type_clear, /* tp_clear */ @@ -5196,17 +5196,17 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) /* tp_hash see tp_richcompare */ { /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call(). - * If _Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall + * If Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall * won't be used automatically. */ COPYSLOT(tp_vectorcall_offset); - /* Inherit _Py_TPFLAGS_HAVE_VECTORCALL for non-heap types + /* Inherit Py_TPFLAGS_HAVE_VECTORCALL for non-heap types * if tp_call is not overridden */ if (!type->tp_call && - (base->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) && + (base->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { - type->tp_flags |= _Py_TPFLAGS_HAVE_VECTORCALL; + type->tp_flags |= Py_TPFLAGS_HAVE_VECTORCALL; } COPYSLOT(tp_call); } @@ -5282,14 +5282,14 @@ PyType_Ready(PyTypeObject *type) /* Consistency checks for PEP 590: * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get - * - _Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and + * - Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and * tp_vectorcall_offset > 0 * To avoid mistakes, we require this before inheriting. */ if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) { _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL); } - if (type->tp_flags & _Py_TPFLAGS_HAVE_VECTORCALL) { + if (type->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) { _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0); _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL); } @@ -6614,7 +6614,7 @@ call_attribute(PyObject *self, PyObject *attr, PyObject *name) else attr = descr; } - res = _PyObject_CallOneArg(attr, name); + res = PyObject_CallOneArg(attr, name); Py_XDECREF(descr); return res; } @@ -7575,7 +7575,7 @@ init_subclass(PyTypeObject *type, PyObject *kwds) } - result = _PyObject_FastCallDict(func, NULL, 0, kwds); + result = PyObject_VectorcallDict(func, NULL, 0, kwds); Py_DECREF(func); if (result == NULL) { return -1; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index aa874f2a12d..68e4f6af131 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4250,7 +4250,7 @@ unicode_decode_call_errorhandler_wchar( if (*exceptionObject == NULL) goto onError; - restuple = _PyObject_CallOneArg(*errorHandler, *exceptionObject); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -4354,7 +4354,7 @@ unicode_decode_call_errorhandler_writer( if (*exceptionObject == NULL) goto onError; - restuple = _PyObject_CallOneArg(*errorHandler, *exceptionObject); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) goto onError; if (!PyTuple_Check(restuple)) { @@ -6801,7 +6801,7 @@ unicode_encode_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = _PyObject_CallOneArg(*errorHandler, *exceptionObject); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { @@ -8783,7 +8783,7 @@ unicode_translate_call_errorhandler(const char *errors, if (*exceptionObject == NULL) return NULL; - restuple = _PyObject_CallOneArg(*errorHandler, *exceptionObject); + restuple = PyObject_CallOneArg(*errorHandler, *exceptionObject); if (restuple == NULL) return NULL; if (!PyTuple_Check(restuple)) { diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 18c737e7e40..7a5d9fb88af 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -933,7 +933,7 @@ PyWeakref_GetObject(PyObject *ref) static void handle_callback(PyWeakReference *ref, PyObject *callback) { - PyObject *cbresult = _PyObject_CallOneArg(callback, (PyObject *)ref); + PyObject *cbresult = PyObject_CallOneArg(callback, (PyObject *)ref); if (cbresult == NULL) PyErr_WriteUnraisable(callback); diff --git a/Python/_warnings.c b/Python/_warnings.c index 9e8b52d353d..acef313fc9f 100644 --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -593,7 +593,7 @@ call_show_warning(PyObject *category, PyObject *text, PyObject *message, if (msg == NULL) goto error; - res = _PyObject_CallOneArg(show_fn, msg); + res = PyObject_CallOneArg(show_fn, msg); Py_DECREF(show_fn); Py_DECREF(msg); @@ -654,7 +654,7 @@ warn_explicit(PyObject *category, PyObject *message, } else { text = message; - message = _PyObject_CallOneArg(category, message); + message = PyObject_CallOneArg(category, message); if (message == NULL) goto cleanup; } @@ -997,7 +997,7 @@ get_source_line(PyObject *module_globals, int lineno) return NULL; } /* Call get_source() to get the source code. */ - source = _PyObject_CallOneArg(get_source, module_name); + source = PyObject_CallOneArg(get_source, module_name); Py_DECREF(get_source); Py_DECREF(module_name); if (!source) { @@ -1284,7 +1284,7 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro) int warned = 0; PyObject *fn = get_warnings_attr(&PyId__warn_unawaited_coroutine, 1); if (fn) { - PyObject *res = _PyObject_CallOneArg(fn, coro); + PyObject *res = PyObject_CallOneArg(fn, coro); Py_DECREF(fn); if (res || PyErr_ExceptionMatches(PyExc_RuntimeWarning)) { warned = 1; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 980b81041b4..cb048af9785 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -56,7 +56,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs) } continue; } - new_base = _PyObject_CallOneArg(meth, bases); + new_base = PyObject_CallOneArg(meth, bases); Py_DECREF(meth); if (!new_base) { goto error; @@ -203,7 +203,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } else { PyObject *pargs[2] = {name, bases}; - ns = _PyObject_FastCallDict(prep, pargs, 2, mkw); + ns = PyObject_VectorcallDict(prep, pargs, 2, mkw); Py_DECREF(prep); } if (ns == NULL) { @@ -229,7 +229,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs, } } PyObject *margs[3] = {name, bases, ns}; - cls = _PyObject_FastCallDict(meta, margs, 3, mkw); + cls = PyObject_VectorcallDict(meta, margs, 3, mkw); if (cls != NULL && PyType_Check(cls) && PyCell_Check(cell)) { PyObject *cell_cls = PyCell_GET(cell); if (cell_cls != cls) { @@ -489,7 +489,7 @@ builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb } Py_INCREF(hook); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; } @@ -575,7 +575,7 @@ filter_next(filterobject *lz) ok = PyObject_IsTrue(item); } else { PyObject *good; - good = _PyObject_CallOneArg(lz->func, item); + good = PyObject_CallOneArg(lz->func, item); if (good == NULL) { Py_DECREF(item); return NULL; @@ -1631,7 +1631,7 @@ min_max(PyObject *args, PyObject *kwds, int op) while (( item = PyIter_Next(it) )) { /* get the value from the key function */ if (keyfunc != NULL) { - val = _PyObject_CallOneArg(keyfunc, item); + val = PyObject_CallOneArg(keyfunc, item); if (val == NULL) goto Fail_it_item; } @@ -2178,7 +2178,7 @@ builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits) if (ndigits == Py_None) result = _PyObject_CallNoArg(round); else - result = _PyObject_CallOneArg(round, ndigits); + result = PyObject_CallOneArg(round, ndigits); Py_DECREF(round); return result; } @@ -2234,7 +2234,7 @@ builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject } assert(nargs >= 1); - v = _PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); + v = PyObject_Vectorcall(callable, args + 1, nargs - 1, kwnames); Py_DECREF(callable); if (v == NULL) { Py_DECREF(newlist); diff --git a/Python/ceval.c b/Python/ceval.c index deba99ed7ac..eb0f131ae8c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1874,7 +1874,7 @@ main_loop: Py_DECREF(value); goto error; } - res = _PyObject_CallOneArg(hook, value); + res = PyObject_CallOneArg(hook, value); Py_DECREF(value); if (res == NULL) goto error; @@ -3271,7 +3271,7 @@ main_loop: assert(!PyLong_Check(exc)); exit_func = PEEK(7); PyObject *stack[4] = {NULL, exc, val, tb}; - res = _PyObject_Vectorcall(exit_func, stack + 1, + res = PyObject_Vectorcall(exit_func, stack + 1, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); if (res == NULL) goto error; @@ -4846,7 +4846,7 @@ trace_call_function(PyThreadState *tstate, { PyObject *x; if (PyCFunction_Check(func)) { - C_TRACE(x, _PyObject_Vectorcall(func, args, nargs, kwnames)); + C_TRACE(x, PyObject_Vectorcall(func, args, nargs, kwnames)); return x; } else if (Py_TYPE(func) == &PyMethodDescr_Type && nargs > 0) { @@ -4862,13 +4862,13 @@ trace_call_function(PyThreadState *tstate, if (func == NULL) { return NULL; } - C_TRACE(x, _PyObject_Vectorcall(func, + C_TRACE(x, PyObject_Vectorcall(func, args+1, nargs-1, kwnames)); Py_DECREF(func); return x; } - return _PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + return PyObject_Vectorcall(func, args, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } /* Issue #29227: Inline call_function() into _PyEval_EvalFrameDefault() @@ -4887,7 +4887,7 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO x = trace_call_function(tstate, func, stack, nargs, kwnames); } else { - x = _PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); + x = PyObject_Vectorcall(func, stack, nargs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwnames); } assert((x != NULL) ^ (_PyErr_Occurred(tstate) != NULL)); diff --git a/Python/codecs.c b/Python/codecs.c index ee2758c5fbe..ce86cb20ccc 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -147,7 +147,7 @@ PyObject *_PyCodec_Lookup(const char *encoding) func = PyList_GetItem(interp->codec_search_path, i); if (func == NULL) goto onError; - result = _PyObject_CallOneArg(func, v); + result = PyObject_CallOneArg(func, v); if (result == NULL) goto onError; if (result == Py_None) { @@ -317,7 +317,7 @@ PyObject *codec_getstreamcodec(const char *encoding, if (errors != NULL) streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors); else - streamcodec = _PyObject_CallOneArg(codeccls, stream); + streamcodec = PyObject_CallOneArg(codeccls, stream); Py_DECREF(codecs); return streamcodec; } diff --git a/Python/errors.c b/Python/errors.c index 652f4c9de7a..f11b66e7958 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -93,7 +93,7 @@ _PyErr_CreateException(PyObject *exception, PyObject *value) return PyObject_Call(exception, value, NULL); } else { - return _PyObject_CallOneArg(exception, value); + return PyObject_CallOneArg(exception, value); } } @@ -907,7 +907,7 @@ PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, goto done; } - error = _PyObject_FastCallDict(exception, &msg, 1, kwargs); + error = PyObject_VectorcallDict(exception, &msg, 1, kwargs); if (error != NULL) { _PyErr_SetObject(tstate, (PyObject *)Py_TYPE(error), error); Py_DECREF(error); @@ -1422,7 +1422,7 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) goto default_hook; } - PyObject *res = _PyObject_CallOneArg(hook, hook_args); + PyObject *res = PyObject_CallOneArg(hook, hook_args); Py_DECREF(hook_args); if (res != NULL) { Py_DECREF(res); diff --git a/Python/import.c b/Python/import.c index 8bf044827c6..392d711299e 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1206,7 +1206,7 @@ get_path_importer(PyThreadState *tstate, PyObject *path_importer_cache, PyObject *hook = PyList_GetItem(path_hooks, j); if (hook == NULL) return NULL; - importer = _PyObject_CallOneArg(hook, p); + importer = PyObject_CallOneArg(hook, p); if (importer != NULL) break; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 707a08e7f49..a7f8c0b7196 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -519,7 +519,7 @@ sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb return NULL; } PyMem_RawFree(envar); - PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); + PyObject *retval = PyObject_Vectorcall(hook, args, nargs, keywords); Py_DECREF(hook); return retval; From f3fda374685dffa31ebda9e681e00ef7032b8a1d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 11 Feb 2020 17:50:10 +0100 Subject: [PATCH 350/380] bpo-38644: Rephrase What's New entry (GH-18461) --- Doc/whatsnew/3.9.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 4f4c7f2808d..c0404101d7c 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -356,8 +356,9 @@ Build and C API Changes * Provide :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` as regular functions for the limited API. Previously, there were defined as - macros, but these macros didn't work with the limited API which cannot - access ``PyThreadState.recursion_depth`` field. + macros, but these macros didn't compile with the limited C API which cannot + access ``PyThreadState.recursion_depth`` field (the structure is opaque in + the limited C API). * Exclude the following functions from the limited C API: From b138dd296a206e92ebec09b540bb88a1539563e4 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 11 Feb 2020 17:32:52 +0000 Subject: [PATCH 351/380] Fix ordering issue in Windows release upload script (GH-18465) Automerge-Triggered-By: @zooba --- .../windows-release/stage-publish-pythonorg.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml index 8c95f1b950c..0474d40e4bc 100644 --- a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml +++ b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml @@ -39,11 +39,6 @@ jobs: artifactName: embed downloadPath: $(Build.BinariesDirectory) - - powershell: 'gci *embed-arm*.zip | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' - displayName: 'Prevent publishing ARM/ARM64 packages' - workingDirectory: '$(Build.BinariesDirectory)\embed' - condition: and(succeeded(), not(variables['PublishArmPackages'])) - - task: DownloadPipelineArtifact@1 displayName: 'Download artifact from $(BuildToPublish): Doc' condition: and(succeeded(), variables['BuildToPublish']) @@ -80,6 +75,11 @@ jobs: buildVersionToDownload: specific buildId: $(BuildToPublish) + - powershell: 'gci *embed-arm*.zip | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' + displayName: 'Prevent publishing ARM/ARM64 packages' + workingDirectory: '$(Build.BinariesDirectory)\embed' + condition: and(succeeded(), not(variables['PublishArmPackages'])) + - template: ./gpg-sign.yml parameters: From 029e8401b7741cc0964b5f38d2c2264749dbff6b Mon Sep 17 00:00:00 2001 From: "@RandyMcMillan" Date: Tue, 11 Feb 2020 20:20:05 -0500 Subject: [PATCH 352/380] docs: macos - change "versiona" to "versions" (GH-18467) --- Mac/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mac/README.rst b/Mac/README.rst index 4f2e2ce6623..ec7d873df27 100644 --- a/Mac/README.rst +++ b/Mac/README.rst @@ -49,7 +49,7 @@ macOS specific arguments to configure system header files in their traditional locations, like ``/usr/include`` and ``/System/Library/Frameworks``; instead they are found within a MacOSX SDK. The Apple-supplied build tools handle this transparently and current - versiona of Python now handle this as well. So it is no longer necessary, + versions of Python now handle this as well. So it is no longer necessary, and since macOS 10.14, no longer possible to force the installation of system headers with ``xcode-select``. From e6be9b59a911626d6597fe148c32f0342bd2bd24 Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Tue, 11 Feb 2020 20:28:35 -0600 Subject: [PATCH 353/380] closes bpo-39605: Fix some casts to not cast away const. (GH-18453) gcc -Wcast-qual turns up a number of instances of casting away constness of pointers. Some of these can be safely modified, by either: Adding the const to the type cast, as in: - return _PyUnicode_FromUCS1((unsigned char*)s, size); + return _PyUnicode_FromUCS1((const unsigned char*)s, size); or, Removing the cast entirely, because it's not necessary (but probably was at one time), as in: - PyDTrace_FUNCTION_ENTRY((char *)filename, (char *)funcname, lineno); + PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); These changes will not change code, but they will make it much easier to check for errors in consts --- Modules/_io/textio.c | 4 ++-- Objects/bytes_methods.c | 16 ++++++++-------- Objects/memoryobject.c | 8 ++++---- Objects/stringlib/asciilib.h | 2 +- Objects/stringlib/codecs.h | 4 ++-- Objects/stringlib/find_max_char.h | 2 +- Objects/unicodeobject.c | 30 +++++++++++++++--------------- Python/ceval.c | 6 +++--- Python/marshal.c | 2 +- Python/pyhash.c | 2 +- Python/sysmodule.c | 2 +- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 1d45c7ae2fa..3a9ce93a5eb 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2025,7 +2025,7 @@ find_control_char(int kind, const char *s, const char *end, Py_UCS4 ch) { if (kind == PyUnicode_1BYTE_KIND) { assert(ch < 256); - return (char *) memchr((void *) s, (char) ch, end - s); + return (char *) memchr((const void *) s, (char) ch, end - s); } for (;;) { while (PyUnicode_READ(kind, s, 0) > ch) @@ -2043,7 +2043,7 @@ _PyIO_find_line_ending( int translated, int universal, PyObject *readnl, int kind, const char *start, const char *end, Py_ssize_t *consumed) { - Py_ssize_t len = ((char*)end - (char*)start)/kind; + Py_ssize_t len = (end - start)/kind; if (translated) { /* Newlines are already translated, only search for \n */ diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index 7d131842059..db030be4fe7 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -12,7 +12,7 @@ PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; /* Shortcut for single character strings */ @@ -42,7 +42,7 @@ PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; /* Shortcut for single character strings */ @@ -72,7 +72,7 @@ PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; /* Shortcut for single character strings */ @@ -123,7 +123,7 @@ _Py_bytes_isascii(const char *cptr, Py_ssize_t len) /* Help allocation */ const char *_p = p; while (_p < aligned_end) { - unsigned long value = *(unsigned long *) _p; + unsigned long value = *(const unsigned long *) _p; if (value & ASCII_CHAR_MASK) { Py_RETURN_FALSE; } @@ -154,7 +154,7 @@ PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; /* Shortcut for single character strings */ @@ -184,7 +184,7 @@ PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; int cased; @@ -218,7 +218,7 @@ PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; int cased; @@ -254,7 +254,7 @@ PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len) { const unsigned char *p - = (unsigned char *) cptr; + = (const unsigned char *) cptr; const unsigned char *e; int cased, previous_is_cased; diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 906d1cef69b..6887c4335f1 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1682,8 +1682,8 @@ unpack_single(const char *ptr, const char *fmt) switch (fmt[0]) { /* signed integers and fast path for 'B' */ - case 'B': uc = *((unsigned char *)ptr); goto convert_uc; - case 'b': ld = *((signed char *)ptr); goto convert_ld; + case 'B': uc = *((const unsigned char *)ptr); goto convert_uc; + case 'b': ld = *((const signed char *)ptr); goto convert_ld; case 'h': UNPACK_SINGLE(ld, ptr, short); goto convert_ld; case 'i': UNPACK_SINGLE(ld, ptr, int); goto convert_ld; case 'l': UNPACK_SINGLE(ld, ptr, long); goto convert_ld; @@ -2684,8 +2684,8 @@ unpack_cmp(const char *p, const char *q, char fmt, switch (fmt) { /* signed integers and fast path for 'B' */ - case 'B': return *((unsigned char *)p) == *((unsigned char *)q); - case 'b': return *((signed char *)p) == *((signed char *)q); + case 'B': return *((const unsigned char *)p) == *((const unsigned char *)q); + case 'b': return *((const signed char *)p) == *((const signed char *)q); case 'h': CMP_SINGLE(p, q, short); return equal; case 'i': CMP_SINGLE(p, q, int); return equal; case 'l': CMP_SINGLE(p, q, long); return equal; diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index e95552624aa..e69a2c076e3 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -18,7 +18,7 @@ #define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL #define STRINGLIB_STR PyUnicode_1BYTE_DATA #define STRINGLIB_LEN PyUnicode_GET_LENGTH -#define STRINGLIB_NEW(STR,LEN) _PyUnicode_FromASCII((char*)(STR),(LEN)) +#define STRINGLIB_NEW(STR,LEN) _PyUnicode_FromASCII((const char*)(STR),(LEN)) #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h index d6f2b98f2b3..269a5581f70 100644 --- a/Objects/stringlib/codecs.h +++ b/Objects/stringlib/codecs.h @@ -46,7 +46,7 @@ STRINGLIB(utf8_decode)(const char **inptr, const char *end, /* Read a whole long at a time (either 4 or 8 bytes), and do a fast unrolled copy if it only contains ASCII characters. */ - unsigned long value = *(unsigned long *) _s; + unsigned long value = *(const unsigned long *) _s; if (value & ASCII_CHAR_MASK) break; #if PY_LITTLE_ENDIAN @@ -515,7 +515,7 @@ STRINGLIB(utf16_decode)(const unsigned char **inptr, const unsigned char *e, /* Fast path for runs of in-range non-surrogate chars. */ const unsigned char *_q = q; while (_q < aligned_end) { - unsigned long block = * (unsigned long *) _q; + unsigned long block = * (const unsigned long *) _q; if (native_ordering) { /* Can use buffer directly */ if (block & FAST_CHAR_MASK) diff --git a/Objects/stringlib/find_max_char.h b/Objects/stringlib/find_max_char.h index 8ccbc309446..f4e0a7761d3 100644 --- a/Objects/stringlib/find_max_char.h +++ b/Objects/stringlib/find_max_char.h @@ -28,7 +28,7 @@ STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end) /* Help register allocation */ const unsigned char *_p = p; while (_p < aligned_end) { - unsigned long value = *(unsigned long *) _p; + unsigned long value = *(const unsigned long *) _p; if (value & UCS1_ASCII_CHAR_MASK) return 255; _p += SIZEOF_LONG; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 68e4f6af131..fdc2ca6612c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -172,8 +172,8 @@ extern "C" { #define _PyUnicode_CONVERT_BYTES(from_type, to_type, begin, end, to) \ do { \ to_type *_to = (to_type *)(to); \ - const from_type *_iter = (from_type *)(begin); \ - const from_type *_end = (from_type *)(end); \ + const from_type *_iter = (const from_type *)(begin);\ + const from_type *_end = (const from_type *)(end);\ Py_ssize_t n = (_end) - (_iter); \ const from_type *_unrolled_end = \ _iter + _Py_SIZE_ROUND_DOWN(n, 4); \ @@ -964,21 +964,21 @@ findchar(const void *s, int kind, if ((Py_UCS1) ch != ch) return -1; if (direction > 0) - return ucs1lib_find_char((Py_UCS1 *) s, size, (Py_UCS1) ch); + return ucs1lib_find_char((const Py_UCS1 *) s, size, (Py_UCS1) ch); else - return ucs1lib_rfind_char((Py_UCS1 *) s, size, (Py_UCS1) ch); + return ucs1lib_rfind_char((const Py_UCS1 *) s, size, (Py_UCS1) ch); case PyUnicode_2BYTE_KIND: if ((Py_UCS2) ch != ch) return -1; if (direction > 0) - return ucs2lib_find_char((Py_UCS2 *) s, size, (Py_UCS2) ch); + return ucs2lib_find_char((const Py_UCS2 *) s, size, (Py_UCS2) ch); else - return ucs2lib_rfind_char((Py_UCS2 *) s, size, (Py_UCS2) ch); + return ucs2lib_rfind_char((const Py_UCS2 *) s, size, (Py_UCS2) ch); case PyUnicode_4BYTE_KIND: if (direction > 0) - return ucs4lib_find_char((Py_UCS4 *) s, size, ch); + return ucs4lib_find_char((const Py_UCS4 *) s, size, ch); else - return ucs4lib_rfind_char((Py_UCS4 *) s, size, ch); + return ucs4lib_rfind_char((const Py_UCS4 *) s, size, ch); default: Py_UNREACHABLE(); } @@ -3420,7 +3420,7 @@ PyUnicode_Decode(const char *s, /* Decode via the codec registry */ buffer = NULL; - if (PyBuffer_FillInfo(&info, NULL, (void *)s, size, 1, PyBUF_FULL_RO) < 0) + if (PyBuffer_FillInfo(&info, NULL, (const void *)s, size, 1, PyBUF_FULL_RO) < 0) goto onError; buffer = PyMemoryView_FromBuffer(&info); if (buffer == NULL) @@ -4921,7 +4921,7 @@ ascii_decode(const char *start, const char *end, Py_UCS1 *dest) /* Help allocation */ const char *_p = p; while (_p < aligned_end) { - unsigned long value = *(unsigned long *) _p; + unsigned long value = *(const unsigned long *) _p; if (value & ASCII_CHAR_MASK) break; _p += SIZEOF_LONG; @@ -5472,7 +5472,7 @@ PyUnicode_DecodeUTF32Stateful(const char *s, PyObject *errorHandler = NULL; PyObject *exc = NULL; - q = (unsigned char *)s; + q = (const unsigned char *)s; e = q + size; if (byteorder) @@ -5797,7 +5797,7 @@ PyUnicode_DecodeUTF16Stateful(const char *s, PyObject *exc = NULL; const char *encoding; - q = (unsigned char *)s; + q = (const unsigned char *)s; e = q + size; if (byteorder) @@ -6726,7 +6726,7 @@ PyUnicode_DecodeLatin1(const char *s, const char *errors) { /* Latin-1 is equivalent to the first 256 ordinals in Unicode. */ - return _PyUnicode_FromUCS1((unsigned char*)s, size); + return _PyUnicode_FromUCS1((const unsigned char*)s, size); } /* create or adjust a UnicodeEncodeError */ @@ -13803,7 +13803,7 @@ _PyUnicodeWriter_WriteASCIIString(_PyUnicodeWriter *writer, if (len == -1) len = strlen(ascii); - assert(ucs1lib_find_max_char((Py_UCS1*)ascii, (Py_UCS1*)ascii + len) < 128); + assert(ucs1lib_find_max_char((const Py_UCS1*)ascii, (const Py_UCS1*)ascii + len) < 128); if (writer->buffer == NULL && !writer->overallocate) { PyObject *str; @@ -13862,7 +13862,7 @@ _PyUnicodeWriter_WriteLatin1String(_PyUnicodeWriter *writer, { Py_UCS4 maxchar; - maxchar = ucs1lib_find_max_char((Py_UCS1*)str, (Py_UCS1*)str + len); + maxchar = ucs1lib_find_max_char((const Py_UCS1*)str, (const Py_UCS1*)str + len); if (_PyUnicodeWriter_Prepare(writer, len, maxchar) == -1) return -1; unicode_write_cstr(writer->buffer, writer->pos, str, len); diff --git a/Python/ceval.c b/Python/ceval.c index eb0f131ae8c..426d0bbee89 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5440,7 +5440,7 @@ dtrace_function_entry(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_ENTRY((char *)filename, (char *)funcname, lineno); + PyDTrace_FUNCTION_ENTRY(filename, funcname, lineno); } static void @@ -5454,7 +5454,7 @@ dtrace_function_return(PyFrameObject *f) funcname = PyUnicode_AsUTF8(f->f_code->co_name); lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); - PyDTrace_FUNCTION_RETURN((char *)filename, (char *)funcname, lineno); + PyDTrace_FUNCTION_RETURN(filename, funcname, lineno); } /* DTrace equivalent of maybe_call_line_trace. */ @@ -5486,7 +5486,7 @@ maybe_dtrace_line(PyFrameObject *frame, co_name = PyUnicode_AsUTF8(frame->f_code->co_name); if (!co_name) co_name = "?"; - PyDTrace_LINE((char *)co_filename, (char *)co_name, line); + PyDTrace_LINE(co_filename, co_name, line); } *instr_prev = frame->f_lasti; } diff --git a/Python/marshal.c b/Python/marshal.c index 04a8dc59898..4a23df1dcd8 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -734,7 +734,7 @@ r_byte(RFILE *p) else { const char *ptr = r_string(1, p); if (ptr != NULL) - c = *(unsigned char *) ptr; + c = *(const unsigned char *) ptr; } return c; } diff --git a/Python/pyhash.c b/Python/pyhash.c index d381dc0230c..faac730d79d 100644 --- a/Python/pyhash.c +++ b/Python/pyhash.c @@ -366,7 +366,7 @@ static PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * SIZEOF_PY_HASH_T, static uint64_t siphash24(uint64_t k0, uint64_t k1, const void *src, Py_ssize_t src_sz) { uint64_t b = (uint64_t)src_sz << 56; - const uint8_t *in = (uint8_t*)src; + const uint8_t *in = (const uint8_t*)src; uint64_t v0 = k0 ^ 0x736f6d6570736575ULL; uint64_t v1 = k1 ^ 0x646f72616e646f6dULL; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index a7f8c0b7196..cacff529758 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -204,7 +204,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) /* Dtrace USDT point */ if (dtrace) { - PyDTrace_AUDIT((char *)event, (void *)eventArgs); + PyDTrace_AUDIT(event, (void *)eventArgs); } /* Call interpreter hooks */ From e5bd73632e77dc5ab0cab77e48e94ca5e354be8a Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Tue, 11 Feb 2020 21:58:47 -0500 Subject: [PATCH 354/380] bpo-39595: Improve zipfile.Path performance (#18406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve zipfile.Path performance on zipfiles with a large number of entries. * 📜🤖 Added by blurb_it. * Add bpo to blurb * Sync with importlib_metadata 1.5 (6fe70ca) * Update blurb. * Remove compatibility code * Add stubs module, omitted from earlier commit Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> --- Lib/importlib/metadata.py | 12 +- Lib/test/test_importlib/fixtures.py | 23 ++- Lib/test/test_importlib/stubs.py | 10 ++ Lib/test/test_importlib/test_main.py | 32 ++++ Lib/test/test_zipfile.py | 142 +++++++++++++----- Lib/zipfile.py | 102 ++++++++++--- .../2020-02-07-23-14-14.bpo-39595.DHwddE.rst | 1 + 7 files changed, 254 insertions(+), 68 deletions(-) create mode 100644 Lib/test/test_importlib/stubs.py create mode 100644 Misc/NEWS.d/next/Library/2020-02-07-23-14-14.bpo-39595.DHwddE.rst diff --git a/Lib/importlib/metadata.py b/Lib/importlib/metadata.py index ae8ecf9b850..831f593277c 100644 --- a/Lib/importlib/metadata.py +++ b/Lib/importlib/metadata.py @@ -391,6 +391,7 @@ class FastPath: def __init__(self, root): self.root = root + self.base = os.path.basename(root).lower() def joinpath(self, child): return pathlib.Path(self.root, child) @@ -413,12 +414,11 @@ class FastPath: ) def is_egg(self, search): - root_n_low = os.path.split(self.root)[1].lower() - + base = self.base return ( - root_n_low == search.normalized + '.egg' - or root_n_low.startswith(search.prefix) - and root_n_low.endswith('.egg')) + base == search.versionless_egg_name + or base.startswith(search.prefix) + and base.endswith('.egg')) def search(self, name): for child in self.children(): @@ -439,6 +439,7 @@ class Prepared: prefix = '' suffixes = '.dist-info', '.egg-info' exact_matches = [''][:0] + versionless_egg_name = '' def __init__(self, name): self.name = name @@ -448,6 +449,7 @@ class Prepared: self.prefix = self.normalized + '-' self.exact_matches = [ self.normalized + suffix for suffix in self.suffixes] + self.versionless_egg_name = self.normalized + '.egg' class MetadataPathFinder(DistributionFinder): diff --git a/Lib/test/test_importlib/fixtures.py b/Lib/test/test_importlib/fixtures.py index 0b4ce18d5a6..695c92a786c 100644 --- a/Lib/test/test_importlib/fixtures.py +++ b/Lib/test/test_importlib/fixtures.py @@ -47,14 +47,28 @@ def tempdir_as_cwd(): yield tmp -class SiteDir: +@contextlib.contextmanager +def install_finder(finder): + sys.meta_path.append(finder) + try: + yield + finally: + sys.meta_path.remove(finder) + + +class Fixtures: def setUp(self): self.fixtures = ExitStack() self.addCleanup(self.fixtures.close) + + +class SiteDir(Fixtures): + def setUp(self): + super(SiteDir, self).setUp() self.site_dir = self.fixtures.enter_context(tempdir()) -class OnSysPath: +class OnSysPath(Fixtures): @staticmethod @contextlib.contextmanager def add_sys_path(dir): @@ -198,3 +212,8 @@ def build_files(file_defs, prefix=pathlib.Path()): def DALS(str): "Dedent and left-strip" return textwrap.dedent(str).lstrip() + + +class NullFinder: + def find_module(self, name): + pass diff --git a/Lib/test/test_importlib/stubs.py b/Lib/test/test_importlib/stubs.py new file mode 100644 index 00000000000..e5b011c399f --- /dev/null +++ b/Lib/test/test_importlib/stubs.py @@ -0,0 +1,10 @@ +import unittest + + +class fake_filesystem_unittest: + """ + Stubbed version of the pyfakefs module + """ + class TestCase(unittest.TestCase): + def setUpPyfakefs(self): + self.skipTest("pyfakefs not available") diff --git a/Lib/test/test_importlib/test_main.py b/Lib/test/test_importlib/test_main.py index c5f1dbbae32..42a79992ecc 100644 --- a/Lib/test/test_importlib/test_main.py +++ b/Lib/test/test_importlib/test_main.py @@ -7,6 +7,11 @@ import textwrap import unittest import importlib.metadata +try: + import pyfakefs.fake_filesystem_unittest as ffs +except ImportError: + from .stubs import fake_filesystem_unittest as ffs + from . import fixtures from importlib.metadata import ( Distribution, EntryPoint, @@ -185,6 +190,33 @@ class DirectoryTest(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase): version('foo') +class MissingSysPath(fixtures.OnSysPath, unittest.TestCase): + site_dir = '/does-not-exist' + + def test_discovery(self): + """ + Discovering distributions should succeed even if + there is an invalid path on sys.path. + """ + importlib.metadata.distributions() + + +class InaccessibleSysPath(fixtures.OnSysPath, ffs.TestCase): + site_dir = '/access-denied' + + def setUp(self): + super(InaccessibleSysPath, self).setUp() + self.setUpPyfakefs() + self.fs.create_dir(self.site_dir, perm_bits=000) + + def test_discovery(self): + """ + Discovering distributions should succeed even if + there is an invalid path on sys.path. + """ + list(importlib.metadata.distributions()) + + class TestEntryPoints(unittest.TestCase): def __init__(self, *args): super(TestEntryPoints, self).__init__(*args) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index c334715f3d8..09fc8506006 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2724,16 +2724,71 @@ class CommandLineTest(unittest.TestCase): self.assertEqual(f.read(), zf.read(zi)) +class TestExecutablePrependedZip(unittest.TestCase): + """Test our ability to open zip files with an executable prepended.""" + + def setUp(self): + self.exe_zip = findfile('exe_with_zip', subdir='ziptestdata') + self.exe_zip64 = findfile('exe_with_z64', subdir='ziptestdata') + + def _test_zip_works(self, name): + # bpo28494 sanity check: ensure is_zipfile works on these. + self.assertTrue(zipfile.is_zipfile(name), + f'is_zipfile failed on {name}') + # Ensure we can operate on these via ZipFile. + with zipfile.ZipFile(name) as zipfp: + for n in zipfp.namelist(): + data = zipfp.read(n) + self.assertIn(b'FAVORITE_NUMBER', data) + + def test_read_zip_with_exe_prepended(self): + self._test_zip_works(self.exe_zip) + + def test_read_zip64_with_exe_prepended(self): + self._test_zip_works(self.exe_zip64) + + @unittest.skipUnless(sys.executable, 'sys.executable required.') + @unittest.skipUnless(os.access('/bin/bash', os.X_OK), + 'Test relies on #!/bin/bash working.') + def test_execute_zip2(self): + output = subprocess.check_output([self.exe_zip, sys.executable]) + self.assertIn(b'number in executable: 5', output) + + @unittest.skipUnless(sys.executable, 'sys.executable required.') + @unittest.skipUnless(os.access('/bin/bash', os.X_OK), + 'Test relies on #!/bin/bash working.') + def test_execute_zip64(self): + output = subprocess.check_output([self.exe_zip64, sys.executable]) + self.assertIn(b'number in executable: 5', output) + + # Poor man's technique to consume a (smallish) iterable. consume = tuple +# from jaraco.itertools 5.0 +class jaraco: + class itertools: + class Counter: + def __init__(self, i): + self.count = 0 + self._orig_iter = iter(i) + + def __iter__(self): + return self + + def __next__(self): + result = next(self._orig_iter) + self.count += 1 + return result + + def add_dirs(zf): """ Given a writable zip file zf, inject directory entries for any directories implied by the presence of children. """ - for name in zipfile.Path._implied_dirs(zf.namelist()): + for name in zipfile.CompleteDirs._implied_dirs(zf.namelist()): zf.writestr(name, b"") return zf @@ -2774,44 +2829,6 @@ def build_alpharep_fixture(): return zf -class TestExecutablePrependedZip(unittest.TestCase): - """Test our ability to open zip files with an executable prepended.""" - - def setUp(self): - self.exe_zip = findfile('exe_with_zip', subdir='ziptestdata') - self.exe_zip64 = findfile('exe_with_z64', subdir='ziptestdata') - - def _test_zip_works(self, name): - # bpo-28494 sanity check: ensure is_zipfile works on these. - self.assertTrue(zipfile.is_zipfile(name), - f'is_zipfile failed on {name}') - # Ensure we can operate on these via ZipFile. - with zipfile.ZipFile(name) as zipfp: - for n in zipfp.namelist(): - data = zipfp.read(n) - self.assertIn(b'FAVORITE_NUMBER', data) - - def test_read_zip_with_exe_prepended(self): - self._test_zip_works(self.exe_zip) - - def test_read_zip64_with_exe_prepended(self): - self._test_zip_works(self.exe_zip64) - - @unittest.skipUnless(sys.executable, 'sys.executable required.') - @unittest.skipUnless(os.access('/bin/bash', os.X_OK), - 'Test relies on #!/bin/bash working.') - def test_execute_zip2(self): - output = subprocess.check_output([self.exe_zip, sys.executable]) - self.assertIn(b'number in executable: 5', output) - - @unittest.skipUnless(sys.executable, 'sys.executable required.') - @unittest.skipUnless(os.access('/bin/bash', os.X_OK), - 'Test relies on #!/bin/bash working.') - def test_execute_zip64(self): - output = subprocess.check_output([self.exe_zip64, sys.executable]) - self.assertIn(b'number in executable: 5', output) - - class TestPath(unittest.TestCase): def setUp(self): self.fixtures = contextlib.ExitStack() @@ -2849,6 +2866,14 @@ class TestPath(unittest.TestCase): 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) @@ -2910,6 +2935,45 @@ class TestPath(unittest.TestCase): root = zipfile.Path(alpharep) assert (root / 'missing dir/').parent.at == '' + def test_mutability(self): + """ + 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' + + HUGE_ZIPFILE_NUM_ENTRIES = 2 ** 13 + + def huge_zipfile(self): + """Create a read-only zipfile with a huge number of entries entries.""" + strm = io.BytesIO() + zf = zipfile.ZipFile(strm, "w") + for entry in map(str, range(self.HUGE_ZIPFILE_NUM_ENTRIES)): + zf.writestr(entry, entry) + zf.mode = 'r' + return zf + + def test_joinpath_constant_time(self): + """ + Ensure joinpath on items in zipfile is linear time. + """ + root = zipfile.Path(self.huge_zipfile()) + entries = jaraco.itertools.Counter(root.iterdir()) + for entry in entries: + entry.joinpath('suffix') + # Check the file iterated all items + assert entries.count == self.HUGE_ZIPFILE_NUM_ENTRIES + if __name__ == "__main__": unittest.main() diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 2da87ef505e..4510fac250b 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -16,6 +16,8 @@ import struct import sys import threading import time +import contextlib +from collections import OrderedDict try: import zlib # We may need its compression method @@ -2159,6 +2161,79 @@ def _ancestry(path): path, tail = posixpath.split(path) +class CompleteDirs(ZipFile): + """ + A ZipFile subclass that ensures that implied directories + are always included in the namelist. + """ + + @staticmethod + def _implied_dirs(names): + parents = itertools.chain.from_iterable(map(_parents, names)) + # Deduplicate entries in original order + implied_dirs = OrderedDict.fromkeys( + p + posixpath.sep for p in parents + # Cast names to a set for O(1) lookups + if p + posixpath.sep not in set(names) + ) + return implied_dirs + + def namelist(self): + names = super(CompleteDirs, self).namelist() + return names + list(self._implied_dirs(names)) + + def _name_set(self): + return set(self.namelist()) + + def resolve_dir(self, name): + """ + If the name represents a directory, return that name + as a directory (with the trailing slash). + """ + names = self._name_set() + dirname = name + '/' + dir_match = name not in names and dirname in names + return dirname if dir_match else name + + @classmethod + def make(cls, source): + """ + Given a source (filename or zipfile), return an + appropriate CompleteDirs subclass. + """ + if isinstance(source, CompleteDirs): + return source + + if not isinstance(source, ZipFile): + return cls(source) + + # Only allow for FastPath 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 + + +class FastLookup(CompleteDirs): + """ + ZipFile subclass to ensure implicit + dirs exist and are resolved rapidly. + """ + def namelist(self): + with contextlib.suppress(AttributeError): + return self.__names + self.__names = super(FastLookup, self).namelist() + return self.__names + + def _name_set(self): + with contextlib.suppress(AttributeError): + return self.__lookup + self.__lookup = super(FastLookup, self)._name_set() + return self.__lookup + + class Path: """ A pathlib-compatible interface for zip files. @@ -2227,7 +2302,7 @@ class Path: __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" def __init__(self, root, at=""): - self.root = root if isinstance(root, ZipFile) else ZipFile(root) + self.root = FastLookup.make(root) self.at = at @property @@ -2259,12 +2334,12 @@ class Path: return not self.is_dir() def exists(self): - return self.at in self._names() + return self.at in self.root._name_set() def iterdir(self): if not self.is_dir(): raise ValueError("Can't listdir a file") - subs = map(self._next, self._names()) + subs = map(self._next, self.root.namelist()) return filter(self._is_child, subs) def __str__(self): @@ -2275,25 +2350,10 @@ class Path: def joinpath(self, add): next = posixpath.join(self.at, add) - next_dir = posixpath.join(self.at, add, "") - names = self._names() - return self._next(next_dir if next not in names and next_dir in names else next) + return self._next(self.root.resolve_dir(next)) __truediv__ = joinpath - @staticmethod - def _implied_dirs(names): - return _unique_everseen( - parent + "/" - for name in names - for parent in _parents(name) - if parent + "/" not in names - ) - - @classmethod - def _add_implied_dirs(cls, names): - return names + list(cls._implied_dirs(names)) - @property def parent(self): parent_at = posixpath.dirname(self.at.rstrip('/')) @@ -2301,9 +2361,6 @@ class Path: parent_at += '/' return self._next(parent_at) - def _names(self): - return self._add_implied_dirs(self.root.namelist()) - def main(args=None): import argparse @@ -2365,5 +2422,6 @@ def main(args=None): zippath = '' addToZip(zf, path, zippath) + if __name__ == "__main__": main() diff --git a/Misc/NEWS.d/next/Library/2020-02-07-23-14-14.bpo-39595.DHwddE.rst b/Misc/NEWS.d/next/Library/2020-02-07-23-14-14.bpo-39595.DHwddE.rst new file mode 100644 index 00000000000..3a461389af7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-07-23-14-14.bpo-39595.DHwddE.rst @@ -0,0 +1 @@ +Improved performance of zipfile.Path for files with a large number of entries. Also improved performance and fixed minor issue as published with `importlib_metadata 1.5 `_. From 95905ce0f41fd42eb1ef60ddb83f057401c3d52f Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 11 Feb 2020 19:36:14 -0800 Subject: [PATCH 355/380] bpo-39605: Remove a cast that causes a warning. (GH-18473) --- Objects/unicodeobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index fdc2ca6612c..8470e41624b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3420,7 +3420,7 @@ PyUnicode_Decode(const char *s, /* Decode via the codec registry */ buffer = NULL; - if (PyBuffer_FillInfo(&info, NULL, (const void *)s, size, 1, PyBUF_FULL_RO) < 0) + if (PyBuffer_FillInfo(&info, NULL, (void *)s, size, 1, PyBUF_FULL_RO) < 0) goto onError; buffer = PyMemoryView_FromBuffer(&info); if (buffer == NULL) From f4f445b69306c68a2ba8ce8eb8c6cb3064db5fe7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 12 Feb 2020 12:11:34 +0200 Subject: [PATCH 356/380] bpo-39567: Add audit for os.walk(), os.fwalk(), Path.glob() and Path.rglob(). (GH-18372) --- Lib/os.py | 10 +++++++--- Lib/pathlib.py | 2 ++ .../Library/2020-02-06-10-23-32.bpo-39567.VpFBxt.rst | 2 ++ 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-06-10-23-32.bpo-39567.VpFBxt.rst diff --git a/Lib/os.py b/Lib/os.py index 7ae102617e8..ab75b94d4fe 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -336,7 +336,10 @@ def walk(top, topdown=True, onerror=None, followlinks=False): dirs.remove('CVS') # don't visit CVS directories """ - top = fspath(top) + sys.audit("os.walk", top, topdown, onerror, followlinks) + return _walk(fspath(top), topdown, onerror, followlinks) + +def _walk(top, topdown, onerror, followlinks): dirs = [] nondirs = [] walk_dirs = [] @@ -410,11 +413,11 @@ def walk(top, topdown=True, onerror=None, followlinks=False): # the caller can replace the directory entry during the "yield" # above. if followlinks or not islink(new_path): - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) else: # Recurse into sub-directories for new_path in walk_dirs: - yield from walk(new_path, topdown, onerror, followlinks) + yield from _walk(new_path, topdown, onerror, followlinks) # Yield after recursion if going bottom up yield top, dirs, nondirs @@ -455,6 +458,7 @@ if {open, stat} <= supports_dir_fd and {scandir, stat} <= supports_fd: if 'CVS' in dirs: dirs.remove('CVS') # don't visit CVS directories """ + sys.audit("os.fwalk", top, topdown, onerror, follow_symlinks, dir_fd) if not isinstance(top, int) or not hasattr(top, '__index__'): top = fspath(top) # Note: To guard against symlink races, we use the standard diff --git a/Lib/pathlib.py b/Lib/pathlib.py index a5f3313902e..cfa574af6e8 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1134,6 +1134,7 @@ class Path(PurePath): """Iterate over this subtree and yield all existing files (of any kind, including directories) matching the given relative pattern. """ + sys.audit("pathlib.Path.glob", self, pattern) if not pattern: raise ValueError("Unacceptable pattern: {!r}".format(pattern)) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) @@ -1148,6 +1149,7 @@ class Path(PurePath): directories) matching the given relative pattern, anywhere in this subtree. """ + sys.audit("pathlib.Path.rglob", self, pattern) drv, root, pattern_parts = self._flavour.parse_parts((pattern,)) if drv or root: raise NotImplementedError("Non-relative patterns are unsupported") diff --git a/Misc/NEWS.d/next/Library/2020-02-06-10-23-32.bpo-39567.VpFBxt.rst b/Misc/NEWS.d/next/Library/2020-02-06-10-23-32.bpo-39567.VpFBxt.rst new file mode 100644 index 00000000000..3c4700f455b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-06-10-23-32.bpo-39567.VpFBxt.rst @@ -0,0 +1,2 @@ +Added audit for :func:`os.walk`, :func:`os.fwalk`, :meth:`pathlib.Path.glob` +and :meth:`pathlib.Path.rglob`. From 0cc6b5e559b8303b18fdd56c2befd900fe7b5e35 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 12 Feb 2020 12:17:00 +0200 Subject: [PATCH 357/380] bpo-39219: Fix SyntaxError attributes in the tokenizer. (GH-17828) * Always set the text attribute. * Correct the offset attribute for non-ascii sources. --- Lib/test/test_exceptions.py | 14 +++++++- .../2020-01-05-13-36-08.bpo-39219.uHtKd4.rst | 2 ++ Parser/tokenizer.c | 36 ++++++++++++++++--- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-36-08.bpo-39219.uHtKd4.rst diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 4d1aa4bca62..22a22363a7d 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -179,17 +179,25 @@ class ExceptionTests(unittest.TestCase): ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError) def testSyntaxErrorOffset(self): - def check(src, lineno, offset): + def check(src, lineno, offset, encoding='utf-8'): with self.assertRaises(SyntaxError) as cm: compile(src, '', 'exec') self.assertEqual(cm.exception.lineno, lineno) self.assertEqual(cm.exception.offset, offset) + if cm.exception.text is not None: + if not isinstance(src, str): + src = src.decode(encoding, 'replace') + line = src.split('\n')[lineno-1] + self.assertEqual(cm.exception.text.rstrip('\n'), line) check('def fact(x):\n\treturn x!\n', 2, 10) check('1 +\n', 1, 4) check('def spam():\n print(1)\n print(2)', 3, 10) check('Python = "Python" +', 1, 20) check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20) + check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +', + 2, 19, encoding='cp1251') + check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) check('x = "a', 1, 7) check('lambda x: x = 2', 1, 1) @@ -205,6 +213,10 @@ class ExceptionTests(unittest.TestCase): check('0010 + 2', 1, 4) check('x = 32e-+4', 1, 8) check('x = 0o9', 1, 6) + check('\u03b1 = 0xI', 1, 6) + check(b'\xce\xb1 = 0xI', 1, 6) + check(b'# -*- coding: iso8859-7 -*-\n\xe1 = 0xI', 2, 6, + encoding='iso8859-7') # Errors thrown by symtable.c check('x = [(yield i) for i in range(3)]', 1, 5) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-36-08.bpo-39219.uHtKd4.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-36-08.bpo-39219.uHtKd4.rst new file mode 100644 index 00000000000..dac8360df71 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-05-13-36-08.bpo-39219.uHtKd4.rst @@ -0,0 +1,2 @@ +Syntax errors raised in the tokenizer now always set correct "text" and +"offset" attributes. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index c37cd927df5..630b0aaab03 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1,6 +1,7 @@ /* Tokenizer implementation */ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include @@ -1034,17 +1035,44 @@ tok_backup(struct tok_state *tok, int c) static int syntaxerror(struct tok_state *tok, const char *format, ...) { + PyObject *errmsg, *errtext, *args; va_list vargs; #ifdef HAVE_STDARG_PROTOTYPES va_start(vargs, format); #else va_start(vargs); #endif - PyErr_FormatV(PyExc_SyntaxError, format, vargs); + errmsg = PyUnicode_FromFormatV(format, vargs); va_end(vargs); - PyErr_SyntaxLocationObject(tok->filename, - tok->lineno, - (int)(tok->cur - tok->line_start)); + if (!errmsg) { + goto error; + } + + errtext = PyUnicode_DecodeUTF8(tok->line_start, tok->cur - tok->line_start, + "replace"); + if (!errtext) { + goto error; + } + int offset = (int)PyUnicode_GET_LENGTH(errtext); + Py_ssize_t line_len = strcspn(tok->line_start, "\n"); + if (line_len != tok->cur - tok->line_start) { + Py_DECREF(errtext); + errtext = PyUnicode_DecodeUTF8(tok->line_start, line_len, + "replace"); + } + if (!errtext) { + goto error; + } + + args = Py_BuildValue("(O(OiiN))", errmsg, + tok->filename, tok->lineno, offset, errtext); + if (args) { + PyErr_SetObject(PyExc_SyntaxError, args); + Py_DECREF(args); + } + +error: + Py_XDECREF(errmsg); tok->done = E_ERROR; return ERRORTOKEN; } From 8c579b1cc86053473eb052b76327279476740c9b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 12 Feb 2020 12:18:59 +0200 Subject: [PATCH 358/380] bpo-32856: Optimize the assignment idiom in comprehensions. (GH-16814) Now `for y in [expr]` in comprehensions is as fast as a simple assignment `y = expr`. --- Doc/whatsnew/3.9.rst | 11 +++ Lib/test/test_dictcomps.py | 17 +++++ Lib/test/test_genexps.py | 16 +++++ Lib/test/test_listcomps.py | 16 +++++ Lib/test/test_peepholer.py | 14 ++++ Lib/test/test_setcomps.py | 16 +++++ .../2018-02-16-10-44-24.bpo-32856.UjR8SD.rst | 3 + Python/compile.c | 70 ++++++++++++++----- 8 files changed, 145 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-02-16-10-44-24.bpo-32856.UjR8SD.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index c0404101d7c..ec179845aee 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -315,6 +315,17 @@ case), and one used ``__VENV_NAME__`` instead. Optimizations ============= +* Optimized the idiom for assignment a temporary variable in comprehensions. + Now ``for y in [expr]`` in comprehensions is as fast as a simple assignment + ``y = expr``. For example: + + sums = [s for s in [0] for x in data for s in [s + x]] + + Unlike to the ``:=`` operator this idiom does not leak a variable to the + outer scope. + + (Contributed by Serhiy Storchaka in :issue:`32856`.) + Build and C API Changes ======================= diff --git a/Lib/test/test_dictcomps.py b/Lib/test/test_dictcomps.py index 927e3103e66..16aa651b93c 100644 --- a/Lib/test/test_dictcomps.py +++ b/Lib/test/test_dictcomps.py @@ -111,5 +111,22 @@ class DictComprehensionTest(unittest.TestCase): self.assertEqual(actual, expected) self.assertEqual(actual_calls, expected_calls) + def test_assignment_idiom_in_comprehensions(self): + expected = {1: 1, 2: 4, 3: 9, 4: 16} + actual = {j: j*j for i in range(4) for j in [i+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j in [i+1] for k in [j+1]} + self.assertEqual(actual, expected) + expected = {3: 2, 5: 6, 7: 12, 9: 20} + actual = {j+k: j*k for i in range(4) for j, k in [(i+1, i+2)]} + self.assertEqual(actual, expected) + + def test_star_expression(self): + expected = {0: 0, 1: 1, 2: 4, 3: 9} + self.assertEqual({i: i*i for i in [*range(4)]}, expected) + self.assertEqual({i: i*i for i in (*range(4),)}, expected) + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py index fd712bb172d..86e4e195f55 100644 --- a/Lib/test/test_genexps.py +++ b/Lib/test/test_genexps.py @@ -15,6 +15,22 @@ Test nesting with the inner expression dependent on the outer >>> list((i,j) for i in range(4) for j in range(i) ) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> list((j*j for i in range(4) for j in [i+1])) + [1, 4, 9, 16] + >>> list((j*k for i in range(4) for j in [i+1] for k in [j+1])) + [2, 6, 12, 20] + >>> list((j*k for i in range(4) for j, k in [(i+1, i+2)])) + [2, 6, 12, 20] + +Not assignment + + >>> list((i*i for i in [*range(4)])) + [0, 1, 4, 9] + >>> list((i*i for i in (*range(4),))) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_listcomps.py b/Lib/test/test_listcomps.py index ddb169fe589..62b3319ad93 100644 --- a/Lib/test/test_listcomps.py +++ b/Lib/test/test_listcomps.py @@ -16,6 +16,22 @@ Test nesting with the inner expression dependent on the outer >>> [(i,j) for i in range(4) for j in range(i)] [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> [j*j for i in range(4) for j in [i+1]] + [1, 4, 9, 16] + >>> [j*k for i in range(4) for j in [i+1] for k in [j+1]] + [2, 6, 12, 20] + >>> [j*k for i in range(4) for j, k in [(i+1, i+2)]] + [2, 6, 12, 20] + +Not assignment + + >>> [i*i for i in [*range(4)]] + [0, 1, 4, 9] + >>> [i*i for i in (*range(4),)] + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 567e6a14361..7913e91e453 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -495,6 +495,20 @@ class TestTranforms(BytecodeTestCase): return 6 self.check_lnotab(f) + def test_assignment_idiom_in_comprehensions(self): + def listcomp(): + return [y for x in a for y in [f(x)]] + self.assertEqual(count_instr_recursively(listcomp, 'FOR_ITER'), 1) + def setcomp(): + return {y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(setcomp, 'FOR_ITER'), 1) + def dictcomp(): + return {y: y for x in a for y in [f(x)]} + self.assertEqual(count_instr_recursively(dictcomp, 'FOR_ITER'), 1) + def genexpr(): + return (y for x in a for y in [f(x)]) + self.assertEqual(count_instr_recursively(genexpr, 'FOR_ITER'), 1) + class TestBuglets(unittest.TestCase): diff --git a/Lib/test/test_setcomps.py b/Lib/test/test_setcomps.py index fb7cde03d78..ecc4fffec0d 100644 --- a/Lib/test/test_setcomps.py +++ b/Lib/test/test_setcomps.py @@ -21,6 +21,22 @@ Test nesting with the inner expression dependent on the outer >>> list(sorted({(i,j) for i in range(4) for j in range(i)})) [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] +Test the idiom for temporary variable assignment in comprehensions. + + >>> sorted({j*j for i in range(4) for j in [i+1]}) + [1, 4, 9, 16] + >>> sorted({j*k for i in range(4) for j in [i+1] for k in [j+1]}) + [2, 6, 12, 20] + >>> sorted({j*k for i in range(4) for j, k in [(i+1, i+2)]}) + [2, 6, 12, 20] + +Not assignment + + >>> sorted({i*i for i in [*range(4)]}) + [0, 1, 4, 9] + >>> sorted({i*i for i in (*range(4),)}) + [0, 1, 4, 9] + Make sure the induction variable is not exposed >>> i = 20 diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-02-16-10-44-24.bpo-32856.UjR8SD.rst b/Misc/NEWS.d/next/Core and Builtins/2018-02-16-10-44-24.bpo-32856.UjR8SD.rst new file mode 100644 index 00000000000..c1cd68f6727 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-02-16-10-44-24.bpo-32856.UjR8SD.rst @@ -0,0 +1,3 @@ +Optimized the idiom for assignment a temporary variable in comprehensions. +Now ``for y in [expr]`` in comprehensions is as fast as a simple assignment +``y = expr``. diff --git a/Python/compile.c b/Python/compile.c index 04b8fe46e19..bf8c8109d07 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -212,11 +212,13 @@ static int compiler_set_qualname(struct compiler *); static int compiler_sync_comprehension_generator( struct compiler *c, asdl_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, + int depth, expr_ty elt, expr_ty val, int type); static PyCodeObject *assemble(struct compiler *, int addNone); @@ -4343,22 +4345,24 @@ ex_call: static int compiler_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); if (gen->is_async) { return compiler_async_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } else { return compiler_sync_comprehension_generator( - c, generators, gen_index, elt, val, type); + c, generators, gen_index, depth, elt, val, type); } } static int compiler_sync_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { /* generate code for the iterator, then each of the ifs, @@ -4386,12 +4390,38 @@ compiler_sync_comprehension_generator(struct compiler *c, } else { /* Sub-iter - calculate on the fly */ - VISIT(c, expr, gen->iter); - ADDOP(c, GET_ITER); + /* Fast path for the temporary variable assignment idiom: + for y in [f(x)] + */ + asdl_seq *elts; + switch (gen->iter->kind) { + case List_kind: + elts = gen->iter->v.List.elts; + break; + case Tuple_kind: + elts = gen->iter->v.Tuple.elts; + break; + default: + elts = NULL; + } + if (asdl_seq_LEN(elts) == 1) { + expr_ty elt = asdl_seq_GET(elts, 0); + if (elt->kind != Starred_kind) { + VISIT(c, expr, elt); + start = NULL; + } + } + if (start) { + VISIT(c, expr, gen->iter); + ADDOP(c, GET_ITER); + } + } + if (start) { + depth++; + compiler_use_next_block(c, start); + ADDOP_JREL(c, FOR_ITER, anchor); + NEXT_BLOCK(c); } - compiler_use_next_block(c, start); - ADDOP_JREL(c, FOR_ITER, anchor); - NEXT_BLOCK(c); VISIT(c, expr, gen->target); /* XXX this needs to be cleaned up...a lot! */ @@ -4405,7 +4435,7 @@ compiler_sync_comprehension_generator(struct compiler *c, if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4420,18 +4450,18 @@ compiler_sync_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4440,8 +4470,10 @@ compiler_sync_comprehension_generator(struct compiler *c, compiler_use_next_block(c, skip); } compiler_use_next_block(c, if_cleanup); - ADDOP_JABS(c, JUMP_ABSOLUTE, start); - compiler_use_next_block(c, anchor); + if (start) { + ADDOP_JABS(c, JUMP_ABSOLUTE, start); + compiler_use_next_block(c, anchor); + } return 1; } @@ -4449,6 +4481,7 @@ compiler_sync_comprehension_generator(struct compiler *c, static int compiler_async_comprehension_generator(struct compiler *c, asdl_seq *generators, int gen_index, + int depth, expr_ty elt, expr_ty val, int type) { comprehension_ty gen; @@ -4492,9 +4525,10 @@ compiler_async_comprehension_generator(struct compiler *c, NEXT_BLOCK(c); } + depth++; if (++gen_index < asdl_seq_LEN(generators)) if (!compiler_comprehension_generator(c, - generators, gen_index, + generators, gen_index, depth, elt, val, type)) return 0; @@ -4509,18 +4543,18 @@ compiler_async_comprehension_generator(struct compiler *c, break; case COMP_LISTCOMP: VISIT(c, expr, elt); - ADDOP_I(c, LIST_APPEND, gen_index + 1); + ADDOP_I(c, LIST_APPEND, depth + 1); break; case COMP_SETCOMP: VISIT(c, expr, elt); - ADDOP_I(c, SET_ADD, gen_index + 1); + ADDOP_I(c, SET_ADD, depth + 1); break; case COMP_DICTCOMP: /* With '{k: v}', k is evaluated before v, so we do the same. */ VISIT(c, expr, elt); VISIT(c, expr, val); - ADDOP_I(c, MAP_ADD, gen_index + 1); + ADDOP_I(c, MAP_ADD, depth + 1); break; default: return 0; @@ -4583,7 +4617,7 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type, ADDOP_I(c, op, 0); } - if (!compiler_comprehension_generator(c, generators, 0, elt, + if (!compiler_comprehension_generator(c, generators, 0, 0, elt, val, type)) goto error_in_scope; From 4fac7ed43ebf1771a8fe86fdfe7b9991f3be78cd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Feb 2020 13:02:29 +0100 Subject: [PATCH 359/380] bpo-21016: pydoc and trace use sysconfig (GH-18476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bpo-21016, bpo-1294959: The pydoc and trace modules now use the sysconfig module to get the path to the Python standard library, to support uncommon installation path like /usr/lib64/python3.9/ on Fedora. Co-Authored-By: Jan Matějek --- Lib/pydoc.py | 5 ++--- Lib/trace.py | 6 +++--- .../next/Library/2020-02-12-10-04-39.bpo-21016.bFXPH7.rst | 4 ++++ 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-12-10-04-39.bpo-21016.bFXPH7.rst diff --git a/Lib/pydoc.py b/Lib/pydoc.py index e32fdf76978..f172700a15f 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -66,6 +66,7 @@ import pkgutil import platform import re import sys +import sysconfig import time import tokenize import urllib.parse @@ -392,9 +393,7 @@ class Doc: docmodule = docclass = docroutine = docother = docproperty = docdata = fail - def getdocloc(self, object, - basedir=os.path.join(sys.base_exec_prefix, "lib", - "python%d.%d" % sys.version_info[:2])): + def getdocloc(self, object, basedir=sysconfig.get_path('stdlib')): """Return the location of module docs or None""" try: diff --git a/Lib/trace.py b/Lib/trace.py index 681c3f9d05f..52047c3fbf4 100755 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -52,6 +52,7 @@ __all__ = ['Trace', 'CoverageResults'] import linecache import os import sys +import sysconfig import token import tokenize import inspect @@ -660,9 +661,8 @@ def main(): opts = parser.parse_args() if opts.ignore_dir: - rel_path = 'lib', 'python{0.major}.{0.minor}'.format(sys.version_info) - _prefix = os.path.join(sys.base_prefix, *rel_path) - _exec_prefix = os.path.join(sys.base_exec_prefix, *rel_path) + _prefix = sysconfig.get_path("stdlib") + _exec_prefix = sysconfig.get_path("platstdlib") def parse_ignore_dir(s): s = os.path.expanduser(os.path.expandvars(s)) diff --git a/Misc/NEWS.d/next/Library/2020-02-12-10-04-39.bpo-21016.bFXPH7.rst b/Misc/NEWS.d/next/Library/2020-02-12-10-04-39.bpo-21016.bFXPH7.rst new file mode 100644 index 00000000000..fb91bb38255 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-12-10-04-39.bpo-21016.bFXPH7.rst @@ -0,0 +1,4 @@ +The :mod:`pydoc` and :mod:`trace` modules now use the :mod:`sysconfig` +module to get the path to the Python standard library, to support uncommon +installation path like ``/usr/lib64/python3.9/`` on Fedora. +Patch by Jan Matějek. From 674935b8caf33e47c78f1b8e197b1b77a04992d2 Mon Sep 17 00:00:00 2001 From: William Chargin Date: Wed, 12 Feb 2020 11:56:02 -0800 Subject: [PATCH 360/380] bpo-18819: tarfile: only set device fields for device files (GH-18080) The GNU docs describe the `devmajor` and `devminor` fields of the tar header struct only in the context of character and block special files, suggesting that in other cases they are not populated. Typical utilities behave accordingly; this patch teaches `tarfile` to do the same. --- Lib/tarfile.py | 12 ++++- Lib/test/test_tarfile.py | 46 +++++++++++++++++++ Misc/ACKS | 1 + .../2020-01-20-10-06-19.bpo-18819.H4qsoS.rst | 3 ++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-01-20-10-06-19.bpo-18819.H4qsoS.rst diff --git a/Lib/tarfile.py b/Lib/tarfile.py index 90a2c95b315..e2b60532f69 100755 --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -930,6 +930,14 @@ class TarInfo(object): """Return a header block. info is a dictionary with file information, format must be one of the *_FORMAT constants. """ + has_device_fields = info.get("type") in (CHRTYPE, BLKTYPE) + if has_device_fields: + devmajor = itn(info.get("devmajor", 0), 8, format) + devminor = itn(info.get("devminor", 0), 8, format) + else: + devmajor = stn("", 8, encoding, errors) + devminor = stn("", 8, encoding, errors) + parts = [ stn(info.get("name", ""), 100, encoding, errors), itn(info.get("mode", 0) & 0o7777, 8, format), @@ -943,8 +951,8 @@ class TarInfo(object): info.get("magic", POSIX_MAGIC), stn(info.get("uname", ""), 32, encoding, errors), stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), + devmajor, + devminor, stn(info.get("prefix", ""), 155, encoding, errors) ] diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py index 6a901089611..cae96802ded 100644 --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1549,6 +1549,52 @@ class GNUWriteTest(unittest.TestCase): ("longlnk/" * 127) + "longlink_") +class DeviceHeaderTest(WriteTestBase, unittest.TestCase): + + prefix = "w:" + + def test_headers_written_only_for_device_files(self): + # Regression test for bpo-18819. + tempdir = os.path.join(TEMPDIR, "device_header_test") + os.mkdir(tempdir) + try: + tar = tarfile.open(tmpname, self.mode) + try: + input_blk = tarfile.TarInfo(name="my_block_device") + input_reg = tarfile.TarInfo(name="my_regular_file") + input_blk.type = tarfile.BLKTYPE + input_reg.type = tarfile.REGTYPE + tar.addfile(input_blk) + tar.addfile(input_reg) + finally: + tar.close() + + # devmajor and devminor should be *interpreted* as 0 in both... + tar = tarfile.open(tmpname, "r") + try: + output_blk = tar.getmember("my_block_device") + output_reg = tar.getmember("my_regular_file") + finally: + tar.close() + self.assertEqual(output_blk.devmajor, 0) + self.assertEqual(output_blk.devminor, 0) + self.assertEqual(output_reg.devmajor, 0) + self.assertEqual(output_reg.devminor, 0) + + # ...but the fields should not actually be set on regular files: + with open(tmpname, "rb") as infile: + buf = infile.read() + buf_blk = buf[output_blk.offset:output_blk.offset_data] + buf_reg = buf[output_reg.offset:output_reg.offset_data] + # See `struct posixheader` in GNU docs for byte offsets: + # + device_headers = slice(329, 329 + 16) + self.assertEqual(buf_blk[device_headers], b"0000000\0" * 2) + self.assertEqual(buf_reg[device_headers], b"\0" * 16) + finally: + support.rmtree(tempdir) + + class CreateTest(WriteTestBase, unittest.TestCase): prefix = "x:" diff --git a/Misc/ACKS b/Misc/ACKS index 5a779833e68..933402069b4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -286,6 +286,7 @@ Brad Chapman Greg Chapman Mitch Chapman Matt Chaput +William Chargin Yogesh Chaudhari David Chaum Nicolas Chauvat diff --git a/Misc/NEWS.d/next/Library/2020-01-20-10-06-19.bpo-18819.H4qsoS.rst b/Misc/NEWS.d/next/Library/2020-01-20-10-06-19.bpo-18819.H4qsoS.rst new file mode 100644 index 00000000000..e9f111ad62e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-01-20-10-06-19.bpo-18819.H4qsoS.rst @@ -0,0 +1,3 @@ +Omit ``devmajor`` and ``devminor`` fields for non-device files in +:mod:`tarfile` archives, enabling bit-for-bit compatibility with GNU +``tar(1)``. From 6e619c48b8e804ece9521453fc8da0640a04d5b1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 12 Feb 2020 22:37:49 +0200 Subject: [PATCH 361/380] bpo-39474: Fix AST pos for expressions like (a)(b), (a)[b] and (a).b. (GH-18477) --- Lib/test/test_ast.py | 27 ++++++++++++++ .../2020-02-12-12-01-26.bpo-39474.RZMEUH.rst | 2 ++ Python/ast.c | 36 +++++++++---------- 3 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-12-12-01-26.bpo-39474.RZMEUH.rst diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 6d1e4199322..2ed4657822e 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1707,6 +1707,33 @@ class EndPositionTests(unittest.TestCase): self._check_content(s, call, s) self._check_content(s, call.args[0], 'x. y .z') + def test_redundant_parenthesis(self): + s = '( ( ( a + b ) ) )' + v = ast.parse(s).body[0].value + self.assertEqual(type(v).__name__, 'BinOp') + self._check_content(s, v, 'a + b') + s2 = 'await ' + s + v = ast.parse(s2).body[0].value.value + self.assertEqual(type(v).__name__, 'BinOp') + self._check_content(s2, v, 'a + b') + + def test_trailers_with_redundant_parenthesis(self): + tests = ( + ('( ( ( a ) ) ) ( )', 'Call'), + ('( ( ( a ) ) ) ( b )', 'Call'), + ('( ( ( a ) ) ) [ b ]', 'Subscript'), + ('( ( ( a ) ) ) . b', 'Attribute'), + ) + for s, t in tests: + with self.subTest(s): + v = ast.parse(s).body[0].value + self.assertEqual(type(v).__name__, t) + self._check_content(s, v, s) + s2 = 'await ' + s + v = ast.parse(s2).body[0].value.value + self.assertEqual(type(v).__name__, t) + self._check_content(s2, v, s) + def test_displays(self): s1 = '[{}, {1, }, {1, 2,} ]' s2 = '{a: b, f (): g () ,}' diff --git a/Misc/NEWS.d/next/Library/2020-02-12-12-01-26.bpo-39474.RZMEUH.rst b/Misc/NEWS.d/next/Library/2020-02-12-12-01-26.bpo-39474.RZMEUH.rst new file mode 100644 index 00000000000..e990f84a9db --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-12-12-01-26.bpo-39474.RZMEUH.rst @@ -0,0 +1,2 @@ +Fixed starting position of AST for expressions like ``(a)(b)``, ``(a)[b]`` +and ``(a).b``. diff --git a/Python/ast.c b/Python/ast.c index bab672b2958..ad25565b7c7 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -583,7 +583,7 @@ static stmt_ty ast_for_for_stmt(struct compiling *, const node *, bool); /* Note different signature for ast_for_call */ static expr_ty ast_for_call(struct compiling *, const node *, expr_ty, - const node *, const node *); + const node *, const node *, const node *); static PyObject *parsenumber(struct compiling *, const char *); static expr_ty parsestrplus(struct compiling *, const node *n); @@ -1757,7 +1757,8 @@ ast_for_decorator(struct compiling *c, const node *n) name_expr = NULL; } else { - d = ast_for_call(c, CHILD(n, 3), name_expr, CHILD(n, 2), CHILD(n, 4)); + d = ast_for_call(c, CHILD(n, 3), name_expr, + CHILD(n, 1), CHILD(n, 2), CHILD(n, 4)); if (!d) return NULL; name_expr = NULL; @@ -2658,7 +2659,7 @@ ast_for_binop(struct compiling *c, const node *n) } static expr_ty -ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) +ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr, const node *start) { /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME subscriptlist: subscript (',' subscript)* [','] @@ -2668,17 +2669,18 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) REQ(n, trailer); if (TYPE(CHILD(n, 0)) == LPAR) { if (NCH(n) == 2) - return Call(left_expr, NULL, NULL, LINENO(n), n->n_col_offset, + return Call(left_expr, NULL, NULL, LINENO(start), start->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); else - return ast_for_call(c, CHILD(n, 1), left_expr, CHILD(n, 0), CHILD(n, 2)); + return ast_for_call(c, CHILD(n, 1), left_expr, + start, CHILD(n, 0), CHILD(n, 2)); } else if (TYPE(CHILD(n, 0)) == DOT) { PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1)); if (!attr_id) return NULL; return Attribute(left_expr, attr_id, Load, - LINENO(n), n->n_col_offset, + LINENO(start), start->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } else { @@ -2689,7 +2691,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) slice_ty slc = ast_for_slice(c, CHILD(n, 0)); if (!slc) return NULL; - return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset, + return Subscript(left_expr, slc, Load, LINENO(start), start->n_col_offset, n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); } @@ -2716,7 +2718,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) } if (!simple) { return Subscript(left_expr, ExtSlice(slices, c->c_arena), - Load, LINENO(n), n->n_col_offset, + Load, LINENO(start), start->n_col_offset, n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); } /* extract Index values and put them in a Tuple */ @@ -2733,7 +2735,7 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr) if (!e) return NULL; return Subscript(left_expr, Index(e, c->c_arena), - Load, LINENO(n), n->n_col_offset, + Load, LINENO(start), start->n_col_offset, n_copy->n_end_lineno, n_copy->n_end_col_offset, c->c_arena); } } @@ -2771,7 +2773,7 @@ static expr_ty ast_for_atom_expr(struct compiling *c, const node *n) { int i, nch, start = 0; - expr_ty e, tmp; + expr_ty e; REQ(n, atom_expr); nch = NCH(n); @@ -2800,12 +2802,9 @@ ast_for_atom_expr(struct compiling *c, const node *n) node *ch = CHILD(n, i); if (TYPE(ch) != trailer) break; - tmp = ast_for_trailer(c, ch, e); - if (!tmp) + e = ast_for_trailer(c, ch, e, CHILD(n, start)); + if (!e) return NULL; - tmp->lineno = e->lineno; - tmp->col_offset = e->col_offset; - e = tmp; } if (start) { @@ -3035,7 +3034,7 @@ ast_for_expr(struct compiling *c, const node *n) static expr_ty ast_for_call(struct compiling *c, const node *n, expr_ty func, - const node *maybegenbeg, const node *closepar) + const node *start, const node *maybegenbeg, const node *closepar) { /* arglist: argument (',' argument)* [','] @@ -3239,7 +3238,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, } } - return Call(func, args, keywords, func->lineno, func->col_offset, + return Call(func, args, keywords, LINENO(start), start->n_col_offset, closepar->n_end_lineno, closepar->n_end_col_offset, c->c_arena); } @@ -4486,7 +4485,8 @@ ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq) dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, CHILD(n, 1)->n_end_lineno, CHILD(n, 1)->n_end_col_offset, c->c_arena); - call = ast_for_call(c, CHILD(n, 3), dummy, NULL, CHILD(n, 4)); + call = ast_for_call(c, CHILD(n, 3), dummy, + CHILD(n, 1), NULL, CHILD(n, 4)); if (!call) return NULL; } From 45876a90e2663f12b90c2090ec3e48bd97841aae Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Feb 2020 22:32:34 +0100 Subject: [PATCH 362/380] bpo-35081: Move bytes_methods.h to the internal C API (GH-18492) Move the bytes_methods.h header file to the internal C API as pycore_bytes_methods.h: it only contains private symbols (prefixed by "_Py"), except of the PyDoc_STRVAR_shared() macro. --- .../{bytes_methods.h => internal/pycore_bytes_methods.h} | 4 ++++ Makefile.pre.in | 2 +- .../next/C API/2020-02-12-21-38-49.bpo-35081.5tj1yC.rst | 3 +++ Objects/bytearrayobject.c | 2 +- Objects/bytes_methods.c | 2 +- Objects/bytesobject.c | 2 +- Objects/stringlib/ctype.h | 2 +- Objects/unicodeobject.c | 2 +- PCbuild/pythoncore.vcxproj | 2 +- PCbuild/pythoncore.vcxproj.filters | 6 +++--- 10 files changed, 17 insertions(+), 10 deletions(-) rename Include/{bytes_methods.h => internal/pycore_bytes_methods.h} (97%) create mode 100644 Misc/NEWS.d/next/C API/2020-02-12-21-38-49.bpo-35081.5tj1yC.rst diff --git a/Include/bytes_methods.h b/Include/internal/pycore_bytes_methods.h similarity index 97% rename from Include/bytes_methods.h rename to Include/internal/pycore_bytes_methods.h index 8434a50a4bb..11e8ab20e91 100644 --- a/Include/bytes_methods.h +++ b/Include/internal/pycore_bytes_methods.h @@ -2,6 +2,10 @@ #ifndef Py_BYTES_CTYPE_H #define Py_BYTES_CTYPE_H +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + /* * The internal implementation behind PyBytes (bytes) and PyByteArray (bytearray) * methods of the given names, they operate on ASCII byte strings. diff --git a/Makefile.pre.in b/Makefile.pre.in index 3da104bac87..aae93ff82c1 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -970,7 +970,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/bltinmodule.h \ $(srcdir)/Include/boolobject.h \ $(srcdir)/Include/bytearrayobject.h \ - $(srcdir)/Include/bytes_methods.h \ $(srcdir)/Include/bytesobject.h \ $(srcdir)/Include/cellobject.h \ $(srcdir)/Include/ceval.h \ @@ -1077,6 +1076,7 @@ PYTHON_HEADERS= \ \ $(srcdir)/Include/internal/pycore_accu.h \ $(srcdir)/Include/internal/pycore_atomic.h \ + $(srcdir)/Include/internal/pycore_bytes_methods.h \ $(srcdir)/Include/internal/pycore_call.h \ $(srcdir)/Include/internal/pycore_ceval.h \ $(srcdir)/Include/internal/pycore_code.h \ diff --git a/Misc/NEWS.d/next/C API/2020-02-12-21-38-49.bpo-35081.5tj1yC.rst b/Misc/NEWS.d/next/C API/2020-02-12-21-38-49.bpo-35081.5tj1yC.rst new file mode 100644 index 00000000000..6be33200d9e --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-12-21-38-49.bpo-35081.5tj1yC.rst @@ -0,0 +1,3 @@ +Move the ``bytes_methods.h`` header file to the internal C API as +``pycore_bytes_methods.h``: it only contains private symbols (prefixed by +``_Py``), except of the ``PyDoc_STRVAR_shared()`` macro. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index a3fc35ca4d2..d3964358bc5 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2,11 +2,11 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_bytes_methods.h" #include "pycore_object.h" #include "pycore_pymem.h" #include "pycore_pystate.h" #include "structmember.h" -#include "bytes_methods.h" #include "bytesobject.h" #include "pystrhex.h" diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c index db030be4fe7..a4b3868e725 100644 --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -1,6 +1,6 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "bytes_methods.h" +#include "pycore_bytes_methods.h" PyDoc_STRVAR_shared(_Py_isspace__doc__, "B.isspace() -> bool\n\ diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index df3eddae6a3..bd8af72ade5 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -3,11 +3,11 @@ #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_bytes_methods.h" #include "pycore_object.h" #include "pycore_pymem.h" #include "pycore_pystate.h" -#include "bytes_methods.h" #include "pystrhex.h" #include diff --git a/Objects/stringlib/ctype.h b/Objects/stringlib/ctype.h index 843cfa22a84..9b319b07d11 100644 --- a/Objects/stringlib/ctype.h +++ b/Objects/stringlib/ctype.h @@ -2,7 +2,7 @@ # error "ctype.h only compatible with byte-wise strings" #endif -#include "bytes_methods.h" +#include "pycore_bytes_methods.h" static PyObject* stringlib_isspace(PyObject *self, PyObject *Py_UNUSED(ignored)) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 8470e41624b..11fa1fb5ff7 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -40,6 +40,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_bytes_methods.h" #include "pycore_fileutils.h" #include "pycore_initconfig.h" #include "pycore_object.h" @@ -47,7 +48,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "pycore_pylifecycle.h" #include "pycore_pystate.h" #include "ucnhash.h" -#include "bytes_methods.h" #include "stringlib/eq.h" #ifdef MS_WINDOWS diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 36a27f46740..a3719d8558d 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -115,7 +115,6 @@ - @@ -161,6 +160,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 0301557b3e5..67e223dab43 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -48,9 +48,6 @@ Include - - Include - Include @@ -186,6 +183,9 @@ Include + + Include + Include From e9e7d284c434768333fdfb53a3663eae74cb995a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Feb 2020 22:54:42 +0100 Subject: [PATCH 363/380] bpo-35081: Move dtoa.h header to the internal C API (GH-18489) Move the dtoa.h header file to the internal C API as pycore_dtoa.h: it only contains private functions (prefixed by "_Py"). The math and cmath modules must now be compiled with the Py_BUILD_CORE macro defined. --- Include/Python.h | 1 - Include/{dtoa.h => internal/pycore_dtoa.h} | 12 ++++++++---- Makefile.pre.in | 2 +- .../C API/2020-02-12-21-24-02.bpo-35081.at7BjN.rst | 5 +++++ Modules/Setup | 4 ++-- Modules/cmathmodule.c | 1 + Modules/mathmodule.c | 1 + Objects/floatobject.c | 1 + PCbuild/pythoncore.vcxproj | 2 +- PCbuild/pythoncore.vcxproj.filters | 6 +++--- Python/dtoa.c | 1 + Python/pystrtod.c | 1 + setup.py | 2 ++ 13 files changed, 27 insertions(+), 12 deletions(-) rename Include/{dtoa.h => internal/pycore_dtoa.h} (66%) create mode 100644 Misc/NEWS.d/next/C API/2020-02-12-21-24-02.bpo-35081.at7BjN.rst diff --git a/Include/Python.h b/Include/Python.h index d6e5b139ac6..969d8e6bea7 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -152,7 +152,6 @@ #include "pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" -#include "dtoa.h" #include "fileutils.h" #include "pyfpe.h" #include "tracemalloc.h" diff --git a/Include/dtoa.h b/Include/internal/pycore_dtoa.h similarity index 66% rename from Include/dtoa.h rename to Include/internal/pycore_dtoa.h index 9bfb6251db8..3faf8cf6b2e 100644 --- a/Include/dtoa.h +++ b/Include/internal/pycore_dtoa.h @@ -1,9 +1,15 @@ -#ifndef Py_LIMITED_API #ifndef PY_NO_SHORT_FLOAT_REPR #ifdef __cplusplus extern "C" { #endif +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* These functions are used by modules compiled as C extension like math: + they must be exported. */ + PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr); PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve); @@ -11,9 +17,7 @@ PyAPI_FUNC(void) _Py_dg_freedtoa(char *s); PyAPI_FUNC(double) _Py_dg_stdnan(int sign); PyAPI_FUNC(double) _Py_dg_infinity(int sign); - #ifdef __cplusplus } #endif -#endif -#endif +#endif /* !PY_NO_SHORT_FLOAT_REPR */ diff --git a/Makefile.pre.in b/Makefile.pre.in index aae93ff82c1..f5540a2f0a6 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -981,7 +981,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/context.h \ $(srcdir)/Include/descrobject.h \ $(srcdir)/Include/dictobject.h \ - $(srcdir)/Include/dtoa.h \ $(srcdir)/Include/dynamic_annotations.h \ $(srcdir)/Include/enumobject.h \ $(srcdir)/Include/errcode.h \ @@ -1082,6 +1081,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_code.h \ $(srcdir)/Include/internal/pycore_condvar.h \ $(srcdir)/Include/internal/pycore_context.h \ + $(srcdir)/Include/internal/pycore_dtoa.h \ $(srcdir)/Include/internal/pycore_fileutils.h \ $(srcdir)/Include/internal/pycore_getopt.h \ $(srcdir)/Include/internal/pycore_gil.h \ diff --git a/Misc/NEWS.d/next/C API/2020-02-12-21-24-02.bpo-35081.at7BjN.rst b/Misc/NEWS.d/next/C API/2020-02-12-21-24-02.bpo-35081.at7BjN.rst new file mode 100644 index 00000000000..94e6ae7e42c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-02-12-21-24-02.bpo-35081.at7BjN.rst @@ -0,0 +1,5 @@ +Move the ``dtoa.h`` header file to the internal C API as ``pycore_dtoa.h``: +it only contains private functions (prefixed by ``_Py``). The :mod:`math` and +:mod:`cmath` modules must now be compiled with the ``Py_BUILD_CORE`` macro +defined. + diff --git a/Modules/Setup b/Modules/Setup index 983fa014ecb..40266a192bc 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -167,8 +167,8 @@ _symtable symtablemodule.c # Modules that should always be present (non UNIX dependent): #array arraymodule.c # array objects -#cmath cmathmodule.c _math.c # -lm # complex math library functions -#math mathmodule.c _math.c # -lm # math library functions, e.g. sin() +#cmath cmathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # complex math library functions +#math mathmodule.c _math.c -DPy_BUILD_CORE_MODULE # -lm # math library functions, e.g. sin() #_contextvars _contextvarsmodule.c # Context Variables #_struct _struct.c # binary structure packing/unpacking #_weakref _weakref.c # basic weak reference support diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 8b21decfa53..5eac4b4940b 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -3,6 +3,7 @@ /* much code borrowed from mathmodule.c */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index f012b51d866..309f2291595 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -53,6 +53,7 @@ raised for division by zero and mod by zero. */ #include "Python.h" +#include "pycore_dtoa.h" #include "_math.h" #include "clinic/mathmodule.c.h" diff --git a/Objects/floatobject.c b/Objects/floatobject.c index 648030b659c..04f968e56b1 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -4,6 +4,7 @@ for any kind of float exception without losing portability. */ #include "Python.h" +#include "pycore_dtoa.h" #include #include diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index a3719d8558d..7d597bcdac6 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -166,6 +166,7 @@ + @@ -223,7 +224,6 @@ - diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 67e223dab43..9563bdc25eb 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -201,6 +201,9 @@ Include + + Include + Include @@ -360,9 +363,6 @@ Include - - Include - Include diff --git a/Python/dtoa.c b/Python/dtoa.c index b7bb7acfb6c..822adc61296 100644 --- a/Python/dtoa.c +++ b/Python/dtoa.c @@ -115,6 +115,7 @@ /* Linking of Python's #defines to Gay's #defines starts here. */ #include "Python.h" +#include "pycore_dtoa.h" /* if PY_NO_SHORT_FLOAT_REPR is defined, then don't even try to compile the following code */ diff --git a/Python/pystrtod.c b/Python/pystrtod.c index 94dc4818c2f..1c8202c7761 100644 --- a/Python/pystrtod.c +++ b/Python/pystrtod.c @@ -1,6 +1,7 @@ /* -*- Mode: C; c-file-style: "python" -*- */ #include +#include "pycore_dtoa.h" #include /* Case-insensitive string match used for nan and inf detection; t should be diff --git a/setup.py b/setup.py index 02f523c42d3..51e67fe4a55 100644 --- a/setup.py +++ b/setup.py @@ -734,12 +734,14 @@ class PyBuildExt(build_ext): # math library functions, e.g. sin() self.add(Extension('math', ['mathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) # complex math library functions self.add(Extension('cmath', ['cmathmodule.c'], + extra_compile_args=['-DPy_BUILD_CORE_MODULE'], extra_objects=[shared_math], depends=['_math.h', shared_math], libraries=['m'])) From 98921aeaf5879b51e2dd1870c9285cfa8d1a52c7 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Feb 2020 23:54:31 +0100 Subject: [PATCH 364/380] bpo-35134: Add Include/cpython/bytesobject.h file (GH-18494) Add Include/cpython/bytearrayobject.h and Include/cpython/bytesobject.h header files. Move CPython C API from Include/bytesobject.h into a new Include/cpython/bytesobject.h header file which is included by Include/bytesobject.h. Do a similar change for Include/bytearrayobject.h. --- Include/bytearrayobject.h | 21 +---- Include/bytesobject.h | 126 +---------------------------- Include/cpython/bytearrayobject.h | 20 +++++ Include/cpython/bytesobject.h | 118 +++++++++++++++++++++++++++ Makefile.pre.in | 2 + PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 6 ++ 7 files changed, 155 insertions(+), 140 deletions(-) create mode 100644 Include/cpython/bytearrayobject.h create mode 100644 Include/cpython/bytesobject.h diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h index 647a17a819d..341ab38a15d 100644 --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -18,17 +18,6 @@ extern "C" { * to contain a char pointer, not an unsigned char pointer. */ -/* Object layout */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ - char *ob_bytes; /* Physical backing buffer */ - char *ob_start; /* Logical start inside ob_bytes */ - Py_ssize_t ob_exports; /* How many buffer exports */ -} PyByteArrayObject; -#endif - /* Type object */ PyAPI_DATA(PyTypeObject) PyByteArray_Type; PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; @@ -45,14 +34,10 @@ PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *); PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *); PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t); -/* Macros, trading safety for speed */ #ifndef Py_LIMITED_API -#define PyByteArray_AS_STRING(self) \ - (assert(PyByteArray_Check(self)), \ - Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) -#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) - -PyAPI_DATA(char) _PyByteArray_empty_string[]; +# define Py_CPYTHON_BYTEARRAYOBJECT_H +# include "cpython/bytearrayobject.h" +# undef Py_CPYTHON_BYTEARRAYOBJECT_H #endif #ifdef __cplusplus diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 4aaa71a832b..27c31ee342c 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -27,20 +27,6 @@ functions should be applied to nil objects. /* Caching the hash (ob_shash) saves recalculation of a string's hash value. This significantly speeds up dict lookups. */ -#ifndef Py_LIMITED_API -typedef struct { - PyObject_VAR_HEAD - Py_hash_t ob_shash; - char ob_sval[1]; - - /* 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. - */ -} PyBytesObject; -#endif - PyAPI_DATA(PyTypeObject) PyBytes_Type; PyAPI_DATA(PyTypeObject) PyBytesIter_Type; @@ -60,38 +46,9 @@ PyAPI_FUNC(char *) PyBytes_AsString(PyObject *); PyAPI_FUNC(PyObject *) PyBytes_Repr(PyObject *, int); PyAPI_FUNC(void) PyBytes_Concat(PyObject **, PyObject *); PyAPI_FUNC(void) PyBytes_ConcatAndDel(PyObject **, PyObject *); -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); -PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( - const char *format, - Py_ssize_t format_len, - PyObject *args, - int use_bytearray); -PyAPI_FUNC(PyObject*) _PyBytes_FromHex( - PyObject *string, - int use_bytearray); -#endif PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, Py_ssize_t, const char *); -#ifndef Py_LIMITED_API -/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ -PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, - const char *, const char **); -#endif - -/* Macro, trading safety for speed */ -#ifndef Py_LIMITED_API -#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ - (((PyBytesObject *)(op))->ob_sval)) -#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) -#endif - -/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, - x must be an iterable object. */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); -#endif /* Provides access to the internal data buffer and size of a string object or the default encoded version of a Unicode object. Passing @@ -114,85 +71,10 @@ PyAPI_FUNC(int) PyBytes_AsStringAndSize( #define F_ZERO (1<<4) #ifndef Py_LIMITED_API -/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". - A _PyBytesWriter variable must be declared at the end of variables in a - function to optimize the memory allocation on the stack. */ -typedef struct { - /* bytes, bytearray or NULL (when the small buffer is used) */ - PyObject *buffer; - - /* Number of allocated size. */ - Py_ssize_t allocated; - - /* Minimum number of allocated bytes, - incremented by _PyBytesWriter_Prepare() */ - Py_ssize_t min_size; - - /* If non-zero, use a bytearray instead of a bytes object for buffer. */ - int use_bytearray; - - /* If non-zero, overallocate the buffer (default: 0). - This flag must be zero if use_bytearray is non-zero. */ - int overallocate; - - /* Stack buffer */ - int use_small_buffer; - char small_buffer[512]; -} _PyBytesWriter; - -/* Initialize a bytes writer - - By default, the overallocation is disabled. Set the overallocate attribute - to control the allocation of the buffer. */ -PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); - -/* Get the buffer content and reset the writer. - Return a bytes object, or a bytearray object if use_bytearray is non-zero. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, - void *str); - -/* Deallocate memory of a writer (clear its internal buffer). */ -PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); - -/* Allocate the buffer to write size bytes. - Return the pointer to the beginning of buffer data. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, - Py_ssize_t size); - -/* Ensure that the buffer is large enough to write *size* bytes. - Add size to the writer minimum size (min_size attribute). - - str is the current pointer inside the buffer. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Resize the buffer to make it larger. - The new buffer may be larger than size bytes because of overallocation. - Return the updated current pointer inside the buffer. - Raise an exception and return NULL on error. - - Note: size must be greater than the number of allocated bytes in the writer. - - This function doesn't use the writer minimum size (min_size attribute). - - See also _PyBytesWriter_Prepare(). - */ -PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, - void *str, - Py_ssize_t size); - -/* Write bytes. - Raise an exception and return NULL on error. */ -PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, - void *str, - const void *bytes, - Py_ssize_t size); -#endif /* Py_LIMITED_API */ +# define Py_CPYTHON_BYTESOBJECT_H +# include "cpython/bytesobject.h" +# undef Py_CPYTHON_BYTESOBJECT_H +#endif #ifdef __cplusplus } diff --git a/Include/cpython/bytearrayobject.h b/Include/cpython/bytearrayobject.h new file mode 100644 index 00000000000..569b0cd0369 --- /dev/null +++ b/Include/cpython/bytearrayobject.h @@ -0,0 +1,20 @@ +#ifndef Py_CPYTHON_BYTEARRAYOBJECT_H +# error "this header file must not be included directly" +#endif + +/* Object layout */ +typedef struct { + PyObject_VAR_HEAD + Py_ssize_t ob_alloc; /* How many bytes allocated in ob_bytes */ + char *ob_bytes; /* Physical backing buffer */ + char *ob_start; /* Logical start inside ob_bytes */ + Py_ssize_t ob_exports; /* How many buffer exports */ +} PyByteArrayObject; + +/* Macros, trading safety for speed */ +#define PyByteArray_AS_STRING(self) \ + (assert(PyByteArray_Check(self)), \ + Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_start : _PyByteArray_empty_string) +#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)), Py_SIZE(self)) + +PyAPI_DATA(char) _PyByteArray_empty_string[]; diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h new file mode 100644 index 00000000000..f284c5835df --- /dev/null +++ b/Include/cpython/bytesobject.h @@ -0,0 +1,118 @@ +#ifndef Py_CPYTHON_BYTESOBJECT_H +# error "this header file must not be included directly" +#endif + +typedef struct { + PyObject_VAR_HEAD + Py_hash_t ob_shash; + char ob_sval[1]; + + /* 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. + */ +} PyBytesObject; + +PyAPI_FUNC(int) _PyBytes_Resize(PyObject **, Py_ssize_t); +PyAPI_FUNC(PyObject*) _PyBytes_FormatEx( + const char *format, + Py_ssize_t format_len, + PyObject *args, + int use_bytearray); +PyAPI_FUNC(PyObject*) _PyBytes_FromHex( + PyObject *string, + int use_bytearray); + +/* Helper for PyBytes_DecodeEscape that detects invalid escape chars. */ +PyAPI_FUNC(PyObject *) _PyBytes_DecodeEscape(const char *, Py_ssize_t, + const char *, const char **); + +/* Macro, trading safety for speed */ +#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \ + (((PyBytesObject *)(op))->ob_sval)) +#define PyBytes_GET_SIZE(op) (assert(PyBytes_Check(op)),Py_SIZE(op)) + +/* _PyBytes_Join(sep, x) is like sep.join(x). sep must be PyBytesObject*, + x must be an iterable object. */ +PyAPI_FUNC(PyObject *) _PyBytes_Join(PyObject *sep, PyObject *x); + + +/* The _PyBytesWriter structure is big: it contains an embedded "stack buffer". + A _PyBytesWriter variable must be declared at the end of variables in a + function to optimize the memory allocation on the stack. */ +typedef struct { + /* bytes, bytearray or NULL (when the small buffer is used) */ + PyObject *buffer; + + /* Number of allocated size. */ + Py_ssize_t allocated; + + /* Minimum number of allocated bytes, + incremented by _PyBytesWriter_Prepare() */ + Py_ssize_t min_size; + + /* If non-zero, use a bytearray instead of a bytes object for buffer. */ + int use_bytearray; + + /* If non-zero, overallocate the buffer (default: 0). + This flag must be zero if use_bytearray is non-zero. */ + int overallocate; + + /* Stack buffer */ + int use_small_buffer; + char small_buffer[512]; +} _PyBytesWriter; + +/* Initialize a bytes writer + + By default, the overallocation is disabled. Set the overallocate attribute + to control the allocation of the buffer. */ +PyAPI_FUNC(void) _PyBytesWriter_Init(_PyBytesWriter *writer); + +/* Get the buffer content and reset the writer. + Return a bytes object, or a bytearray object if use_bytearray is non-zero. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(PyObject *) _PyBytesWriter_Finish(_PyBytesWriter *writer, + void *str); + +/* Deallocate memory of a writer (clear its internal buffer). */ +PyAPI_FUNC(void) _PyBytesWriter_Dealloc(_PyBytesWriter *writer); + +/* Allocate the buffer to write size bytes. + Return the pointer to the beginning of buffer data. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Alloc(_PyBytesWriter *writer, + Py_ssize_t size); + +/* Ensure that the buffer is large enough to write *size* bytes. + Add size to the writer minimum size (min_size attribute). + + str is the current pointer inside the buffer. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_Prepare(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Resize the buffer to make it larger. + The new buffer may be larger than size bytes because of overallocation. + Return the updated current pointer inside the buffer. + Raise an exception and return NULL on error. + + Note: size must be greater than the number of allocated bytes in the writer. + + This function doesn't use the writer minimum size (min_size attribute). + + See also _PyBytesWriter_Prepare(). + */ +PyAPI_FUNC(void*) _PyBytesWriter_Resize(_PyBytesWriter *writer, + void *str, + Py_ssize_t size); + +/* Write bytes. + Raise an exception and return NULL on error. */ +PyAPI_FUNC(void*) _PyBytesWriter_WriteBytes(_PyBytesWriter *writer, + void *str, + const void *bytes, + Py_ssize_t size); diff --git a/Makefile.pre.in b/Makefile.pre.in index f5540a2f0a6..2f3fab7b33c 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1055,6 +1055,8 @@ PYTHON_HEADERS= \ $(srcdir)/Include/Python-ast.h \ \ $(srcdir)/Include/cpython/abstract.h \ + $(srcdir)/Include/cpython/bytearrayobject.h \ + $(srcdir)/Include/cpython/bytesobject.h \ $(srcdir)/Include/cpython/ceval.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 7d597bcdac6..9e6323fdcbb 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -126,6 +126,8 @@ + + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 9563bdc25eb..b1412d550c0 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -81,6 +81,12 @@ Include + + Include + + + Include + Include From 8c3aee65ed3aff3668da330ccd6f9ba7b2aa4567 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 12 Feb 2020 23:55:09 +0100 Subject: [PATCH 365/380] bpo-35134: Add Include/cpython/fileutils.h header file (GH-18493) Move CPython C API from Include/fileutils.h into a new Include/cpython/fileutils.h header file which is included by Include/fileutils.h. Exclude the following private symbols from the limited C API: * _Py_error_handler * _Py_GetErrorHandler() * _Py_DecodeLocaleEx() * _Py_EncodeLocaleEx() --- Include/cpython/fileutils.h | 165 ++++++++++++++++++++++++++++ Include/fileutils.h | 167 +---------------------------- Makefile.pre.in | 1 + PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 + 5 files changed, 173 insertions(+), 164 deletions(-) create mode 100644 Include/cpython/fileutils.h diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h new file mode 100644 index 00000000000..e79d03e24f5 --- /dev/null +++ b/Include/cpython/fileutils.h @@ -0,0 +1,165 @@ +#ifndef Py_CPYTHON_FILEUTILS_H +# error "this header file must not be included directly" +#endif + +typedef enum { + _Py_ERROR_UNKNOWN=0, + _Py_ERROR_STRICT, + _Py_ERROR_SURROGATEESCAPE, + _Py_ERROR_REPLACE, + _Py_ERROR_IGNORE, + _Py_ERROR_BACKSLASHREPLACE, + _Py_ERROR_SURROGATEPASS, + _Py_ERROR_XMLCHARREFREPLACE, + _Py_ERROR_OTHER +} _Py_error_handler; + +PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); + +PyAPI_FUNC(int) _Py_DecodeLocaleEx( + const char *arg, + wchar_t **wstr, + size_t *wlen, + const char **reason, + int current_locale, + _Py_error_handler errors); + +PyAPI_FUNC(int) _Py_EncodeLocaleEx( + const wchar_t *text, + char **str, + size_t *error_pos, + const char **reason, + int current_locale, + _Py_error_handler errors); + + +PyAPI_FUNC(PyObject *) _Py_device_encoding(int); + +#if defined(MS_WINDOWS) || defined(__APPLE__) + /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). + On macOS 10.13, read() and write() with more than INT_MAX bytes + fail with EINVAL (bpo-24658). */ +# define _PY_READ_MAX INT_MAX +# define _PY_WRITE_MAX INT_MAX +#else + /* write() should truncate the input to PY_SSIZE_T_MAX bytes, + but it's safer to do it ourself to have a portable behaviour */ +# define _PY_READ_MAX PY_SSIZE_T_MAX +# define _PY_WRITE_MAX PY_SSIZE_T_MAX +#endif + +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + uint64_t st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; + unsigned long st_reparse_tag; +}; +#else +# define _Py_stat_struct stat +#endif + +PyAPI_FUNC(int) _Py_fstat( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_fstat_noraise( + int fd, + struct _Py_stat_struct *status); + +PyAPI_FUNC(int) _Py_stat( + PyObject *path, + struct stat *status); + +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_noraise( + const char *pathname, + int flags); + +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); + +PyAPI_FUNC(Py_ssize_t) _Py_read( + int fd, + void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write( + int fd, + const void *buf, + size_t count); + +PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( + int fd, + const void *buf, + size_t count); + +#ifdef HAVE_READLINK +PyAPI_FUNC(int) _Py_wreadlink( + const wchar_t *path, + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); +#endif + +#ifdef HAVE_REALPATH +PyAPI_FUNC(wchar_t*) _Py_wrealpath( + const wchar_t *path, + wchar_t *resolved_path, + /* Number of characters of 'resolved_path' buffer + including the trailing NUL character */ + size_t resolved_path_len); +#endif + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_isabs(const wchar_t *path); +#endif + +PyAPI_FUNC(int) _Py_abspath(const wchar_t *path, wchar_t **abspath_p); + +PyAPI_FUNC(wchar_t*) _Py_wgetcwd( + wchar_t *buf, + /* Number of characters of 'buf' buffer + including the trailing NUL character */ + size_t buflen); + +PyAPI_FUNC(int) _Py_get_inheritable(int fd); + +PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, + int *atomic_flag_works); + +PyAPI_FUNC(int) _Py_dup(int fd); + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ diff --git a/Include/fileutils.h b/Include/fileutils.h index a9655bbf9a5..12bd071c49c 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -18,173 +18,12 @@ PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( size_t *error_pos); #endif - -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03080000 -typedef enum { - _Py_ERROR_UNKNOWN=0, - _Py_ERROR_STRICT, - _Py_ERROR_SURROGATEESCAPE, - _Py_ERROR_REPLACE, - _Py_ERROR_IGNORE, - _Py_ERROR_BACKSLASHREPLACE, - _Py_ERROR_SURROGATEPASS, - _Py_ERROR_XMLCHARREFREPLACE, - _Py_ERROR_OTHER -} _Py_error_handler; - -PyAPI_FUNC(_Py_error_handler) _Py_GetErrorHandler(const char *errors); - -PyAPI_FUNC(int) _Py_DecodeLocaleEx( - const char *arg, - wchar_t **wstr, - size_t *wlen, - const char **reason, - int current_locale, - _Py_error_handler errors); - -PyAPI_FUNC(int) _Py_EncodeLocaleEx( - const wchar_t *text, - char **str, - size_t *error_pos, - const char **reason, - int current_locale, - _Py_error_handler errors); -#endif - #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _Py_device_encoding(int); - -#if defined(MS_WINDOWS) || defined(__APPLE__) - /* On Windows, the count parameter of read() is an int (bpo-9015, bpo-9611). - On macOS 10.13, read() and write() with more than INT_MAX bytes - fail with EINVAL (bpo-24658). */ -# define _PY_READ_MAX INT_MAX -# define _PY_WRITE_MAX INT_MAX -#else - /* write() should truncate the input to PY_SSIZE_T_MAX bytes, - but it's safer to do it ourself to have a portable behaviour */ -# define _PY_READ_MAX PY_SSIZE_T_MAX -# define _PY_WRITE_MAX PY_SSIZE_T_MAX +# define Py_CPYTHON_FILEUTILS_H +# include "cpython/fileutils.h" +# undef Py_CPYTHON_FILEUTILS_H #endif -#ifdef MS_WINDOWS -struct _Py_stat_struct { - unsigned long st_dev; - uint64_t st_ino; - unsigned short st_mode; - int st_nlink; - int st_uid; - int st_gid; - unsigned long st_rdev; - __int64 st_size; - time_t st_atime; - int st_atime_nsec; - time_t st_mtime; - int st_mtime_nsec; - time_t st_ctime; - int st_ctime_nsec; - unsigned long st_file_attributes; - unsigned long st_reparse_tag; -}; -#else -# define _Py_stat_struct stat -#endif - -PyAPI_FUNC(int) _Py_fstat( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_fstat_noraise( - int fd, - struct _Py_stat_struct *status); - -PyAPI_FUNC(int) _Py_stat( - PyObject *path, - struct stat *status); - -PyAPI_FUNC(int) _Py_open( - const char *pathname, - int flags); - -PyAPI_FUNC(int) _Py_open_noraise( - const char *pathname, - int flags); - -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); - -PyAPI_FUNC(Py_ssize_t) _Py_read( - int fd, - void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write( - int fd, - const void *buf, - size_t count); - -PyAPI_FUNC(Py_ssize_t) _Py_write_noraise( - int fd, - const void *buf, - size_t count); - -#ifdef HAVE_READLINK -PyAPI_FUNC(int) _Py_wreadlink( - const wchar_t *path, - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); -#endif - -#ifdef HAVE_REALPATH -PyAPI_FUNC(wchar_t*) _Py_wrealpath( - const wchar_t *path, - wchar_t *resolved_path, - /* Number of characters of 'resolved_path' buffer - including the trailing NUL character */ - size_t resolved_path_len); -#endif - -#ifndef MS_WINDOWS -PyAPI_FUNC(int) _Py_isabs(const wchar_t *path); -#endif - -PyAPI_FUNC(int) _Py_abspath(const wchar_t *path, wchar_t **abspath_p); - -PyAPI_FUNC(wchar_t*) _Py_wgetcwd( - wchar_t *buf, - /* Number of characters of 'buf' buffer - including the trailing NUL character */ - size_t buflen); - -PyAPI_FUNC(int) _Py_get_inheritable(int fd); - -PyAPI_FUNC(int) _Py_set_inheritable(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_set_inheritable_async_safe(int fd, int inheritable, - int *atomic_flag_works); - -PyAPI_FUNC(int) _Py_dup(int fd); - -#ifndef MS_WINDOWS -PyAPI_FUNC(int) _Py_get_blocking(int fd); - -PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); -#endif /* !MS_WINDOWS */ - -#endif /* Py_LIMITED_API */ - #ifdef __cplusplus } #endif diff --git a/Makefile.pre.in b/Makefile.pre.in index 2f3fab7b33c..3199a1aa02d 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1060,6 +1060,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/cpython/ceval.h \ $(srcdir)/Include/cpython/dictobject.h \ $(srcdir)/Include/cpython/fileobject.h \ + $(srcdir)/Include/cpython/fileutils.h \ $(srcdir)/Include/cpython/import.h \ $(srcdir)/Include/cpython/initconfig.h \ $(srcdir)/Include/cpython/interpreteridobject.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 9e6323fdcbb..0acf7f4a8de 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -131,6 +131,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index b1412d550c0..a846a37630a 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -96,6 +96,9 @@ Include + + Include + Include From 597ebed748d0b0c061f8c108bd98270d103286c1 Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Wed, 12 Feb 2020 22:53:01 -0600 Subject: [PATCH 366/380] closes bpo-39621: Make buf arg to md5_compress be const. (GH-18497) --- Modules/md5module.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/md5module.c b/Modules/md5module.c index d783ae5a765..ea2bafb9b65 100644 --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -119,7 +119,7 @@ typedef struct { a = (a + I(b,c,d) + M + t); a = ROLc(a, s) + b; -static void md5_compress(struct md5_state *md5, unsigned char *buf) +static void md5_compress(struct md5_state *md5, const unsigned char *buf) { MD5_INT32 i, W[16], a, b, c, d; @@ -242,7 +242,7 @@ md5_process(struct md5_state *md5, const unsigned char *in, Py_ssize_t inlen) while (inlen > 0) { if (md5->curlen == 0 && inlen >= MD5_BLOCKSIZE) { - md5_compress(md5, (unsigned char *)in); + md5_compress(md5, in); md5->length += MD5_BLOCKSIZE * 8; in += MD5_BLOCKSIZE; inlen -= MD5_BLOCKSIZE; From 7514f4f6254f4a2d13ea8e5632a8e5f22b637e0b Mon Sep 17 00:00:00 2001 From: Saiyang Gou Date: Wed, 12 Feb 2020 23:47:42 -0800 Subject: [PATCH 367/380] bpo-39184: Add audit events to functions in `fcntl`, `msvcrt`, `os`, `resource`, `shutil`, `signal`, `syslog` (GH-18407) --- Doc/library/fcntl.rst | 8 + Doc/library/msvcrt.rst | 6 + Doc/library/os.rst | 68 ++++++++ Doc/library/resource.rst | 5 + Doc/library/shutil.rst | 20 +++ Doc/library/signal.rst | 2 + Doc/library/syslog.rst | 8 + Lib/shutil.py | 10 ++ .../2020-02-07-23-54-18.bpo-39184.v-ue-v.rst | 1 + Modules/fcntlmodule.c | 18 +++ Modules/posixmodule.c | 151 ++++++++++++++++-- Modules/resource.c | 10 ++ Modules/signalmodule.c | 4 + Modules/syslogmodule.c | 14 ++ PC/msvcrtmodule.c | 12 ++ 15 files changed, 320 insertions(+), 17 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2020-02-07-23-54-18.bpo-39184.v-ue-v.rst diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index 5c172b836ac..07a15d27216 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -63,6 +63,8 @@ The module defines the following functions: If the :c:func:`fcntl` fails, an :exc:`OSError` is raised. + .. audit-event:: fcntl.fcntl fd,cmd,arg fcntl.fcntl + .. function:: ioctl(fd, request, arg=0, mutate_flag=True) @@ -112,6 +114,8 @@ The module defines the following functions: >>> buf array('h', [13341]) + .. audit-event:: fcntl.ioctl fd,request,arg fcntl.ioctl + .. function:: flock(fd, operation) @@ -122,6 +126,8 @@ The module defines the following functions: If the :c:func:`flock` fails, an :exc:`OSError` exception is raised. + .. audit-event:: fcntl.flock fd,operation fcntl.flock + .. function:: lockf(fd, cmd, len=0, start=0, whence=0) @@ -155,6 +161,8 @@ The module defines the following functions: The default for *len* is 0 which means to lock to the end of the file. The default for *whence* is also 0. + .. audit-event:: fcntl.lockf fd,cmd,len,start,whence fcntl.lockf + Examples (all on a SVR4 compliant system):: import struct, fcntl, os diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst index 14ad2cd4373..42fffee6a0f 100644 --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -42,6 +42,8 @@ File Operations regions in a file may be locked at the same time, but may not overlap. Adjacent regions are not merged; they must be unlocked individually. + .. audit-event:: msvcrt.locking fd,mode,nbytes msvcrt.locking + .. data:: LK_LOCK LK_RLCK @@ -77,12 +79,16 @@ File Operations and :const:`os.O_TEXT`. The returned file descriptor may be used as a parameter to :func:`os.fdopen` to create a file object. + .. audit-event:: msvcrt.open_osfhandle handle,flags msvcrt.open_osfhandle + .. function:: get_osfhandle(fd) Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if *fd* is not recognized. + .. audit-event:: msvcrt.get_osfhandle fd msvcrt.get_osfhandle + .. _msvcrt-console: diff --git a/Doc/library/os.rst b/Doc/library/os.rst index b06a318c3d7..af02a373f33 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -445,6 +445,8 @@ process and user. On some platforms, including FreeBSD and Mac OS X, setting ``environ`` may cause memory leaks. Refer to the system documentation for :c:func:`putenv`. + .. audit-event:: os.putenv key,value os.putenv + .. versionchanged:: 3.9 The function is now always available. @@ -640,6 +642,8 @@ process and user. don't update ``os.environ``, so it is actually preferable to delete items of ``os.environ``. + .. audit-event:: os.unsetenv key os.unsetenv + .. versionchanged:: 3.9 The function is now always available and is also available on Windows. @@ -766,6 +770,8 @@ as internal buffering of data. docs for :func:`chmod` for possible values of *mode*. As of Python 3.3, this is equivalent to ``os.chmod(fd, mode)``. + .. audit-event:: os.chmod path,mode,dir_fd os.fchmod + .. availability:: Unix. @@ -776,6 +782,8 @@ as internal buffering of data. :func:`chown`. As of Python 3.3, this is equivalent to ``os.chown(fd, uid, gid)``. + .. audit-event:: os.chown path,uid,gid,dir_fd os.fchown + .. availability:: Unix. @@ -883,6 +891,8 @@ as internal buffering of data. :data:`F_ULOCK` or :data:`F_TEST`. *len* specifies the section of the file to lock. + .. audit-event:: os.lockf fd,cmd,len os.lockf + .. availability:: Unix. .. versionadded:: 3.3 @@ -1603,6 +1613,8 @@ features: This function can raise :exc:`OSError` and subclasses such as :exc:`FileNotFoundError`, :exc:`PermissionError`, and :exc:`NotADirectoryError`. + .. audit-event:: os.chdir path os.chdir + .. versionadded:: 3.3 Added support for specifying *path* as a file descriptor on some platforms. @@ -1631,6 +1643,8 @@ features: This function can support :ref:`not following symlinks `. + .. audit-event:: os.chflags path,flags os.chflags + .. availability:: Unix. .. versionadded:: 3.3 @@ -1676,6 +1690,8 @@ features: read-only flag with it (via the ``stat.S_IWRITE`` and ``stat.S_IREAD`` constants or a corresponding integer value). All other bits are ignored. + .. audit-event:: os.chmod path,mode,dir_fd os.chmod + .. versionadded:: 3.3 Added support for specifying *path* as an open file descriptor, and the *dir_fd* and *follow_symlinks* arguments. @@ -1696,6 +1712,8 @@ features: See :func:`shutil.chown` for a higher-level function that accepts names in addition to numeric ids. + .. audit-event:: os.chown path,uid,gid,dir_fd os.chown + .. availability:: Unix. .. versionadded:: 3.3 @@ -1722,6 +1740,8 @@ features: descriptor *fd*. The descriptor must refer to an opened directory, not an open file. As of Python 3.3, this is equivalent to ``os.chdir(fd)``. + .. audit-event:: os.chdir path os.fchdir + .. availability:: Unix. @@ -1746,6 +1766,8 @@ features: not follow symbolic links. As of Python 3.3, this is equivalent to ``os.chflags(path, flags, follow_symlinks=False)``. + .. audit-event:: os.chflags path,flags os.lchflags + .. availability:: Unix. .. versionchanged:: 3.6 @@ -1759,6 +1781,8 @@ features: for possible values of *mode*. As of Python 3.3, this is equivalent to ``os.chmod(path, mode, follow_symlinks=False)``. + .. audit-event:: os.chmod path,mode,dir_fd os.lchmod + .. availability:: Unix. .. versionchanged:: 3.6 @@ -1770,6 +1794,8 @@ features: function will not follow symbolic links. As of Python 3.3, this is equivalent to ``os.chown(path, uid, gid, follow_symlinks=False)``. + .. audit-event:: os.chown path,uid,gid,dir_fd os.lchown + .. availability:: Unix. .. versionchanged:: 3.6 @@ -1784,6 +1810,8 @@ features: supply :ref:`paths relative to directory descriptors `, and :ref:`not following symlinks `. + .. audit-event:: os.link src,dst,src_dir_fd,dst_dir_fd os.link + .. availability:: Unix, Windows. .. versionchanged:: 3.2 @@ -1886,6 +1914,8 @@ features: It is also possible to create temporary directories; see the :mod:`tempfile` module's :func:`tempfile.mkdtemp` function. + .. audit-event:: os.mkdir path,mode,dir_fd os.mkdir + .. versionadded:: 3.3 The *dir_fd* argument. @@ -1918,6 +1948,8 @@ features: This function handles UNC paths correctly. + .. audit-event:: os.mkdir path,mode,dir_fd os.makedirs + .. versionadded:: 3.2 The *exist_ok* parameter. @@ -2083,6 +2115,8 @@ features: This function is semantically identical to :func:`unlink`. + .. audit-event:: os.remove path,dir_fd os.remove + .. versionadded:: 3.3 The *dir_fd* argument. @@ -2103,6 +2137,8 @@ features: they are empty. Raises :exc:`OSError` if the leaf directory could not be successfully removed. + .. audit-event:: os.remove path,dir_fd os.removedirs + .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -2128,6 +2164,8 @@ features: If you want cross-platform overwriting of the destination, use :func:`replace`. + .. audit-event:: os.rename src,dst,src_dir_fd,dst_dir_fd os.rename + .. versionadded:: 3.3 The *src_dir_fd* and *dst_dir_fd* arguments. @@ -2147,6 +2185,8 @@ features: This function can fail with the new directory structure made if you lack permissions needed to remove the leaf directory or file. + .. audit-event:: os.rename src,dst,src_dir_fd,dst_dir_fd os.renames + .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *old* and *new*. @@ -2162,6 +2202,8 @@ features: This function can support specifying *src_dir_fd* and/or *dst_dir_fd* to supply :ref:`paths relative to directory descriptors `. + .. audit-event:: os.rename src,dst,src_dir_fd,dst_dir_fd os.replace + .. versionadded:: 3.3 .. versionchanged:: 3.6 @@ -2178,6 +2220,8 @@ features: This function can support :ref:`paths relative to directory descriptors `. + .. audit-event:: os.rmdir path,dir_fd os.rmdir + .. versionadded:: 3.3 The *dir_fd* parameter. @@ -2821,6 +2865,8 @@ features: :exc:`OSError` is raised when the function is called by an unprivileged user. + .. audit-event:: os.symlink src,dst,dir_fd os.symlink + .. availability:: Unix, Windows. .. versionchanged:: 3.2 @@ -2873,6 +2919,8 @@ features: traditional Unix name. Please see the documentation for :func:`remove` for further information. + .. audit-event:: os.remove path,dir_fd os.unlink + .. versionadded:: 3.3 The *dir_fd* parameter. @@ -2910,6 +2958,8 @@ features: :ref:`paths relative to directory descriptors ` and :ref:`not following symlinks `. + .. audit-event:: os.utime path,times,ns,dir_fd os.utime + .. versionadded:: 3.3 Added support for specifying *path* as an open file descriptor, and the *dir_fd*, *follow_symlinks*, and *ns* parameters. @@ -3135,6 +3185,8 @@ These functions are all available on Linux only. This function can support :ref:`specifying a file descriptor ` and :ref:`not following symlinks `. + .. audit-event:: os.getxattr path,attribute os.getxattr + .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *path* and *attribute*. @@ -3149,6 +3201,8 @@ These functions are all available on Linux only. This function can support :ref:`specifying a file descriptor ` and :ref:`not following symlinks `. + .. audit-event:: os.listxattr path os.listxattr + .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -3163,6 +3217,8 @@ These functions are all available on Linux only. This function can support :ref:`specifying a file descriptor ` and :ref:`not following symlinks `. + .. audit-event:: os.removexattr path,attribute os.removexattr + .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *path* and *attribute*. @@ -3186,6 +3242,8 @@ These functions are all available on Linux only. A bug in Linux kernel versions less than 2.6.39 caused the flags argument to be ignored on some filesystems. + .. audit-event:: os.setxattr path,attribute,value,flags os.setxattr + .. versionchanged:: 3.6 Accepts a :term:`path-like object` for *path* and *attribute*. @@ -3248,6 +3306,8 @@ to be ignored. `_ for more information about how DLLs are loaded. + .. audit-event:: os.add_dll_directory path os.add_dll_directory + .. availability:: Windows. .. versionadded:: 3.8 @@ -3480,6 +3540,8 @@ written in Python, such as a mail server's external command delivery program. Note that some platforms including FreeBSD <= 6.3 and Cygwin have known issues when using ``fork()`` from a thread. + .. audit-event:: os.fork "" os.fork + .. versionchanged:: 3.8 Calling ``fork()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). @@ -3499,6 +3561,8 @@ written in Python, such as a mail server's external command delivery program. master end of the pseudo-terminal. For a more portable approach, use the :mod:`pty` module. If an error occurs :exc:`OSError` is raised. + .. audit-event:: os.forkpty "" os.forkpty + .. versionchanged:: 3.8 Calling ``forkpty()`` in a subinterpreter is no longer supported (:exc:`RuntimeError` is raised). @@ -3525,6 +3589,8 @@ written in Python, such as a mail server's external command delivery program. See also :func:`signal.pthread_kill`. + .. audit-event:: os.kill pid,sig os.kill + .. versionadded:: 3.2 Windows support. @@ -3537,6 +3603,8 @@ written in Python, such as a mail server's external command delivery program. Send the signal *sig* to the process group *pgid*. + .. audit-event:: os.killpg pgid,sig os.killpg + .. availability:: Unix. diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index 3573da7ea2d..e4eac43642d 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -78,6 +78,9 @@ this module for those platforms. VxWorks only supports setting :data:`RLIMIT_NOFILE`. + .. audit-event:: resource.setrlimit resource,limits resource.setrlimit + + .. function:: prlimit(pid, resource[, limits]) Combines :func:`setrlimit` and :func:`getrlimit` in one function and @@ -94,6 +97,8 @@ this module for those platforms. :exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for the process. + .. audit-event:: resource.prlimit pid,resource,limits resource.prlimit + .. availability:: Linux 2.6.36 or later with glibc 2.13 or later. .. versionadded:: 3.4 diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 59390d0e907..c7c63e6f808 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -67,6 +67,8 @@ Directory and files operations a new symbolic link will be created instead of copying the file *src* points to. + .. audit-event:: shutil.copyfile src,dst shutil.copyfile + .. versionchanged:: 3.3 :exc:`IOError` used to be raised instead of :exc:`OSError`. Added *follow_symlinks* argument. @@ -101,6 +103,8 @@ Directory and files operations :func:`copymode` cannot modify symbolic links on the local platform, and it is asked to do so, it will do nothing and return. + .. audit-event:: shutil.copymode src,dst shutil.copymode + .. versionchanged:: 3.3 Added *follow_symlinks* argument. @@ -146,6 +150,8 @@ Directory and files operations Please see :data:`os.supports_follow_symlinks` for more information. + .. audit-event:: shutil.copystat src,dst shutil.copystat + .. versionchanged:: 3.3 Added *follow_symlinks* argument and support for Linux extended attributes. @@ -167,6 +173,10 @@ Directory and files operations To preserve all file metadata from the original, use :func:`~shutil.copy2` instead. + .. audit-event:: shutil.copyfile src,dst shutil.copy + + .. audit-event:: shutil.copymode src,dst shutil.copy + .. versionchanged:: 3.3 Added *follow_symlinks* argument. Now returns path to the newly created file. @@ -194,6 +204,10 @@ Directory and files operations Please see :func:`copystat` for more information about platform support for modifying symbolic link metadata. + .. audit-event:: shutil.copyfile src,dst shutil.copy2 + + .. audit-event:: shutil.copystat src,dst shutil.copy2 + .. versionchanged:: 3.3 Added *follow_symlinks* argument, try to copy extended file system attributes too (currently Linux only). @@ -342,6 +356,8 @@ Directory and files operations *copy_function* allows the move to succeed when it is not possible to also copy the metadata, at the expense of not copying any of the metadata. + .. audit-event:: shutil.move src,dst shutil.move + .. versionchanged:: 3.3 Added explicit symlink handling for foreign filesystems, thus adapting it to the behavior of GNU's :program:`mv`. @@ -381,6 +397,8 @@ Directory and files operations See also :func:`os.chown`, the underlying function. + .. audit-event:: shutil.chown path,user,group shutil.chown + .. availability:: Unix. .. versionadded:: 3.3 @@ -632,6 +650,8 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. registered for that extension. In case none is found, a :exc:`ValueError` is raised. + .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive + .. versionchanged:: 3.7 Accepts a :term:`path-like object` for *filename* and *extract_dir*. diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index a79fc501352..8b3ab412bd3 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -277,6 +277,8 @@ The :mod:`signal` module defines the following functions: If *signalnum* is 0, then no signal is sent, but error checking is still performed; this can be used to check if the target thread is still running. + .. audit-event:: signal.pthread_kill thread_id,signalnum signal.pthread_kill + .. availability:: Unix. See the man page :manpage:`pthread_kill(3)` for further information. diff --git a/Doc/library/syslog.rst b/Doc/library/syslog.rst index 7151527ce57..d264a3340c9 100644 --- a/Doc/library/syslog.rst +++ b/Doc/library/syslog.rst @@ -31,6 +31,8 @@ The module defines the following functions: If :func:`openlog` has not been called prior to the call to :func:`syslog`, ``openlog()`` will be called with no arguments. + .. audit-event:: syslog.syslog priority,message syslog.syslog + .. function:: openlog([ident[, logoption[, facility]]]) @@ -45,6 +47,8 @@ The module defines the following functions: keyword argument (default is :const:`LOG_USER`) sets the default facility for messages which do not have a facility explicitly encoded. + .. audit-event:: syslog.openlog ident,logoption,facility syslog.openlog + .. versionchanged:: 3.2 In previous versions, keyword arguments were not allowed, and *ident* was required. The default for *ident* was dependent on the system libraries, @@ -60,6 +64,8 @@ The module defines the following functions: :func:`openlog` hasn't already been called), and *ident* and other :func:`openlog` parameters are reset to defaults. + .. audit-event:: syslog.closelog "" syslog.closelog + .. function:: setlogmask(maskpri) @@ -70,6 +76,8 @@ The module defines the following functions: ``LOG_UPTO(pri)`` calculates the mask for all priorities up to and including *pri*. + .. audit-event:: syslog.setlogmask maskpri syslog.setlogmask + The module defines the following constants: Priority levels (high to low): diff --git a/Lib/shutil.py b/Lib/shutil.py index 9a83a3242ed..a4ce2c0290b 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -235,6 +235,8 @@ def copyfile(src, dst, *, follow_symlinks=True): symlink will be created instead of copying the file it points to. """ + sys.audit("shutil.copyfile", src, dst) + if _samefile(src, dst): raise SameFileError("{!r} and {!r} are the same file".format(src, dst)) @@ -289,6 +291,8 @@ def copymode(src, dst, *, follow_symlinks=True): (e.g. Linux) this method does nothing. """ + sys.audit("shutil.copymode", src, dst) + if not follow_symlinks and _islink(src) and os.path.islink(dst): if hasattr(os, 'lchmod'): stat_func, chmod_func = os.lstat, os.lchmod @@ -340,6 +344,8 @@ def copystat(src, dst, *, follow_symlinks=True): If the optional flag `follow_symlinks` is not set, symlinks aren't followed if and only if both `src` and `dst` are symlinks. """ + sys.audit("shutil.copystat", src, dst) + def _nop(*args, ns=None, follow_symlinks=None): pass @@ -778,6 +784,7 @@ def move(src, dst, copy_function=copy2): the issues this implementation glosses over. """ + sys.audit("shutil.move", src, dst) real_dst = dst if os.path.isdir(dst): if _samefile(src, dst): @@ -1208,6 +1215,8 @@ def unpack_archive(filename, extract_dir=None, format=None): In case none is found, a ValueError is raised. """ + sys.audit("shutil.unpack_archive", filename, extract_dir, format) + if extract_dir is None: extract_dir = os.getcwd() @@ -1275,6 +1284,7 @@ def chown(path, user=None, group=None): user and group can be the uid/gid or the user/group names, and in that case, they are converted to their respective uid/gid. """ + sys.audit('shutil.chown', path, user, group) if user is None and group is None: raise ValueError("user and/or group must be set") diff --git a/Misc/NEWS.d/next/Security/2020-02-07-23-54-18.bpo-39184.v-ue-v.rst b/Misc/NEWS.d/next/Security/2020-02-07-23-54-18.bpo-39184.v-ue-v.rst new file mode 100644 index 00000000000..cf25c24d587 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2020-02-07-23-54-18.bpo-39184.v-ue-v.rst @@ -0,0 +1 @@ +Add audit events to functions in `fcntl`, `msvcrt`, `os`, `resource`, `shutil`, `signal` and `syslog`. \ No newline at end of file diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c index 11906aa5829..43f9b22f672 100644 --- a/Modules/fcntlmodule.c +++ b/Modules/fcntlmodule.c @@ -66,6 +66,10 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg) char buf[1024]; int async_err = 0; + if (PySys_Audit("fcntl.fcntl", "iiO", fd, code, arg ? arg : Py_None) < 0) { + return NULL; + } + if (arg != NULL) { int parse_result; @@ -171,6 +175,11 @@ fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code, Py_ssize_t len; char buf[IOCTL_BUFSZ+1]; /* argument plus NUL byte */ + if (PySys_Audit("fcntl.ioctl", "iIO", fd, code, + ob_arg ? ob_arg : Py_None) < 0) { + return NULL; + } + if (ob_arg != NULL) { if (PyArg_Parse(ob_arg, "w*:ioctl", &pstr)) { char *arg; @@ -288,6 +297,10 @@ fcntl_flock_impl(PyObject *module, int fd, int code) int ret; int async_err = 0; + if (PySys_Audit("fcntl.flock", "ii", fd, code) < 0) { + return NULL; + } + #ifdef HAVE_FLOCK do { Py_BEGIN_ALLOW_THREADS @@ -372,6 +385,11 @@ fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj, int ret; int async_err = 0; + if (PySys_Audit("fcntl.lockf", "iiOOi", fd, code, lenobj ? lenobj : Py_None, + startobj ? startobj : Py_None, whence) < 0) { + return NULL; + } + #ifndef LOCK_SH #define LOCK_SH 1 /* shared lock */ #define LOCK_EX 2 /* exclusive lock */ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index ec3da4fb2fc..4d6d255b346 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2911,6 +2911,10 @@ os_chdir_impl(PyObject *module, path_t *path) { int result; + if (PySys_Audit("os.chdir", "(O)", path->object) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS /* on unix, success = 0, on windows, success = !0 */ @@ -2950,6 +2954,9 @@ static PyObject * os_fchdir_impl(PyObject *module, int fd) /*[clinic end generated code: output=42e064ec4dc00ab0 input=18e816479a2fa985]*/ { + if (PySys_Audit("os.chdir", "(i)", fd) < 0) { + return NULL; + } return posix_fildes_fd(fd, fchdir); } #endif /* HAVE_FCHDIR */ @@ -3007,6 +3014,11 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, return NULL; #endif + if (PySys_Audit("os.chmod", "Oii", path->object, mode, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS attr = GetFileAttributesW(path->wide); @@ -3103,6 +3115,10 @@ os_fchmod_impl(PyObject *module, int fd, int mode) int res; int async_err = 0; + if (PySys_Audit("os.chmod", "iii", fd, mode, -1) < 0) { + return NULL; + } + do { Py_BEGIN_ALLOW_THREADS res = fchmod(fd, mode); @@ -3134,6 +3150,9 @@ os_lchmod_impl(PyObject *module, path_t *path, int mode) /*[clinic end generated code: output=082344022b51a1d5 input=90c5663c7465d24f]*/ { int res; + if (PySys_Audit("os.chmod", "Oii", path->object, mode, -1) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS res = lchmod(path->narrow, mode); Py_END_ALLOW_THREADS @@ -3176,6 +3195,10 @@ os_chflags_impl(PyObject *module, path_t *path, unsigned long flags, return NULL; #endif + if (PySys_Audit("os.chflags", "Ok", path->object, flags) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS #ifdef HAVE_LCHFLAGS if (!follow_symlinks) @@ -3211,6 +3234,9 @@ os_lchflags_impl(PyObject *module, path_t *path, unsigned long flags) /*[clinic end generated code: output=30ae958695c07316 input=f9f82ea8b585ca9d]*/ { int res; + if (PySys_Audit("os.chflags", "Ok", path->object, flags) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS res = lchflags(path->narrow, flags); Py_END_ALLOW_THREADS @@ -3373,6 +3399,11 @@ os_chown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid, } #endif + if (PySys_Audit("os.chown", "OIIi", path->object, uid, gid, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS #ifdef HAVE_FCHOWN if (path->fd != -1) @@ -3422,6 +3453,10 @@ os_fchown_impl(PyObject *module, int fd, uid_t uid, gid_t gid) int res; int async_err = 0; + if (PySys_Audit("os.chown", "iIIi", fd, uid, gid, -1) < 0) { + return NULL; + } + do { Py_BEGIN_ALLOW_THREADS res = fchown(fd, uid, gid); @@ -3454,6 +3489,9 @@ os_lchown_impl(PyObject *module, path_t *path, uid_t uid, gid_t gid) /*[clinic end generated code: output=25eaf6af412fdf2f input=b1c6014d563a7161]*/ { int res; + if (PySys_Audit("os.chown", "OIIi", path->object, uid, gid, -1) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS res = lchown(path->narrow, uid, gid); Py_END_ALLOW_THREADS @@ -3647,6 +3685,12 @@ os_link_impl(PyObject *module, path_t *src, path_t *dst, int src_dir_fd, } #endif + if (PySys_Audit("os.link", "OOii", src->object, dst->object, + src_dir_fd == DEFAULT_DIR_FD ? -1 : src_dir_fd, + dst_dir_fd == DEFAULT_DIR_FD ? -1 : dst_dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS result = CreateHardLinkW(dst->wide, src->wide, NULL); @@ -4114,6 +4158,11 @@ os_mkdir_impl(PyObject *module, path_t *path, int mode, int dir_fd) { int result; + if (PySys_Audit("os.mkdir", "Oii", path->object, mode, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS result = CreateDirectoryW(path->wide, NULL); @@ -4259,6 +4308,12 @@ internal_rename(path_t *src, path_t *dst, int src_dir_fd, int dst_dir_fd, int is } #endif + if (PySys_Audit("os.rename", "OOii", src->object, dst->object, + src_dir_fd == DEFAULT_DIR_FD ? -1 : src_dir_fd, + dst_dir_fd == DEFAULT_DIR_FD ? -1 : dst_dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS result = MoveFileExW(src->wide, dst->wide, flags); @@ -4359,6 +4414,11 @@ os_rmdir_impl(PyObject *module, path_t *path, int dir_fd) { int result; + if (PySys_Audit("os.rmdir", "Oi", path->object, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS /* Windows, success=1, UNIX, success=0 */ @@ -4517,6 +4577,11 @@ os_unlink_impl(PyObject *module, path_t *path, int dir_fd) { int result; + if (PySys_Audit("os.remove", "Oi", path->object, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH #ifdef MS_WINDOWS @@ -4933,6 +4998,11 @@ os_utime_impl(PyObject *module, path_t *path, PyObject *times, PyObject *ns, } #endif + if (PySys_Audit("os.utime", "OOOi", path->object, times, ns ? ns : Py_None, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS Py_BEGIN_ALLOW_THREADS hFile = CreateFileW(path->wide, FILE_WRITE_ATTRIBUTES, 0, @@ -5234,8 +5304,7 @@ os_execv_impl(PyObject *module, path_t *path, PyObject *argv) return NULL; } - if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, - argv, Py_None) < 0) { + if (PySys_Audit("os.exec", "OOO", path->object, argv, Py_None) < 0) { free_string_array(argvlist, argc); return NULL; } @@ -5311,8 +5380,7 @@ os_execve_impl(PyObject *module, path_t *path, PyObject *argv, PyObject *env) if (envlist == NULL) goto fail_0; - if (PySys_Audit("os.exec", "OOO", path->object ? path->object : Py_None, - argv, env) < 0) { + if (PySys_Audit("os.exec", "OOO", path->object, argv, env) < 0) { goto fail_1; } @@ -5665,8 +5733,7 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a } attrp = &attr; - if (PySys_Audit("os.posix_spawn", "OOO", - path->object ? path->object : Py_None, argv, env) < 0) { + if (PySys_Audit("os.posix_spawn", "OOO", path->object, argv, env) < 0) { goto exit; } @@ -5910,8 +5977,7 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv) mode = _P_OVERLAY; #endif - if (PySys_Audit("os.spawn", "iOOO", mode, - path->object ? path->object : Py_None, argv, + if (PySys_Audit("os.spawn", "iOOO", mode, path->object, argv, Py_None) < 0) { free_string_array(argvlist, argc); return NULL; @@ -6026,8 +6092,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, mode = _P_OVERLAY; #endif - if (PySys_Audit("os.spawn", "iOOO", mode, - path->object ? path->object : Py_None, argv, env) < 0) { + if (PySys_Audit("os.spawn", "iOOO", mode, path->object, argv, env) < 0) { goto fail_2; } @@ -6182,6 +6247,9 @@ os_fork_impl(PyObject *module) PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } + if (PySys_Audit("os.fork", NULL) < 0) { + return NULL; + } PyOS_BeforeFork(); pid = fork(); if (pid == 0) { @@ -6788,6 +6856,9 @@ os_forkpty_impl(PyObject *module) PyErr_SetString(PyExc_RuntimeError, "fork not supported for subinterpreters"); return NULL; } + if (PySys_Audit("os.forkpty", NULL) < 0) { + return NULL; + } PyOS_BeforeFork(); pid = forkpty(&master_fd, NULL, NULL, NULL); if (pid == 0) { @@ -7309,14 +7380,15 @@ Kill a process with a signal. static PyObject * os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal) /*[clinic end generated code: output=8e346a6701c88568 input=61a36b86ca275ab9]*/ -#ifndef MS_WINDOWS { + if (PySys_Audit("os.kill", "in", pid, signal) < 0) { + return NULL; + } +#ifndef MS_WINDOWS if (kill(pid, (int)signal) == -1) return posix_error(); Py_RETURN_NONE; -} #else /* !MS_WINDOWS */ -{ PyObject *result; DWORD sig = (DWORD)signal; DWORD err; @@ -7351,8 +7423,8 @@ os_kill_impl(PyObject *module, pid_t pid, Py_ssize_t signal) CloseHandle(handle); return result; -} #endif /* !MS_WINDOWS */ +} #endif /* HAVE_KILL */ @@ -7371,6 +7443,9 @@ static PyObject * os_killpg_impl(PyObject *module, pid_t pgid, int signal) /*[clinic end generated code: output=6dbcd2f1fdf5fdba input=38b5449eb8faec19]*/ { + if (PySys_Audit("os.killpg", "ii", pgid, signal) < 0) { + return NULL; + } /* XXX some man pages make the `pgid` parameter an int, others a pid_t. Since getpgrp() returns a pid_t, we assume killpg should take the same type. Moreover, pid_t is always at least as wide as @@ -8143,6 +8218,11 @@ os_symlink_impl(PyObject *module, path_t *src, path_t *dst, int result; #endif + if (PySys_Audit("os.symlink", "OOi", src->object, dst->object, + dir_fd == DEFAULT_DIR_FD ? -1 : dir_fd) < 0) { + return NULL; + } + #ifdef MS_WINDOWS if (windows_has_symlink_unprivileged_flag) { @@ -8745,6 +8825,10 @@ os_lockf_impl(PyObject *module, int fd, int command, Py_off_t length) { int res; + if (PySys_Audit("os.lockf", "iiL", fd, command, length) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS res = lockf(fd, command, length); Py_END_ALLOW_THREADS @@ -10147,6 +10231,9 @@ static PyObject * os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) /*[clinic end generated code: output=d29a567d6b2327d2 input=ba586581c2e6105f]*/ { + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { + return NULL; + } return win32_putenv(name, value); } #else @@ -10172,6 +10259,10 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value) return NULL; } + if (PySys_Audit("os.putenv", "OO", name, value) < 0) { + return NULL; + } + if (setenv(name_string, value_string, 1)) { return posix_error(); } @@ -10193,6 +10284,9 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/ { + if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { + return NULL; + } return win32_putenv(name, NULL); } #else @@ -10208,6 +10302,9 @@ static PyObject * os_unsetenv_impl(PyObject *module, PyObject *name) /*[clinic end generated code: output=54c4137ab1834f02 input=2bb5288a599c7107]*/ { + if (PySys_Audit("os.unsetenv", "(O)", name) < 0) { + return NULL; + } #ifdef HAVE_BROKEN_UNSETENV unsetenv(PyBytes_AS_STRING(name)); #else @@ -11730,9 +11827,7 @@ os_startfile_impl(PyObject *module, path_t *filepath, "startfile not available on this platform"); } - if (PySys_Audit("os.startfile", "Ou", - filepath->object ? filepath->object : Py_None, - operation) < 0) { + if (PySys_Audit("os.startfile", "Ou", filepath->object, operation) < 0) { return NULL; } @@ -11910,6 +12005,10 @@ os_getxattr_impl(PyObject *module, path_t *path, path_t *attribute, if (fd_and_follow_symlinks_invalid("getxattr", path->fd, follow_symlinks)) return NULL; + if (PySys_Audit("os.getxattr", "OO", path->object, attribute->object) < 0) { + return NULL; + } + for (i = 0; ; i++) { void *ptr; ssize_t result; @@ -11981,6 +12080,11 @@ os_setxattr_impl(PyObject *module, path_t *path, path_t *attribute, if (fd_and_follow_symlinks_invalid("setxattr", path->fd, follow_symlinks)) return NULL; + if (PySys_Audit("os.setxattr", "OOy#i", path->object, attribute->object, + value->buf, value->len, flags) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS; if (path->fd > -1) result = fsetxattr(path->fd, attribute->narrow, @@ -12029,6 +12133,10 @@ os_removexattr_impl(PyObject *module, path_t *path, path_t *attribute, if (fd_and_follow_symlinks_invalid("removexattr", path->fd, follow_symlinks)) return NULL; + if (PySys_Audit("os.removexattr", "OO", path->object, attribute->object) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS; if (path->fd > -1) result = fremovexattr(path->fd, attribute->narrow); @@ -12074,6 +12182,11 @@ os_listxattr_impl(PyObject *module, path_t *path, int follow_symlinks) if (fd_and_follow_symlinks_invalid("listxattr", path->fd, follow_symlinks)) goto exit; + if (PySys_Audit("os.listxattr", "(O)", + path->object ? path->object : Py_None) < 0) { + return NULL; + } + name = path->narrow ? path->narrow : "."; for (i = 0; ; i++) { @@ -13550,6 +13663,10 @@ os__add_dll_directory_impl(PyObject *module, path_t *path) DLL_DIRECTORY_COOKIE cookie = 0; DWORD err = 0; + if (PySys_Audit("os.add_dll_directory", "(O)", path->object) < 0) { + return NULL; + } + /* For Windows 7, we have to load this. As this will be a fairly infrequent operation, just do it each time. Kernel32 is always loaded. */ diff --git a/Modules/resource.c b/Modules/resource.c index 87c72e74098..afde03c6c7e 100644 --- a/Modules/resource.c +++ b/Modules/resource.c @@ -224,6 +224,11 @@ resource_setrlimit_impl(PyObject *module, int resource, PyObject *limits) return NULL; } + if (PySys_Audit("resource.setrlimit", "iO", resource, + limits ? limits : Py_None) < 0) { + return NULL; + } + if (py2rlimit(limits, &rl) < 0) { return NULL; } @@ -269,6 +274,11 @@ resource_prlimit_impl(PyObject *module, pid_t pid, int resource, return NULL; } + if (PySys_Audit("resource.prlimit", "iiO", pid, resource, + limits ? limits : Py_None) < 0) { + return NULL; + } + if (group_right_1) { if (py2rlimit(limits, &new_limit) < 0) { return NULL; diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 693b90b6c63..a1976737462 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1236,6 +1236,10 @@ signal_pthread_kill_impl(PyObject *module, unsigned long thread_id, { int err; + if (PySys_Audit("signal.pthread_kill", "ki", thread_id, signalnum) < 0) { + return NULL; + } + err = pthread_kill((pthread_t)thread_id, signalnum); if (err != 0) { errno = err; diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 539224f2c5b..24517925c32 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -144,6 +144,10 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds) return NULL; } + if (PySys_Audit("syslog.openlog", "sll", ident, logopt, facility) < 0) { + return NULL; + } + openlog(ident, logopt, facility); S_log_open = 1; @@ -170,6 +174,10 @@ syslog_syslog(PyObject * self, PyObject * args) if (message == NULL) return NULL; + if (PySys_Audit("syslog.syslog", "is", priority, message) < 0) { + return NULL; + } + /* if log is not opened, open it now */ if (!S_log_open) { PyObject *openargs; @@ -194,6 +202,9 @@ syslog_syslog(PyObject * self, PyObject * args) static PyObject * syslog_closelog(PyObject *self, PyObject *unused) { + if (PySys_Audit("syslog.closelog", NULL) < 0) { + return NULL; + } if (S_log_open) { closelog(); Py_CLEAR(S_ident_o); @@ -209,6 +220,9 @@ syslog_setlogmask(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri)) return NULL; + if (PySys_Audit("syslog.setlogmask", "(O)", args ? args : Py_None) < 0) { + return NULL; + } omaskpri = setlogmask(maskpri); return PyLong_FromLong(omaskpri); } diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c index c4113e54c2b..5c06ec2621e 100644 --- a/PC/msvcrtmodule.c +++ b/PC/msvcrtmodule.c @@ -116,6 +116,10 @@ msvcrt_locking_impl(PyObject *module, int fd, int mode, long nbytes) { int err; + if (PySys_Audit("msvcrt.locking", "iil", fd, mode, nbytes) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS _Py_BEGIN_SUPPRESS_IPH err = _locking(fd, mode, nbytes); @@ -175,6 +179,10 @@ msvcrt_open_osfhandle_impl(PyObject *module, void *handle, int flags) { int fd; + if (PySys_Audit("msvcrt.open_osfhandle", "Ki", handle, flags) < 0) { + return NULL; + } + _Py_BEGIN_SUPPRESS_IPH fd = _open_osfhandle((intptr_t)handle, flags); _Py_END_SUPPRESS_IPH @@ -201,6 +209,10 @@ msvcrt_get_osfhandle_impl(PyObject *module, int fd) { intptr_t handle = -1; + if (PySys_Audit("msvcrt.get_osfhandle", "(i)", fd) < 0) { + return NULL; + } + _Py_BEGIN_SUPPRESS_IPH handle = _get_osfhandle(fd); _Py_END_SUPPRESS_IPH From 925dc7fb1d0db85dc137afa4cd14211bf0d67414 Mon Sep 17 00:00:00 2001 From: "Nathaniel J. Smith" Date: Thu, 13 Feb 2020 00:15:38 -0800 Subject: [PATCH 368/380] bpo-39606: allow closing async generators that are already closed (GH-18475) The fix for [bpo-39386](https://bugs.python.org/issue39386) attempted to make it so you couldn't reuse a agen.aclose() coroutine object. It accidentally also prevented you from calling aclose() at all on an async generator that was already closed or exhausted. This commit fixes it so we're only blocking the actually illegal cases, while allowing the legal cases. The new tests failed before this patch. Also confirmed that this fixes the test failures we were seeing in Trio with Python dev builds: https://github.com/python-trio/trio/pull/1396 https://bugs.python.org/issue39606 --- Lib/test/test_asyncgen.py | 30 +++++++++++++++++-- .../2020-02-11-23-59-07.bpo-39606.a72Sxc.rst | 2 ++ Objects/genobject.c | 15 +++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-11-23-59-07.bpo-39606.a72Sxc.rst diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 24b20bec2b2..fb6321d2264 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -1128,7 +1128,7 @@ class AsyncGenAsyncioTest(unittest.TestCase): self.assertEqual([], messages) - def test_async_gen_await_anext_twice(self): + def test_async_gen_await_same_anext_coro_twice(self): async def async_iterate(): yield 1 yield 2 @@ -1147,7 +1147,7 @@ class AsyncGenAsyncioTest(unittest.TestCase): self.loop.run_until_complete(run()) - def test_async_gen_await_aclose_twice(self): + def test_async_gen_await_same_aclose_coro_twice(self): async def async_iterate(): yield 1 yield 2 @@ -1164,6 +1164,32 @@ class AsyncGenAsyncioTest(unittest.TestCase): self.loop.run_until_complete(run()) + def test_async_gen_aclose_twice_with_different_coros(self): + # Regression test for https://bugs.python.org/issue39606 + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + await it.aclose() + await it.aclose() + + self.loop.run_until_complete(run()) + + def test_async_gen_aclose_after_exhaustion(self): + # Regression test for https://bugs.python.org/issue39606 + async def async_iterate(): + yield 1 + yield 2 + + async def run(): + it = async_iterate() + async for _ in it: + pass + await it.aclose() + + self.loop.run_until_complete(run()) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-11-23-59-07.bpo-39606.a72Sxc.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-11-23-59-07.bpo-39606.a72Sxc.rst new file mode 100644 index 00000000000..b7cbe4e91f5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-11-23-59-07.bpo-39606.a72Sxc.rst @@ -0,0 +1,2 @@ +Fix regression caused by fix for bpo-39386, that prevented calling +``aclose`` on an async generator that had already been closed or exhausted. diff --git a/Objects/genobject.c b/Objects/genobject.c index 576d6856c7f..0efd57de7a5 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -1797,16 +1797,22 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) PyFrameObject *f = gen->gi_frame; PyObject *retval; - if (f == NULL || f->f_stacktop == NULL || - o->agt_state == AWAITABLE_STATE_CLOSED) { + if (o->agt_state == AWAITABLE_STATE_CLOSED) { PyErr_SetString( PyExc_RuntimeError, "cannot reuse already awaited aclose()/athrow()"); return NULL; } + if (f == NULL || f->f_stacktop == NULL) { + o->agt_state = AWAITABLE_STATE_CLOSED; + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + if (o->agt_state == AWAITABLE_STATE_INIT) { if (o->agt_gen->ag_running_async) { + o->agt_state = AWAITABLE_STATE_CLOSED; if (o->agt_args == NULL) { PyErr_SetString( PyExc_RuntimeError, @@ -1878,7 +1884,6 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) /* aclose() mode */ if (retval) { if (_PyAsyncGenWrappedValue_CheckExact(retval)) { - o->agt_gen->ag_running_async = 0; Py_DECREF(retval); goto yield_close; } @@ -1893,16 +1898,17 @@ async_gen_athrow_send(PyAsyncGenAThrow *o, PyObject *arg) yield_close: o->agt_gen->ag_running_async = 0; + o->agt_state = AWAITABLE_STATE_CLOSED; PyErr_SetString( PyExc_RuntimeError, ASYNC_GEN_IGNORED_EXIT_MSG); return NULL; check_error: o->agt_gen->ag_running_async = 0; + o->agt_state = AWAITABLE_STATE_CLOSED; if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration) || PyErr_ExceptionMatches(PyExc_GeneratorExit)) { - o->agt_state = AWAITABLE_STATE_CLOSED; if (o->agt_args == NULL) { /* when aclose() is called we don't want to propagate StopAsyncIteration or GeneratorExit; just raise @@ -1936,6 +1942,7 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args) /* aclose() mode */ if (retval && _PyAsyncGenWrappedValue_CheckExact(retval)) { o->agt_gen->ag_running_async = 0; + o->agt_state = AWAITABLE_STATE_CLOSED; Py_DECREF(retval); PyErr_SetString(PyExc_RuntimeError, ASYNC_GEN_IGNORED_EXIT_MSG); return NULL; From 968dcd9e7a4d3aa9aaa1dfca693adf60d6b71ce7 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Thu, 13 Feb 2020 09:34:45 -0800 Subject: [PATCH 369/380] bpo-39573: Fix bad copy-paste in Py_SET_SIZE (GH-18496) --- Doc/c-api/structures.rst | 2 +- Include/object.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 75e2383beb2..083c3740531 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -103,7 +103,7 @@ the definition of all other Python objects. .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) - Set the object *o* size of *size*. + Set the object *o* size to *size*. .. versionadded:: 3.9 diff --git a/Include/object.h b/Include/object.h index 68200f7666f..11539ee0805 100644 --- a/Include/object.h +++ b/Include/object.h @@ -133,10 +133,10 @@ static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) -static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t refcnt) { - ob->ob_size = refcnt; +static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { + ob->ob_size = size; } -#define Py_SET_SIZE(ob, refcnt) _Py_SET_SIZE(_PyVarObject_CAST(ob), refcnt) +#define Py_SET_SIZE(ob, size) _Py_SET_SIZE(_PyVarObject_CAST(ob), size) /* From d905df766c367c350f20c46ccd99d4da19ed57d8 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 14 Feb 2020 02:37:17 +0900 Subject: [PATCH 370/380] bpo-39573: Add Py_IS_TYPE() function (GH-18488) Co-Author: Neil Schemenauer --- Doc/c-api/structures.rst | 8 ++++++++ Include/boolobject.h | 2 +- Include/bytearrayobject.h | 2 +- Include/bytesobject.h | 2 +- Include/cellobject.h | 2 +- Include/code.h | 2 +- Include/complexobject.h | 2 +- Include/context.h | 6 +++--- Include/datetime.h | 10 +++++----- Include/dictobject.h | 2 +- Include/floatobject.h | 2 +- Include/funcobject.h | 2 +- Include/genobject.h | 6 +++--- Include/internal/pycore_hamt.h | 2 +- Include/iterobject.h | 4 ++-- Include/listobject.h | 2 +- Include/memoryobject.h | 2 +- Include/methodobject.h | 2 +- Include/moduleobject.h | 2 +- Include/object.h | 9 +++++++-- Include/odictobject.h | 2 +- Include/pycapsule.h | 2 +- Include/rangeobject.h | 2 +- Include/setobject.h | 10 +++++----- Include/sliceobject.h | 2 +- Include/symtable.h | 2 +- Include/traceback.h | 2 +- Include/tupleobject.h | 2 +- Include/unicodeobject.h | 2 +- Include/weakrefobject.h | 6 +++--- .../2020-02-13-01-30-22.bpo-39573.uTFj1m.rst | 2 ++ Objects/genobject.c | 2 +- 32 files changed, 61 insertions(+), 46 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-13-01-30-22.bpo-39573.uTFj1m.rst diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 083c3740531..fc3467bee4d 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -70,6 +70,14 @@ the definition of all other Python objects. (((PyObject*)(o))->ob_type) +.. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) + + Return non-zero if the object *o* type is *type*. Return zero otherwise. + Equivalent to: ``Py_TYPE(o) == type``. + + .. versionadded:: 3.9 + + .. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type) Set the object *o* type to *type*. diff --git a/Include/boolobject.h b/Include/boolobject.h index 7cc2f1fe239..bb8044a2b02 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -9,7 +9,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyBool_Type; -#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type) +#define PyBool_Check(x) Py_IS_TYPE(x, &PyBool_Type) /* Py_False and Py_True are the only two bools in existence. Don't forget to apply Py_INCREF() when returning either!!! */ diff --git a/Include/bytearrayobject.h b/Include/bytearrayobject.h index 341ab38a15d..9e95433f0f2 100644 --- a/Include/bytearrayobject.h +++ b/Include/bytearrayobject.h @@ -24,7 +24,7 @@ PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type; /* Type check macros */ #define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type) -#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type) +#define PyByteArray_CheckExact(self) Py_IS_TYPE(self, &PyByteArray_Type) /* Direct API functions */ PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *); diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 27c31ee342c..5062d8d123a 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -32,7 +32,7 @@ PyAPI_DATA(PyTypeObject) PyBytesIter_Type; #define PyBytes_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_BYTES_SUBCLASS) -#define PyBytes_CheckExact(op) (Py_TYPE(op) == &PyBytes_Type) +#define PyBytes_CheckExact(op) Py_IS_TYPE(op, &PyBytes_Type) PyAPI_FUNC(PyObject *) PyBytes_FromStringAndSize(const char *, Py_ssize_t); PyAPI_FUNC(PyObject *) PyBytes_FromString(const char *); diff --git a/Include/cellobject.h b/Include/cellobject.h index 2f9b5b75d99..f12aa90a42a 100644 --- a/Include/cellobject.h +++ b/Include/cellobject.h @@ -13,7 +13,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCell_Type; -#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type) +#define PyCell_Check(op) Py_IS_TYPE(op, &PyCell_Type) PyAPI_FUNC(PyObject *) PyCell_New(PyObject *); PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); diff --git a/Include/code.h b/Include/code.h index 3afddd20c80..107eba4b9c4 100644 --- a/Include/code.h +++ b/Include/code.h @@ -115,7 +115,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCode_Type; -#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type) +#define PyCode_Check(op) Py_IS_TYPE(op, &PyCode_Type) #define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars)) /* Public interface */ diff --git a/Include/complexobject.h b/Include/complexobject.h index cb8c52c5800..9221f9c51d6 100644 --- a/Include/complexobject.h +++ b/Include/complexobject.h @@ -39,7 +39,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyComplex_Type; #define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type) -#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type) +#define PyComplex_CheckExact(op) Py_IS_TYPE(op, &PyComplex_Type) #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex); diff --git a/Include/context.h b/Include/context.h index 9581285247b..619746d501e 100644 --- a/Include/context.h +++ b/Include/context.h @@ -17,9 +17,9 @@ PyAPI_DATA(PyTypeObject) PyContextToken_Type; typedef struct _pycontexttokenobject PyContextToken; -#define PyContext_CheckExact(o) (Py_TYPE(o) == &PyContext_Type) -#define PyContextVar_CheckExact(o) (Py_TYPE(o) == &PyContextVar_Type) -#define PyContextToken_CheckExact(o) (Py_TYPE(o) == &PyContextToken_Type) +#define PyContext_CheckExact(o) Py_IS_TYPE(o, &PyContext_Type) +#define PyContextVar_CheckExact(o) Py_IS_TYPE(o, &PyContextVar_Type) +#define PyContextToken_CheckExact(o) Py_IS_TYPE(o, &PyContextToken_Type) PyAPI_FUNC(PyObject *) PyContext_New(void); diff --git a/Include/datetime.h b/Include/datetime.h index 00507cb85cc..5d9f2558f92 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -196,19 +196,19 @@ static PyDateTime_CAPI *PyDateTimeAPI = NULL; /* Macros for type checking when not building the Python core. */ #define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType) -#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType) +#define PyDate_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateType) #define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType) -#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType) +#define PyDateTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DateTimeType) #define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType) -#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType) +#define PyTime_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TimeType) #define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType) -#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType) +#define PyDelta_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->DeltaType) #define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType) -#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType) +#define PyTZInfo_CheckExact(op) Py_IS_TYPE(op, PyDateTimeAPI->TZInfoType) /* Macros for accessing constructors in a simplified fashion. */ diff --git a/Include/dictobject.h b/Include/dictobject.h index b37573ad48c..c88b0aa0a5d 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -16,7 +16,7 @@ PyAPI_DATA(PyTypeObject) PyDict_Type; #define PyDict_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS) -#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) +#define PyDict_CheckExact(op) Py_IS_TYPE(op, &PyDict_Type) PyAPI_FUNC(PyObject *) PyDict_New(void); PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key); diff --git a/Include/floatobject.h b/Include/floatobject.h index 0fb9fc4e0fa..917dfcc2644 100644 --- a/Include/floatobject.h +++ b/Include/floatobject.h @@ -21,7 +21,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFloat_Type; #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type) -#define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type) +#define PyFloat_CheckExact(op) Py_IS_TYPE(op, &PyFloat_Type) #ifdef Py_NAN #define Py_RETURN_NAN return PyFloat_FromDouble(Py_NAN) diff --git a/Include/funcobject.h b/Include/funcobject.h index c6dd67d6124..c5cc9d261a3 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -43,7 +43,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyFunction_Type; -#define PyFunction_Check(op) (Py_TYPE(op) == &PyFunction_Type) +#define PyFunction_Check(op) Py_IS_TYPE(op, &PyFunction_Type) PyAPI_FUNC(PyObject *) PyFunction_New(PyObject *, PyObject *); PyAPI_FUNC(PyObject *) PyFunction_NewWithQualName(PyObject *, PyObject *, PyObject *); diff --git a/Include/genobject.h b/Include/genobject.h index 5ee9a2831d1..b87a6485631 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -38,7 +38,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyGen_Type; #define PyGen_Check(op) PyObject_TypeCheck(op, &PyGen_Type) -#define PyGen_CheckExact(op) (Py_TYPE(op) == &PyGen_Type) +#define PyGen_CheckExact(op) Py_IS_TYPE(op, &PyGen_Type) PyAPI_FUNC(PyObject *) PyGen_New(struct _frame *); PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(struct _frame *, @@ -58,7 +58,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyCoro_Type; PyAPI_DATA(PyTypeObject) _PyCoroWrapper_Type; -#define PyCoro_CheckExact(op) (Py_TYPE(op) == &PyCoro_Type) +#define PyCoro_CheckExact(op) Py_IS_TYPE(op, &PyCoro_Type) PyObject *_PyCoro_GetAwaitableIter(PyObject *o); PyAPI_FUNC(PyObject *) PyCoro_New(struct _frame *, PyObject *name, PyObject *qualname); @@ -89,7 +89,7 @@ PyAPI_DATA(PyTypeObject) _PyAsyncGenAThrow_Type; PyAPI_FUNC(PyObject *) PyAsyncGen_New(struct _frame *, PyObject *name, PyObject *qualname); -#define PyAsyncGen_CheckExact(op) (Py_TYPE(op) == &PyAsyncGen_Type) +#define PyAsyncGen_CheckExact(op) Py_IS_TYPE(op, &PyAsyncGen_Type) PyObject *_PyAsyncGenValueWrapperNew(PyObject *); diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index e65aef5e21a..aaf65590955 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -8,7 +8,7 @@ #define _Py_HAMT_MAX_TREE_DEPTH 7 -#define PyHamt_Check(o) (Py_TYPE(o) == &_PyHamt_Type) +#define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) /* Abstract tree node. */ diff --git a/Include/iterobject.h b/Include/iterobject.h index eec2ee271eb..51139bf1874 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -8,12 +8,12 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; -#define PySeqIter_Check(op) (Py_TYPE(op) == &PySeqIter_Type) +#define PySeqIter_Check(op) Py_IS_TYPE(op, &PySeqIter_Type) PyAPI_FUNC(PyObject *) PySeqIter_New(PyObject *); -#define PyCallIter_Check(op) (Py_TYPE(op) == &PyCallIter_Type) +#define PyCallIter_Check(op) Py_IS_TYPE(op, &PyCallIter_Type) PyAPI_FUNC(PyObject *) PyCallIter_New(PyObject *, PyObject *); diff --git a/Include/listobject.h b/Include/listobject.h index 34dfcf92ec9..2a8a25525d1 100644 --- a/Include/listobject.h +++ b/Include/listobject.h @@ -23,7 +23,7 @@ PyAPI_DATA(PyTypeObject) PyListRevIter_Type; #define PyList_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_LIST_SUBCLASS) -#define PyList_CheckExact(op) (Py_TYPE(op) == &PyList_Type) +#define PyList_CheckExact(op) Py_IS_TYPE(op, &PyList_Type) PyAPI_FUNC(PyObject *) PyList_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyList_Size(PyObject *); diff --git a/Include/memoryobject.h b/Include/memoryobject.h index 990a716f220..306028f4b22 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -11,7 +11,7 @@ PyAPI_DATA(PyTypeObject) _PyManagedBuffer_Type; #endif PyAPI_DATA(PyTypeObject) PyMemoryView_Type; -#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) +#define PyMemoryView_Check(op) Py_IS_TYPE(op, &PyMemoryView_Type) #ifndef Py_LIMITED_API /* Get a pointer to the memoryview's private copy of the exporter's buffer. */ diff --git a/Include/methodobject.h b/Include/methodobject.h index d9f8d4f80c2..adb2d9e884f 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -13,7 +13,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyCFunction_Type; -#define PyCFunction_Check(op) (Py_TYPE(op) == &PyCFunction_Type) +#define PyCFunction_Check(op) Py_IS_TYPE(op, &PyCFunction_Type) typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); typedef PyObject *(*_PyCFunctionFast) (PyObject *, PyObject *const *, Py_ssize_t); diff --git a/Include/moduleobject.h b/Include/moduleobject.h index e246fd2faf9..cf9ad40c0a1 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -10,7 +10,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyModule_Type; #define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type) -#define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type) +#define PyModule_CheckExact(op) Py_IS_TYPE(op, &PyModule_Type) #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject *) PyModule_NewObject( diff --git a/Include/object.h b/Include/object.h index 11539ee0805..3d0da52c2b6 100644 --- a/Include/object.h +++ b/Include/object.h @@ -123,6 +123,11 @@ typedef struct { #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) +static inline int _Py_IS_TYPE(PyObject *ob, PyTypeObject *type) { + return ob->ob_type == type; +} +#define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST(ob), type) + static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { ob->ob_refcnt = refcnt; } @@ -211,7 +216,7 @@ PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); /* Generic type check */ PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); #define PyObject_TypeCheck(ob, tp) \ - (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ @@ -623,7 +628,7 @@ static inline int _PyType_Check(PyObject *op) { #define PyType_Check(op) _PyType_Check(_PyObject_CAST(op)) static inline int _PyType_CheckExact(PyObject *op) { - return (Py_TYPE(op) == &PyType_Type); + return Py_IS_TYPE(op, &PyType_Type); } #define PyType_CheckExact(op) _PyType_CheckExact(_PyObject_CAST(op)) diff --git a/Include/odictobject.h b/Include/odictobject.h index 35aff8a29a6..e070413017d 100644 --- a/Include/odictobject.h +++ b/Include/odictobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyODictItems_Type; PyAPI_DATA(PyTypeObject) PyODictValues_Type; #define PyODict_Check(op) PyObject_TypeCheck(op, &PyODict_Type) -#define PyODict_CheckExact(op) (Py_TYPE(op) == &PyODict_Type) +#define PyODict_CheckExact(op) Py_IS_TYPE(op, &PyODict_Type) #define PyODict_SIZE(op) PyDict_GET_SIZE((op)) PyAPI_FUNC(PyObject *) PyODict_New(void); diff --git a/Include/pycapsule.h b/Include/pycapsule.h index d9ecda7a4b6..fb5d503fea7 100644 --- a/Include/pycapsule.h +++ b/Include/pycapsule.h @@ -22,7 +22,7 @@ PyAPI_DATA(PyTypeObject) PyCapsule_Type; typedef void (*PyCapsule_Destructor)(PyObject *); -#define PyCapsule_CheckExact(op) (Py_TYPE(op) == &PyCapsule_Type) +#define PyCapsule_CheckExact(op) Py_IS_TYPE(op, &PyCapsule_Type) PyAPI_FUNC(PyObject *) PyCapsule_New( diff --git a/Include/rangeobject.h b/Include/rangeobject.h index 7e4dc28894b..d6af8473f9e 100644 --- a/Include/rangeobject.h +++ b/Include/rangeobject.h @@ -19,7 +19,7 @@ PyAPI_DATA(PyTypeObject) PyRange_Type; PyAPI_DATA(PyTypeObject) PyRangeIter_Type; PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; -#define PyRange_Check(op) (Py_TYPE(op) == &PyRange_Type) +#define PyRange_Check(op) Py_IS_TYPE(op, &PyRange_Type) #ifdef __cplusplus } diff --git a/Include/setobject.h b/Include/setobject.h index fc0ea83925f..05a097eba7f 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -88,18 +88,18 @@ PyAPI_FUNC(int) PySet_Discard(PyObject *set, PyObject *key); PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); -#define PyFrozenSet_CheckExact(ob) (Py_TYPE(ob) == &PyFrozenSet_Type) +#define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) #define PyAnySet_CheckExact(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type) + (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || Py_TYPE(ob) == &PyFrozenSet_Type || \ + (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_Check(ob) \ - (Py_TYPE(ob) == &PySet_Type || \ + (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) #define PyFrozenSet_Check(ob) \ - (Py_TYPE(ob) == &PyFrozenSet_Type || \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus diff --git a/Include/sliceobject.h b/Include/sliceobject.h index aae6f3cc794..2c889508b4b 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -28,7 +28,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PySlice_Type; PyAPI_DATA(PyTypeObject) PyEllipsis_Type; -#define PySlice_Check(op) (Py_TYPE(op) == &PySlice_Type) +#define PySlice_Check(op) Py_IS_TYPE(op, &PySlice_Type) PyAPI_FUNC(PyObject *) PySlice_New(PyObject* start, PyObject* stop, PyObject* step); diff --git a/Include/symtable.h b/Include/symtable.h index 5dcfa7e2c2b..abd19a7923e 100644 --- a/Include/symtable.h +++ b/Include/symtable.h @@ -69,7 +69,7 @@ typedef struct _symtable_entry { PyAPI_DATA(PyTypeObject) PySTEntry_Type; -#define PySTEntry_Check(op) (Py_TYPE(op) == &PySTEntry_Type) +#define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type) PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); diff --git a/Include/traceback.h b/Include/traceback.h index b451927fafa..0efbae8a76a 100644 --- a/Include/traceback.h +++ b/Include/traceback.h @@ -13,7 +13,7 @@ PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; -#define PyTraceBack_Check(v) (Py_TYPE(v) == &PyTraceBack_Type) +#define PyTraceBack_Check(v) Py_IS_TYPE(v, &PyTraceBack_Type) #ifndef Py_LIMITED_API diff --git a/Include/tupleobject.h b/Include/tupleobject.h index 590902de9d0..d3504b0501f 100644 --- a/Include/tupleobject.h +++ b/Include/tupleobject.h @@ -25,7 +25,7 @@ PyAPI_DATA(PyTypeObject) PyTupleIter_Type; #define PyTuple_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS) -#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type) +#define PyTuple_CheckExact(op) Py_IS_TYPE(op, &PyTuple_Type) PyAPI_FUNC(PyObject *) PyTuple_New(Py_ssize_t size); PyAPI_FUNC(Py_ssize_t) PyTuple_Size(PyObject *); diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 4dea4942181..500ce242e9f 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -113,7 +113,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type; #define PyUnicode_Check(op) \ PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS) -#define PyUnicode_CheckExact(op) (Py_TYPE(op) == &PyUnicode_Type) +#define PyUnicode_CheckExact(op) Py_IS_TYPE(op, &PyUnicode_Type) /* --- Constants ---------------------------------------------------------- */ diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h index 17051568f3a..ac4b4821c8a 100644 --- a/Include/weakrefobject.h +++ b/Include/weakrefobject.h @@ -46,10 +46,10 @@ PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType; #define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType) #define PyWeakref_CheckRefExact(op) \ - (Py_TYPE(op) == &_PyWeakref_RefType) + Py_IS_TYPE(op, &_PyWeakref_RefType) #define PyWeakref_CheckProxy(op) \ - ((Py_TYPE(op) == &_PyWeakref_ProxyType) || \ - (Py_TYPE(op) == &_PyWeakref_CallableProxyType)) + (Py_IS_TYPE(op, &_PyWeakref_ProxyType) || \ + Py_IS_TYPE(op, &_PyWeakref_CallableProxyType)) #define PyWeakref_Check(op) \ (PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op)) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-13-01-30-22.bpo-39573.uTFj1m.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-13-01-30-22.bpo-39573.uTFj1m.rst new file mode 100644 index 00000000000..56e7e1ba324 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-13-01-30-22.bpo-39573.uTFj1m.rst @@ -0,0 +1,2 @@ +Add :c:func:`Py_IS_TYPE` static inline function to check +whether the object *o* type is *type*. diff --git a/Objects/genobject.c b/Objects/genobject.c index 0efd57de7a5..0837698fd78 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -255,7 +255,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) if (PyCoro_CheckExact(gen)) { msg = "coroutine raised StopIteration"; } - else if PyAsyncGen_CheckExact(gen) { + else if (PyAsyncGen_CheckExact(gen)) { msg = "async generator raised StopIteration"; } _PyErr_FormatFromCause(PyExc_RuntimeError, "%s", msg); From fbeba8f2481411d608a616366394e07cdc52e0bb Mon Sep 17 00:00:00 2001 From: mpheath <58158242+mpheath@users.noreply.github.com> Date: Fri, 14 Feb 2020 04:32:09 +1000 Subject: [PATCH 371/380] bpo-39524: Fixed doc-string in ast._pad_whitespace (GH-18340) --- Lib/ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/ast.py b/Lib/ast.py index 495c0d618f1..511f0956a00 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -302,7 +302,7 @@ def _splitlines_no_ff(source): def _pad_whitespace(source): - """Replace all chars except '\f\t' in a line with spaces.""" + r"""Replace all chars except '\f\t' in a line with spaces.""" result = '' for c in source: if c in '\f\t': From 10e87e5ef4c1b4fb8415d9ddc362e2591f2f0b6c Mon Sep 17 00:00:00 2001 From: Vlad Emelianov Date: Thu, 13 Feb 2020 20:53:29 +0100 Subject: [PATCH 372/380] bpo-39627: Fix TypedDict totality check for inherited keys (#18503) (Adapted from https://github.com/python/typing/pull/700) --- Lib/test/test_typing.py | 32 ++++++++++++++++++ Lib/typing.py | 33 +++++++++++-------- .../2020-02-13-18-14-15.bpo-39627.Q0scyQ.rst | 1 + 3 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-13-18-14-15.bpo-39627.Q0scyQ.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index bc6a3db4e00..6b0a905048c 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3809,6 +3809,38 @@ class TypedDictTests(BaseTestCase): assert Point2Dor3D.__required_keys__ == frozenset(['x', 'y']) assert Point2Dor3D.__optional_keys__ == frozenset(['z']) + def test_keys_inheritance(self): + class BaseAnimal(TypedDict): + name: str + + class Animal(BaseAnimal, total=False): + voice: str + tail: bool + + class Cat(Animal): + fur_color: str + + assert BaseAnimal.__required_keys__ == frozenset(['name']) + assert BaseAnimal.__optional_keys__ == frozenset([]) + assert BaseAnimal.__annotations__ == {'name': str} + + assert Animal.__required_keys__ == frozenset(['name']) + assert Animal.__optional_keys__ == frozenset(['tail', 'voice']) + assert Animal.__annotations__ == { + 'name': str, + 'tail': bool, + 'voice': str, + } + + assert Cat.__required_keys__ == frozenset(['name', 'fur_color']) + assert Cat.__optional_keys__ == frozenset(['tail', 'voice']) + assert Cat.__annotations__ == { + 'fur_color': str, + 'name': str, + 'tail': bool, + 'voice': str, + } + class IOTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 8886b08c2ec..6da145fcdb8 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1828,23 +1828,30 @@ class _TypedDictMeta(type): ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) - anns = ns.get('__annotations__', {}) + annotations = {} + own_annotations = ns.get('__annotations__', {}) + own_annotation_keys = set(own_annotations.keys()) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" - anns = {n: _type_check(tp, msg) for n, tp in anns.items()} - required = set(anns if total else ()) - optional = set(() if total else anns) + own_annotations = { + n: _type_check(tp, msg) for n, tp in own_annotations.items() + } + required_keys = set() + optional_keys = set() for base in bases: - base_anns = base.__dict__.get('__annotations__', {}) - anns.update(base_anns) - if getattr(base, '__total__', True): - required.update(base_anns) - else: - optional.update(base_anns) + annotations.update(base.__dict__.get('__annotations__', {})) + required_keys.update(base.__dict__.get('__required_keys__', ())) + optional_keys.update(base.__dict__.get('__optional_keys__', ())) - tp_dict.__annotations__ = anns - tp_dict.__required_keys__ = frozenset(required) - tp_dict.__optional_keys__ = frozenset(optional) + annotations.update(own_annotations) + if total: + required_keys.update(own_annotation_keys) + else: + optional_keys.update(own_annotation_keys) + + tp_dict.__annotations__ = annotations + tp_dict.__required_keys__ = frozenset(required_keys) + tp_dict.__optional_keys__ = frozenset(optional_keys) if not hasattr(tp_dict, '__total__'): tp_dict.__total__ = total return tp_dict diff --git a/Misc/NEWS.d/next/Library/2020-02-13-18-14-15.bpo-39627.Q0scyQ.rst b/Misc/NEWS.d/next/Library/2020-02-13-18-14-15.bpo-39627.Q0scyQ.rst new file mode 100644 index 00000000000..4806aa67d95 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-13-18-14-15.bpo-39627.Q0scyQ.rst @@ -0,0 +1 @@ +Fixed TypedDict totality check for inherited keys. \ No newline at end of file From f632736023502816f2e6bd714d1b48c81aa2ccc1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 14 Feb 2020 01:57:35 +0200 Subject: [PATCH 373/380] bpo-39545: Document changes in the support of await in f-strings. (GH-18456) https://bugs.python.org/issue39545 --- Doc/reference/lexical_analysis.rst | 5 +++++ Doc/whatsnew/3.7.rst | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index c0e13b53698..3d4b03e6bd4 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -685,6 +685,11 @@ strings), but they cannot contain comments. Each expression is evaluated in the context where the formatted string literal appears, in order from left to right. +.. versionchanged:: 3.7 + Prior to Python 3.7, an :keyword:`await` expression and comprehensions + containing an :keyword:`async for` clause were illegal in the expressions + in formatted string literals due to a problem with the implementation. + If a conversion is specified, the result of evaluating the expression is converted before formatting. Conversion ``'!s'`` calls :func:`str` on the result, ``'!r'`` calls :func:`repr`, and ``'!a'`` calls :func:`ascii`. diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 04cfa57e144..59b96621bdd 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -493,6 +493,11 @@ description. Other Language Changes ====================== +* An :keyword:`await` expression and comprehensions containing an + :keyword:`async for` clause were illegal in the expressions in + :ref:`formatted string literals ` due to a problem with the + implementation. In Python 3.7 this restriction was lifted. + * More than 255 arguments can now be passed to a function, and a function can now have more than 255 parameters. (Contributed by Serhiy Storchaka in :issue:`12844` and :issue:`18896`.) From a9edf44a2de9b23a1690b36cdfeed7b41ab763bd Mon Sep 17 00:00:00 2001 From: Ian Norton Date: Fri, 14 Feb 2020 03:09:11 +0000 Subject: [PATCH 374/380] closes bpo-39619 Fix os.chroot on HP-UX 11.31 (GH-18495) Setting `-D_XOPEN_SOURCE=700` on HP-UX causes system functions such as chroot to be undefined. This change stops `_XOPEN_SOURCE` begin set on HP-UX Co-authored-by: Benjamin Peterson --- ...3-07-35-00.bpo-39619.inb_master_chroot.rst | 1 + configure | 20 ++++++++++++++++++- configure.ac | 6 ++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-13-07-35-00.bpo-39619.inb_master_chroot.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-13-07-35-00.bpo-39619.inb_master_chroot.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-13-07-35-00.bpo-39619.inb_master_chroot.rst new file mode 100644 index 00000000000..18f32f7e804 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-13-07-35-00.bpo-39619.inb_master_chroot.rst @@ -0,0 +1 @@ +Enable use of :func:`os.chroot` on HP-UX systems. diff --git a/configure b/configure index 595c129814d..846116e1128 100755 --- a/configure +++ b/configure @@ -782,6 +782,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -895,6 +896,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1147,6 +1149,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1284,7 +1295,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1437,6 +1448,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -3427,6 +3439,12 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h define_xopen_source=no ;; + # On HP-UX, defining _XOPEN_SOURCE to 600 or greater hides + # chroot() and other functions + hp*|HP*) + define_xopen_source=no + ;; + esac if test $define_xopen_source = yes diff --git a/configure.ac b/configure.ac index fee605eec2a..840caf352d1 100644 --- a/configure.ac +++ b/configure.ac @@ -533,6 +533,12 @@ case $ac_sys_system/$ac_sys_release in define_xopen_source=no ;; + # On HP-UX, defining _XOPEN_SOURCE to 600 or greater hides + # chroot() and other functions + hp*|HP*) + define_xopen_source=no + ;; + esac if test $define_xopen_source = yes From 7386a70746cf9aaf2d95db75d9201fb124f085df Mon Sep 17 00:00:00 2001 From: Andy Lester Date: Thu, 13 Feb 2020 22:42:56 -0600 Subject: [PATCH 375/380] closes bpo-39630: Update pointers to string literals to be const char *. (GH-18510) --- Objects/frameobject.c | 2 +- Objects/genobject.c | 4 ++-- Python/codecs.c | 2 +- Python/errors.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 4469e3c20cd..64f5754fe20 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -475,7 +475,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore if (new_stack.depth > current_stack.depth || top_block(&new_stack)->start_line != current_block_at_new_depth->start_line) { unsigned char target_kind = top_block(&new_stack)->kind; - char *msg; + const char *msg; if (target_kind == POP_EXCEPT) { msg = "can't jump into an 'except' block as there's no exception"; } diff --git a/Objects/genobject.c b/Objects/genobject.c index 0837698fd78..ef892bb0366 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -12,10 +12,10 @@ static PyObject *gen_close(PyGenObject *, PyObject *); static PyObject *async_gen_asend_new(PyAsyncGenObject *, PyObject *); static PyObject *async_gen_athrow_new(PyAsyncGenObject *, PyObject *); -static char *NON_INIT_CORO_MSG = "can't send non-None value to a " +static const char *NON_INIT_CORO_MSG = "can't send non-None value to a " "just-started coroutine"; -static char *ASYNC_GEN_IGNORED_EXIT_MSG = +static const char *ASYNC_GEN_IGNORED_EXIT_MSG = "async generator ignored GeneratorExit"; static inline int diff --git a/Python/codecs.c b/Python/codecs.c index ce86cb20ccc..e5bcdb09fc5 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -1407,7 +1407,7 @@ static PyObject *surrogateescape_errors(PyObject *self, PyObject *exc) static int _PyCodecRegistry_Init(void) { static struct { - char *name; + const char *name; PyMethodDef def; } methods[] = { diff --git a/Python/errors.c b/Python/errors.c index f11b66e7958..61dc597916d 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -614,7 +614,7 @@ PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, P #ifndef MS_WINDOWS if (i != 0) { - char *s = strerror(i); + const char *s = strerror(i); message = PyUnicode_DecodeLocale(s, "surrogateescape"); } else { From d212c3c55d414203b0579e000d9f340f8cd11be7 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 14 Feb 2020 16:48:12 +0900 Subject: [PATCH 376/380] bpo-39573: PyXXX_Check() macros use Py_IS_TYPE() (GH-18508) Update PyXXX_Check() macros in Include/ to use the new Py_IS_TYPE function. --- Include/classobject.h | 4 ++-- Include/picklebufobject.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/classobject.h b/Include/classobject.h index 87427207205..1952f673b7d 100644 --- a/Include/classobject.h +++ b/Include/classobject.h @@ -19,7 +19,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyMethod_Type; -#define PyMethod_Check(op) (Py_TYPE(op)== &PyMethod_Type) +#define PyMethod_Check(op) Py_IS_TYPE(op, &PyMethod_Type) PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *); @@ -40,7 +40,7 @@ typedef struct { PyAPI_DATA(PyTypeObject) PyInstanceMethod_Type; -#define PyInstanceMethod_Check(op) (Py_TYPE(op) == &PyInstanceMethod_Type) +#define PyInstanceMethod_Check(op) Py_IS_TYPE(op, &PyInstanceMethod_Type) PyAPI_FUNC(PyObject *) PyInstanceMethod_New(PyObject *); PyAPI_FUNC(PyObject *) PyInstanceMethod_Function(PyObject *); diff --git a/Include/picklebufobject.h b/Include/picklebufobject.h index f07e900bf26..0df2561dcea 100644 --- a/Include/picklebufobject.h +++ b/Include/picklebufobject.h @@ -12,7 +12,7 @@ extern "C" { PyAPI_DATA(PyTypeObject) PyPickleBuffer_Type; -#define PyPickleBuffer_Check(op) (Py_TYPE(op) == &PyPickleBuffer_Type) +#define PyPickleBuffer_Check(op) Py_IS_TYPE(op, &PyPickleBuffer_Type) /* Create a PickleBuffer redirecting to the given buffer-enabled object */ PyAPI_FUNC(PyObject *) PyPickleBuffer_FromObject(PyObject *); From 9aeb0ef9309384099e2f23bcee2240fbc096568e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 14 Feb 2020 16:50:19 +0900 Subject: [PATCH 377/380] bpo-39573: Update clinic to use Py_IS_TYPE() function (GH-18507) --- .../2020-02-14-10-08-53.bpo-39573.BIIX2M.rst | 1 + Modules/_io/clinic/bufferedio.c.h | 4 ++-- Modules/clinic/_bz2module.c.h | 8 ++++---- Objects/clinic/listobject.c.h | 4 ++-- Tools/clinic/clinic.py | 13 +++++-------- 5 files changed, 14 insertions(+), 16 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-14-10-08-53.bpo-39573.BIIX2M.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-14-10-08-53.bpo-39573.BIIX2M.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-14-10-08-53.bpo-39573.BIIX2M.rst new file mode 100644 index 00000000000..23396d3bd2b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-14-10-08-53.bpo-39573.BIIX2M.rst @@ -0,0 +1 @@ +Update clinic tool to use :c:func:`Py_IS_TYPE`. Patch by Dong-hee Na. diff --git a/Modules/_io/clinic/bufferedio.c.h b/Modules/_io/clinic/bufferedio.c.h index 72841fcb677..56d6332a250 100644 --- a/Modules/_io/clinic/bufferedio.c.h +++ b/Modules/_io/clinic/bufferedio.c.h @@ -578,7 +578,7 @@ _io_BufferedRWPair___init__(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *writer; Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE; - if ((Py_TYPE(self) == &PyBufferedRWPair_Type) && + if (Py_IS_TYPE(self, &PyBufferedRWPair_Type) && !_PyArg_NoKeywords("BufferedRWPair", kwargs)) { goto exit; } @@ -672,4 +672,4 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=7246104f6c7d3167 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7d9ad40c95bdd808 input=a9049054013a1b77]*/ diff --git a/Modules/clinic/_bz2module.c.h b/Modules/clinic/_bz2module.c.h index ac826bd9b59..0eb6280d6e0 100644 --- a/Modules/clinic/_bz2module.c.h +++ b/Modules/clinic/_bz2module.c.h @@ -85,7 +85,7 @@ _bz2_BZ2Compressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; int compresslevel = 9; - if ((Py_TYPE(self) == &BZ2Compressor_Type) && + if (Py_IS_TYPE(self, &BZ2Compressor_Type) && !_PyArg_NoKeywords("BZ2Compressor", kwargs)) { goto exit; } @@ -207,11 +207,11 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) { int return_value = -1; - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoPositional("BZ2Decompressor", args)) { goto exit; } - if ((Py_TYPE(self) == &BZ2Decompressor_Type) && + if (Py_IS_TYPE(self, &BZ2Decompressor_Type) && !_PyArg_NoKeywords("BZ2Decompressor", kwargs)) { goto exit; } @@ -220,4 +220,4 @@ _bz2_BZ2Decompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs) exit: return return_value; } -/*[clinic end generated code: output=ec3d1b3652c98823 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=3f3f1e788fe28ee1 input=a9049054013a1b77]*/ diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h index 57f0a48eb08..ed137c95a8e 100644 --- a/Objects/clinic/listobject.c.h +++ b/Objects/clinic/listobject.c.h @@ -314,7 +314,7 @@ list___init__(PyObject *self, PyObject *args, PyObject *kwargs) int return_value = -1; PyObject *iterable = NULL; - if ((Py_TYPE(self) == &PyList_Type) && + if (Py_IS_TYPE(self, &PyList_Type) && !_PyArg_NoKeywords("list", kwargs)) { goto exit; } @@ -367,4 +367,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored)) { return list___reversed___impl(self); } -/*[clinic end generated code: output=73718c0c33798c62 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1ff61490c091d165 input=a9049054013a1b77]*/ diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index b503932e262..382e29a28ab 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -3585,17 +3585,14 @@ class self_converter(CConverter): cls = self.function.cls if ((kind in (METHOD_NEW, METHOD_INIT)) and cls and cls.typedef): + type_object = self.function.cls.type_object if kind == METHOD_NEW: - passed_in_type = self.name + type_check = '({} == {})'.format(self.name, type_object) else: - passed_in_type = 'Py_TYPE({})'.format(self.name) + type_check = 'Py_IS_TYPE({}, {})'.format(self.name, type_object) - line = '({passed_in_type} == {type_object}) &&\n ' - d = { - 'type_object': self.function.cls.type_object, - 'passed_in_type': passed_in_type - } - template_dict['self_type_check'] = line.format_map(d) + line = '{} &&\n '.format(type_check) + template_dict['self_type_check'] = line From 1ed61617a4a6632905ad6a0b440cd2cafb8b6414 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 14 Feb 2020 22:02:13 +0000 Subject: [PATCH 378/380] bpo-12915: Add pkgutil.resolve_name (GH-18310) --- Doc/library/pkgutil.rst | 41 +++++++++++ Lib/pkgutil.py | 69 +++++++++++++++++++ Lib/test/test_pkgutil.py | 55 +++++++++++++++ .../2020-02-02-10-08-25.bpo-12915.d6r50-.rst | 4 ++ 4 files changed, 169 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2020-02-02-10-08-25.bpo-12915.d6r50-.rst diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 78a51573458..2066cbb9fc5 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -227,3 +227,44 @@ support. then ``None`` is returned. In particular, the :term:`loader` for :term:`namespace packages ` does not support :meth:`get_data `. + + +.. function:: resolve_name(name) + + Resolve a name to an object. + + This functionality is used in numerous places in the standard library (see + :issue:`12915`) - and equivalent functionality is also in widely used + third-party packages such as setuptools, Django and Pyramid. + + It is expected that *name* will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + * ``W(.W)*`` + * ``W(.W)*:(W(.W)*)?`` + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + :exc:`ValueError` -- if *name* isn't in a recognised format. + + :exc:`ImportError` -- if an import failed when it shouldn't have. + + :exc:`AttributeError` -- If a failure occurred when traversing the object + hierarchy within the imported package to get to the desired object. + + .. versionadded:: 3.9 diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index 8474a773e7c..4bc3083ac19 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -7,6 +7,7 @@ import importlib.util import importlib.machinery import os import os.path +import re import sys from types import ModuleType import warnings @@ -635,3 +636,71 @@ def get_data(package, resource): parts.insert(0, os.path.dirname(mod.__file__)) resource_name = os.path.join(*parts) return loader.get_data(resource_name) + + +_DOTTED_WORDS = r'[a-z_]\w*(\.[a-z_]\w*)*' +_NAME_PATTERN = re.compile(f'^({_DOTTED_WORDS})(:({_DOTTED_WORDS})?)?$', re.I) +del _DOTTED_WORDS + +def resolve_name(name): + """ + Resolve a name to an object. + + It is expected that `name` will be a string in one of the following + formats, where W is shorthand for a valid Python identifier and dot stands + for a literal period in these pseudo-regexes: + + W(.W)* + W(.W)*:(W(.W)*)? + + The first form is intended for backward compatibility only. It assumes that + some part of the dotted name is a package, and the rest is an object + somewhere within that package, possibly nested inside other objects. + Because the place where the package stops and the object hierarchy starts + can't be inferred by inspection, repeated attempts to import must be done + with this form. + + In the second form, the caller makes the division point clear through the + provision of a single colon: the dotted name to the left of the colon is a + package to be imported, and the dotted name to the right is the object + hierarchy within that package. Only one import is needed in this form. If + it ends with the colon, then a module object is returned. + + The function will return an object (which might be a module), or raise one + of the following exceptions: + + ValueError - if `name` isn't in a recognised format + ImportError - if an import failed when it shouldn't have + AttributeError - if a failure occurred when traversing the object hierarchy + within the imported package to get to the desired object) + """ + m = _NAME_PATTERN.match(name) + if not m: + raise ValueError(f'invalid format: {name!r}') + groups = m.groups() + if groups[2]: + # there is a colon - a one-step import is all that's needed + mod = importlib.import_module(groups[0]) + parts = groups[3].split('.') if groups[3] else [] + else: + # no colon - have to iterate to find the package boundary + parts = name.split('.') + modname = parts.pop(0) + # first part *must* be a module/package. + mod = importlib.import_module(modname) + while parts: + p = parts[0] + s = f'{modname}.{p}' + try: + mod = importlib.import_module(s) + parts.pop(0) + modname = s + except ImportError: + break + # if we reach this point, mod is the module, already imported, and + # parts is the list of parts in the object hierarchy to be traversed, or + # an empty list if just the module is wanted. + result = mod + for p in parts: + result = getattr(result, p) + return result diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py index 2887ce6cc05..906150b1049 100644 --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -186,6 +186,61 @@ class PkgutilTests(unittest.TestCase): with self.assertRaises((TypeError, ValueError)): list(pkgutil.walk_packages(bytes_input)) + def test_name_resolution(self): + import logging + import logging.handlers + + success_cases = ( + ('os', os), + ('os.path', os.path), + ('os.path:pathsep', os.path.pathsep), + ('logging', logging), + ('logging:', logging), + ('logging.handlers', logging.handlers), + ('logging.handlers:', logging.handlers), + ('logging.handlers:SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers.SysLogHandler', logging.handlers.SysLogHandler), + ('logging.handlers:SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('logging.handlers.SysLogHandler.LOG_ALERT', + logging.handlers.SysLogHandler.LOG_ALERT), + ('builtins.int', int), + ('builtins:int', int), + ('builtins.int.from_bytes', int.from_bytes), + ('builtins:int.from_bytes', int.from_bytes), + ('builtins.ZeroDivisionError', ZeroDivisionError), + ('builtins:ZeroDivisionError', ZeroDivisionError), + ('os:path', os.path), + ) + + failure_cases = ( + (None, TypeError), + (1, TypeError), + (2.0, TypeError), + (True, TypeError), + ('', ValueError), + ('?abc', ValueError), + ('abc/foo', ValueError), + ('foo', ImportError), + ('os.foo', AttributeError), + ('os.foo:', ImportError), + ('os.pth:pathsep', ImportError), + ('logging.handlers:NoSuchHandler', AttributeError), + ('logging.handlers:SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('logging.handlers.SysLogHandler.NO_SUCH_VALUE', AttributeError), + ('ZeroDivisionError', ImportError), + ) + + for s, expected in success_cases: + with self.subTest(s=s): + o = pkgutil.resolve_name(s) + self.assertEqual(o, expected) + + for s, exc in failure_cases: + with self.subTest(s=s): + with self.assertRaises(exc): + pkgutil.resolve_name(s) + class PkgutilPEP302Tests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2020-02-02-10-08-25.bpo-12915.d6r50-.rst b/Misc/NEWS.d/next/Library/2020-02-02-10-08-25.bpo-12915.d6r50-.rst new file mode 100644 index 00000000000..90ee0bcac79 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-02-10-08-25.bpo-12915.d6r50-.rst @@ -0,0 +1,4 @@ +A new function ``resolve_name`` has been added to the ``pkgutil`` module. +This resolves a string of the form ``'a.b.c.d'`` or ``'a.b:c.d'`` to an +object. In the example, ``a.b`` is a package/module and ``c.d`` is an object +within that package/module reached via recursive attribute access. From a5cbab552d294d99fde864306632d7e511a75d3c Mon Sep 17 00:00:00 2001 From: Thomas Moreau Date: Sun, 16 Feb 2020 19:09:26 +0100 Subject: [PATCH 379/380] bpo-39104: Fix hanging ProcessPoolExecutor on shutdown nowait with pickling failure (GH-17670) As reported initially by @rad-pat in #6084, the following script causes a deadlock. ``` from concurrent.futures import ProcessPoolExecutor class ObjectWithPickleError(): """Triggers a RuntimeError when sending job to the workers""" def __reduce__(self): raise RuntimeError() if __name__ == "__main__": e = ProcessPoolExecutor() f = e.submit(id, ObjectWithPickleError()) e.shutdown(wait=False) f.result() # Deadlock on get ``` This is caused by the fact that the main process is closing communication channels that might be necessary to the `queue_management_thread` later. To avoid this, this PR let the `queue_management_thread` manage all the closing. https://bugs.python.org/issue39104 Automerge-Triggered-By: @pitrou --- Lib/concurrent/futures/process.py | 59 ++++++++------- Lib/test/test_concurrent_futures.py | 74 ++++++++++++++++++- .../2020-02-16-18-49-16.bpo-39104.cI5MJY.rst | 2 + 3 files changed, 106 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-02-16-18-49-16.bpo-39104.cI5MJY.rst diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index fd9f572b6c7..d77322831a6 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -80,18 +80,23 @@ _global_shutdown = False class _ThreadWakeup: def __init__(self): + self._closed = False self._reader, self._writer = mp.Pipe(duplex=False) def close(self): - self._writer.close() - self._reader.close() + if not self._closed: + self._closed = True + self._writer.close() + self._reader.close() def wakeup(self): - self._writer.send_bytes(b"") + if not self._closed: + self._writer.send_bytes(b"") def clear(self): - while self._reader.poll(): - self._reader.recv_bytes() + if not self._closed: + while self._reader.poll(): + self._reader.recv_bytes() def _python_exit(): @@ -160,8 +165,9 @@ class _CallItem(object): class _SafeQueue(Queue): """Safe Queue set exception to the future object linked to a job""" - def __init__(self, max_size=0, *, ctx, pending_work_items): + def __init__(self, max_size=0, *, ctx, pending_work_items, thread_wakeup): self.pending_work_items = pending_work_items + self.thread_wakeup = thread_wakeup super().__init__(max_size, ctx=ctx) def _on_queue_feeder_error(self, e, obj): @@ -169,6 +175,7 @@ class _SafeQueue(Queue): tb = traceback.format_exception(type(e), e, e.__traceback__) e.__cause__ = _RemoteTraceback('\n"""\n{}"""'.format(''.join(tb))) work_item = self.pending_work_items.pop(obj.work_id, None) + self.thread_wakeup.wakeup() # work_item can be None if another process terminated. In this case, # the queue_manager_thread fails all work_items with BrokenProcessPool if work_item is not None: @@ -339,6 +346,8 @@ def _queue_management_worker(executor_reference, # Release the queue's resources as soon as possible. call_queue.close() + call_queue.join_thread() + thread_wakeup.close() # If .join() is not called on the created processes then # some ctx.Queue methods may deadlock on Mac OS X. for p in processes.values(): @@ -566,21 +575,6 @@ class ProcessPoolExecutor(_base.Executor): self._pending_work_items = {} self._cancel_pending_futures = False - # Create communication channels for the executor - # Make the call queue slightly larger than the number of processes to - # prevent the worker processes from idling. But don't make it too big - # because futures in the call queue cannot be cancelled. - queue_size = self._max_workers + EXTRA_QUEUED_CALLS - self._call_queue = _SafeQueue( - max_size=queue_size, ctx=self._mp_context, - pending_work_items=self._pending_work_items) - # Killed worker processes can produce spurious "broken pipe" - # tracebacks in the queue's own worker thread. But we detect killed - # processes anyway, so silence the tracebacks. - self._call_queue._ignore_epipe = True - self._result_queue = mp_context.SimpleQueue() - self._work_ids = queue.Queue() - # _ThreadWakeup is a communication channel used to interrupt the wait # of the main loop of queue_manager_thread from another thread (e.g. # when calling executor.submit or executor.shutdown). We do not use the @@ -589,6 +583,22 @@ class ProcessPoolExecutor(_base.Executor): # _result_queue write lock still acquired. self._queue_management_thread_wakeup = _ThreadWakeup() + # Create communication channels for the executor + # Make the call queue slightly larger than the number of processes to + # prevent the worker processes from idling. But don't make it too big + # because futures in the call queue cannot be cancelled. + queue_size = self._max_workers + EXTRA_QUEUED_CALLS + self._call_queue = _SafeQueue( + max_size=queue_size, ctx=self._mp_context, + pending_work_items=self._pending_work_items, + thread_wakeup=self._queue_management_thread_wakeup) + # Killed worker processes can produce spurious "broken pipe" + # tracebacks in the queue's own worker thread. But we detect killed + # processes anyway, so silence the tracebacks. + self._call_queue._ignore_epipe = True + self._result_queue = mp_context.SimpleQueue() + self._work_ids = queue.Queue() + def _start_queue_management_thread(self): if self._queue_management_thread is None: # When the executor gets garbarge collected, the weakref callback @@ -692,16 +702,11 @@ class ProcessPoolExecutor(_base.Executor): # To reduce the risk of opening too many files, remove references to # objects that use file descriptors. self._queue_management_thread = None - if self._call_queue is not None: - self._call_queue.close() - if wait: - self._call_queue.join_thread() - self._call_queue = None + self._call_queue = None self._result_queue = None self._processes = None if self._queue_management_thread_wakeup: - self._queue_management_thread_wakeup.close() self._queue_management_thread_wakeup = None shutdown.__doc__ = _base.Executor.shutdown.__doc__ diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index af77f813419..a7381f9d13e 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -415,13 +415,32 @@ class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest, BaseTestCase def test_del_shutdown(self): executor = futures.ThreadPoolExecutor(max_workers=5) - executor.map(abs, range(-5, 5)) + res = executor.map(abs, range(-5, 5)) threads = executor._threads del executor for t in threads: t.join() + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the threads when calling + # shutdown with wait=False + executor = futures.ThreadPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + threads = executor._threads + executor.shutdown(wait=False) + for t in threads: + t.join() + + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_thread_names_assigned(self): executor = futures.ThreadPoolExecutor( max_workers=5, thread_name_prefix='SpecialPool') @@ -488,7 +507,7 @@ class ProcessPoolShutdownTest(ExecutorShutdownTest): def test_del_shutdown(self): executor = futures.ProcessPoolExecutor(max_workers=5) - list(executor.map(abs, range(-5, 5))) + res = executor.map(abs, range(-5, 5)) queue_management_thread = executor._queue_management_thread processes = executor._processes call_queue = executor._call_queue @@ -502,6 +521,31 @@ class ProcessPoolShutdownTest(ExecutorShutdownTest): p.join() call_queue.join_thread() + # Make sure the results were all computed before the + # executor got shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + + def test_shutdown_no_wait(self): + # Ensure that the executor cleans up the processes when calling + # shutdown with wait=False + executor = futures.ProcessPoolExecutor(max_workers=5) + res = executor.map(abs, range(-5, 5)) + processes = executor._processes + call_queue = executor._call_queue + queue_management_thread = executor._queue_management_thread + executor.shutdown(wait=False) + + # Make sure that all the executor resources were properly cleaned by + # the shutdown process + queue_management_thread.join() + for p in processes.values(): + p.join() + call_queue.join_thread() + + # Make sure the results were all computed before the executor got + # shutdown. + assert all([r == abs(v) for r, v in zip(res, range(-5, 5))]) + create_executor_tests(ProcessPoolShutdownTest, executor_mixins=(ProcessPoolForkMixin, @@ -1086,6 +1130,32 @@ class ExecutorDeadlockTest: with self.assertRaises(BrokenProcessPool): f.result() + def test_shutdown_deadlock_pickle(self): + # Test that the pool calling shutdown with wait=False does not cause + # a deadlock if a task fails at pickle after the shutdown call. + # Reported in bpo-39104. + self.executor.shutdown(wait=True) + with self.executor_type(max_workers=2, + mp_context=get_context(self.ctx)) as executor: + self.executor = executor # Allow clean up in fail_on_deadlock + + # Start the executor and get the queue_management_thread to collect + # the threads and avoid dangling thread that should be cleaned up + # asynchronously. + executor.submit(id, 42).result() + queue_manager = executor._queue_management_thread + + # Submit a task that fails at pickle and shutdown the executor + # without waiting + f = executor.submit(id, ErrorAtPickle()) + executor.shutdown(wait=False) + with self.assertRaises(PicklingError): + f.result() + + # Make sure the executor is eventually shutdown and do not leave + # dangling threads + queue_manager.join() + create_executor_tests(ExecutorDeadlockTest, executor_mixins=(ProcessPoolForkMixin, diff --git a/Misc/NEWS.d/next/Library/2020-02-16-18-49-16.bpo-39104.cI5MJY.rst b/Misc/NEWS.d/next/Library/2020-02-16-18-49-16.bpo-39104.cI5MJY.rst new file mode 100644 index 00000000000..52779bf0982 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-16-18-49-16.bpo-39104.cI5MJY.rst @@ -0,0 +1,2 @@ +Fix hanging ProcessPoolExcutor on ``shutdown(wait=False)`` when a task has +failed pickling. From c33bdbb20cf55b3a2aa7a91bd3d91fcb59796fad Mon Sep 17 00:00:00 2001 From: idomic Date: Sun, 16 Feb 2020 14:17:58 -0500 Subject: [PATCH 380/380] bpo-37970: update and improve urlparse and urlsplit doc-strings (GH-16458) --- Lib/urllib/parse.py | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 34d5f95dd79..779278bac59 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -366,9 +366,23 @@ del _fix_result_transcoding def urlparse(url, scheme='', allow_fragments=True): """Parse a URL into 6 components: :///;?# - Return a 6-tuple: (scheme, netloc, path, params, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 6-tuple with fields corresponding to the + above. It is either a ParseResult or ParseResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ url, scheme, _coerce_result = _coerce_args(url, scheme) splitresult = urlsplit(url, scheme, allow_fragments) scheme, netloc, url, query, fragment = splitresult @@ -417,9 +431,24 @@ def _checknetloc(netloc): def urlsplit(url, scheme='', allow_fragments=True): """Parse a URL into 5 components: :///?# - Return a 5-tuple: (scheme, netloc, path, query, fragment). - Note that we don't break the components up in smaller bits - (e.g. netloc is a single string) and we don't expand % escapes.""" + + The result is a named 5-tuple with fields corresponding to the + above. It is either a SplitResult or SplitResultBytes object, + depending on the type of the url parameter. + + The username, password, hostname, and port sub-components of netloc + can also be accessed as attributes of the returned object. + + The scheme argument provides the default value of the scheme + component when no scheme is found in url. + + If allow_fragments is False, no attempt is made to separate the + fragment component from the previous component, which can be either + path or query. + + Note that % escapes are not expanded. + """ + url, scheme, _coerce_result = _coerce_args(url, scheme) allow_fragments = bool(allow_fragments) key = url, scheme, allow_fragments, type(url), type(scheme)