From c6d2f498142c29ed62241ab6d89cb7b5e38f2fca Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 12 Feb 2017 19:18:00 +0300 Subject: [PATCH 001/220] bpo-27122: Fix comment to point to correct issue number (#50) It took me quite a bit to figure out what this was referring to, since the given issue number is wrong, and the original commit message I found through git blame lists a different, also wrong issue number... see https://bugs.python.org/issue27122#msg279449 (cherry picked from commit af88e7eda4101f36e904771d3cf59a5f740b3b00) --- Lib/contextlib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index d44edd6e198ad9..4a7bd079a7dbb8 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -82,7 +82,7 @@ def __exit__(self, type, value, traceback): # raised inside the "with" statement from being suppressed. return exc is not value except RuntimeError as exc: - # Don't re-raise the passed in exception. (issue27112) + # Don't re-raise the passed in exception. (issue27122) if exc is value: return False # Likewise, avoid suppressing if a StopIteration exception From ae828714ebdb7a0d69bf23c1f6d606e5e63bdcfe Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 12 Feb 2017 08:21:36 -0800 Subject: [PATCH 002/220] bpo-29474: Improve documentation for weakref.WeakValueDictionary (#23) There were some grammatical errors in weakref.WeakValueDictionary documentation. --- Doc/library/weakref.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index e289b971e7c269..b02a006d733b6e 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -166,8 +166,8 @@ Extension types can easily be made to support weak references; see performed by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). -:class:`WeakKeyDictionary` objects have the following additional methods. These -expose the internal references directly. The references are not guaranteed to +:class:`WeakKeyDictionary` objects have an additional method that +exposes the internal references directly. The references are not guaranteed to be "live" at the time they are used, so the result of calling the references needs to be checked before being used. This can be used to avoid creating references that will cause the garbage collector to keep the keys around longer @@ -192,9 +192,9 @@ than needed. by the program during iteration may cause items in the dictionary to vanish "by magic" (as a side effect of garbage collection). -:class:`WeakValueDictionary` objects have the following additional methods. -These method have the same issues as the and :meth:`keyrefs` method of -:class:`WeakKeyDictionary` objects. +:class:`WeakValueDictionary` objects have an additional method that has the +same issues as the :meth:`keyrefs` method of :class:`WeakKeyDictionary` +objects. .. method:: WeakValueDictionary.valuerefs() From cabd1c7462ef991937e0e759b9bf307b3091ef06 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 12 Feb 2017 13:08:00 -0800 Subject: [PATCH 003/220] [backport to 3.5] bpo-28929: Link the documentation to its source file on GitHub (#36) * bpo-28929: Link the documentation to its source file on GitHub Change the documentation's `Show Source` link on the left menu to GitHub source file. (cherry picked from commit 23bafa294c75c20cb85ae5d97d7571a3a0ad8dd3) * remove if statement --- Doc/tools/templates/customsourcelink.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/customsourcelink.html b/Doc/tools/templates/customsourcelink.html index 243d8107779361..71d0bba683074e 100644 --- a/Doc/tools/templates/customsourcelink.html +++ b/Doc/tools/templates/customsourcelink.html @@ -3,8 +3,11 @@

{{ _('This Page') }}

{%- endif %} From 06a4fcb2458c5904968b5c8fe6b64940ba83a50d Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 13 Feb 2017 09:16:20 +0900 Subject: [PATCH 004/220] bpo-29438: Fixed use-after-free in key sharing dict (#40) --- Misc/NEWS | 2 ++ Objects/dictobject.c | 10 ++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index e1b32add0ef3ca..6a1abf174c35a5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-29438: Fixed use-after-free problem in key sharing dict. + - Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. - Issue #29337: Fixed possible BytesWarning when compare the code objects. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 11c086ffb47ae0..7299f36b2bf88c 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3893,20 +3893,18 @@ _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, } if (value == NULL) { res = PyDict_DelItem(dict, key); - if (cached != ((PyDictObject *)dict)->ma_keys) { - CACHED_KEYS(tp) = NULL; - DK_DECREF(cached); - } } else { - int was_shared = cached == ((PyDictObject *)dict)->ma_keys; + int was_shared = (cached == ((PyDictObject *)dict)->ma_keys); res = PyDict_SetItem(dict, key, value); /* PyDict_SetItem() may call dictresize() and convert split table * into combined table. In such case, convert it to split * table again and update type's shared key only when this is * the only dict sharing key with the type. */ - if (was_shared && cached != ((PyDictObject *)dict)->ma_keys) { + if (was_shared && + (cached = CACHED_KEYS(tp)) != NULL && + cached != ((PyDictObject *)dict)->ma_keys) { if (cached->dk_refcnt == 1) { CACHED_KEYS(tp) = make_keys_shared(dict); } else { From af456b241bd4889ac94eb215e73da400380460a0 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 13 Feb 2017 12:11:25 -0800 Subject: [PATCH 005/220] Support "bpo-" in Misc/NEWS (#1) (#43) Change the url to 3.5 (cherry picked from commit 79ab8be05fb4ffb5c258d2ca49be5fc2d4880431) Contributed by Brett Cannon --- Doc/tools/extensions/pyspecific.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 63112830ba02eb..00c9356927f853 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -34,7 +34,7 @@ ISSUE_URI = 'https://bugs.python.org/issue%s' -SOURCE_URI = 'https://hg.python.org/cpython/file/3.5/%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.5/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -79,7 +79,7 @@ def new_depart_literal_block(self, node): def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): issue = utils.unescape(text) - text = 'issue ' + issue + text = 'bpo-' + issue refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue) return [refnode], [] @@ -225,7 +225,7 @@ def run(self): # Support for including Misc/NEWS -issue_re = re.compile('([Ii])ssue #([0-9]+)') +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -253,7 +253,7 @@ def run(self): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r'`\1ssue #\2 `__', + content = issue_re.sub(r'`bpo-\1 `__', content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading From 9c5684e0d380cf5bc109888603756084588ce617 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 13 Feb 2017 14:28:58 -0800 Subject: [PATCH 006/220] bpo-28556: Various updates to typing (#28) (#78) various updates from upstream python/typing repo: - Added typing.Counter and typing.ChainMap generics - More flexible typing.NamedTuple - Improved generic ABC caching - More tests - Bugfixes - Other updates * Add Misc/NEWS entry * Add issue number Contributed by Ivan Levkivskyi @ilevkivskyi (cherry picked from commit b692dc8475a032740576129d0990ddc3edccab2b) --- Lib/test/mod_generics_cache.py | 14 ++ Lib/test/test_typing.py | 237 +++++++++++++++++++++++++++++---- Lib/typing.py | 138 ++++++++++++++----- Misc/NEWS | 7 + 4 files changed, 338 insertions(+), 58 deletions(-) create mode 100644 Lib/test/mod_generics_cache.py diff --git a/Lib/test/mod_generics_cache.py b/Lib/test/mod_generics_cache.py new file mode 100644 index 00000000000000..d9a60b4b28c325 --- /dev/null +++ b/Lib/test/mod_generics_cache.py @@ -0,0 +1,14 @@ +"""Module for testing the behavior of generics across different modules.""" + +from typing import TypeVar, Generic + +T = TypeVar('T') + + +class A(Generic[T]): + pass + + +class B(Generic[T]): + class A(Generic[T]): + pass diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index fce6b5aaffdf93..64d8276658ee7f 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -190,6 +190,10 @@ def test_bound_errors(self): with self.assertRaises(TypeError): TypeVar('X', str, float, bound=Employee) + def test_no_bivariant(self): + with self.assertRaises(ValueError): + TypeVar('T', covariant=True, contravariant=True) + class UnionTests(BaseTestCase): @@ -254,6 +258,11 @@ def test_repr(self): self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__) u = Union[int, Employee] self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__) + T = TypeVar('T') + u = Union[T, int][int] + self.assertEqual(repr(u), repr(int)) + u = Union[List[int], int] + self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]') def test_cannot_subclass(self): with self.assertRaises(TypeError): @@ -304,6 +313,15 @@ def test_union_instance_type_error(self): with self.assertRaises(TypeError): isinstance(42, Union[int, str]) + def test_no_eval_union(self): + u = Union[int, str] + def f(x: u): ... + self.assertIs(get_type_hints(f)['x'], u) + + def test_function_repr_union(self): + def fun() -> int: ... + self.assertEqual(repr(Union[fun, int]), 'typing.Union[fun, int]') + def test_union_str_pattern(self): # Shouldn't crash; see http://bugs.python.org/issue25390 A = Union[str, Pattern] @@ -401,6 +419,8 @@ def test_callable_wrong_forms(self): Callable[[()], int] with self.assertRaises(TypeError): Callable[[int, 1], 2] + with self.assertRaises(TypeError): + Callable[int] def test_callable_instance_works(self): def f(): @@ -546,15 +566,27 @@ def test_basics(self): Y[str] with self.assertRaises(TypeError): Y[str, str] + self.assertIsSubclass(SimpleMapping[str, int], SimpleMapping) def test_generic_errors(self): T = TypeVar('T') + S = TypeVar('S') with self.assertRaises(TypeError): Generic[T]() + with self.assertRaises(TypeError): + Generic[T][T] + with self.assertRaises(TypeError): + Generic[T][S] with self.assertRaises(TypeError): isinstance([], List[int]) with self.assertRaises(TypeError): issubclass(list, List[int]) + with self.assertRaises(TypeError): + class NewGeneric(Generic): ... + with self.assertRaises(TypeError): + class MyGeneric(Generic[T], Generic[S]): ... + with self.assertRaises(TypeError): + class MyGeneric(List[T], Generic[S]): ... def test_init(self): T = TypeVar('T') @@ -738,6 +770,53 @@ def test_subscript_meta(self): self.assertEqual(Union[T, int][GenericMeta], Union[GenericMeta, int]) self.assertEqual(Callable[..., GenericMeta].__args__, (Ellipsis, GenericMeta)) + def test_generic_hashes(self): + try: + from test import mod_generics_cache + except ImportError: # for Python 3.4 and previous versions + import mod_generics_cache + class A(Generic[T]): + ... + + class B(Generic[T]): + class A(Generic[T]): + ... + + self.assertEqual(A, A) + self.assertEqual(mod_generics_cache.A[str], mod_generics_cache.A[str]) + self.assertEqual(B.A, B.A) + self.assertEqual(mod_generics_cache.B.A[B.A[str]], + mod_generics_cache.B.A[B.A[str]]) + + self.assertNotEqual(A, B.A) + self.assertNotEqual(A, mod_generics_cache.A) + self.assertNotEqual(A, mod_generics_cache.B.A) + self.assertNotEqual(B.A, mod_generics_cache.A) + self.assertNotEqual(B.A, mod_generics_cache.B.A) + + self.assertNotEqual(A[str], B.A[str]) + self.assertNotEqual(A[List[Any]], B.A[List[Any]]) + self.assertNotEqual(A[str], mod_generics_cache.A[str]) + self.assertNotEqual(A[str], mod_generics_cache.B.A[str]) + self.assertNotEqual(B.A[int], mod_generics_cache.A[int]) + self.assertNotEqual(B.A[List[Any]], mod_generics_cache.B.A[List[Any]]) + + self.assertNotEqual(Tuple[A[str]], Tuple[B.A[str]]) + self.assertNotEqual(Tuple[A[List[Any]]], Tuple[B.A[List[Any]]]) + self.assertNotEqual(Union[str, A[str]], Union[str, mod_generics_cache.A[str]]) + self.assertNotEqual(Union[A[str], A[str]], + Union[A[str], mod_generics_cache.A[str]]) + self.assertNotEqual(typing.FrozenSet[A[str]], + typing.FrozenSet[mod_generics_cache.B.A[str]]) + + if sys.version_info[:2] > (3, 2): + self.assertTrue(repr(Tuple[A[str]]).endswith('.A[str]]')) + self.assertTrue(repr(Tuple[B.A[str]]).endswith('.B.A[str]]')) + self.assertTrue(repr(Tuple[mod_generics_cache.A[str]]) + .endswith('mod_generics_cache.A[str]]')) + self.assertTrue(repr(Tuple[mod_generics_cache.B.A[str]]) + .endswith('mod_generics_cache.B.A[str]]')) + def test_extended_generic_rules_eq(self): T = TypeVar('T') U = TypeVar('U') @@ -835,6 +914,8 @@ def test_fail_with_bare_generic(self): Tuple[Generic[T]] with self.assertRaises(TypeError): List[typing._Protocol] + with self.assertRaises(TypeError): + isinstance(1, Generic) def test_type_erasure_special(self): T = TypeVar('T') @@ -853,6 +934,11 @@ class MyDict(typing.Dict[T, T]): ... class MyDef(typing.DefaultDict[str, T]): ... self.assertIs(MyDef[int]().__class__, MyDef) self.assertIs(MyDef[int]().__orig_class__, MyDef[int]) + # ChainMap was added in 3.3 + if sys.version_info >= (3, 3): + class MyChain(typing.ChainMap[str, T]): ... + self.assertIs(MyChain[int]().__class__, MyChain) + self.assertIs(MyChain[int]().__orig_class__, MyChain[int]) def test_all_repr_eq_any(self): objs = (getattr(typing, el) for el in typing.__all__) @@ -1203,6 +1289,19 @@ def test_forwardref_instance_type_error(self): with self.assertRaises(TypeError): isinstance(42, fr) + def test_forwardref_subclass_type_error(self): + fr = typing._ForwardRef('int') + with self.assertRaises(TypeError): + issubclass(int, fr) + + def test_forward_equality(self): + fr = typing._ForwardRef('int') + self.assertEqual(fr, typing._ForwardRef('int')) + self.assertNotEqual(List['int'], List[int]) + + def test_forward_repr(self): + self.assertEqual(repr(List['int']), "typing.List[_ForwardRef('int')]") + def test_union_forward(self): def foo(a: Union['T']): @@ -1285,6 +1384,15 @@ def foo(a: 'whatevers') -> {}: ith = get_type_hints(C().foo) self.assertEqual(ith, {}) + def test_no_type_check_no_bases(self): + class C: + def meth(self, x: int): ... + @no_type_check + class D(C): + c = C + # verify that @no_type_check never affects bases + self.assertEqual(get_type_hints(C.meth), {'x': int}) + def test_meta_no_type_check(self): @no_type_check_decorator @@ -1401,11 +1509,16 @@ class A: class B(A): x: ClassVar[Optional['B']] = None y: int + b: int class CSub(B): z: ClassVar['CSub'] = B() class G(Generic[T]): lst: ClassVar[List[T]] = [] +class NoneAndForward: + parent: 'NoneAndForward' + meaning: None + class CoolEmployee(NamedTuple): name: str cool: int @@ -1419,10 +1532,13 @@ class XMeth(NamedTuple): def double(self): return 2 * self.x -class XMethBad(NamedTuple): +class XRepr(NamedTuple): x: int - def _fields(self): - return 'no chance for this' + y: int = 1 + def __str__(self): + return f'{self.x} -> {self.y}' + def __add__(self, other): + return 0 """ if PY36: @@ -1431,7 +1547,7 @@ def _fields(self): # fake names for the sake of static analysis ann_module = ann_module2 = ann_module3 = None A = B = CSub = G = CoolEmployee = CoolEmployeeWithDefault = object - XMeth = XMethBad = object + XMeth = XRepr = NoneAndForward = object gth = get_type_hints @@ -1466,6 +1582,8 @@ def test_get_type_hints_classes(self): {'y': Optional[ann_module.C]}) self.assertEqual(gth(ann_module.S), {'x': str, 'y': str}) self.assertEqual(gth(ann_module.foo), {'x': int}) + self.assertEqual(gth(NoneAndForward, globals()), + {'parent': NoneAndForward, 'meaning': type(None)}) @skipUnless(PY36, 'Python 3.6 required') def test_respect_no_type_check(self): @@ -1482,17 +1600,22 @@ def meth(x: int): ... class Der(ABase): ... self.assertEqual(gth(ABase.meth), {'x': int}) - def test_get_type_hints_for_builins(self): + def test_get_type_hints_for_builtins(self): # Should not fail for built-in classes and functions. self.assertEqual(gth(int), {}) self.assertEqual(gth(type), {}) self.assertEqual(gth(dir), {}) self.assertEqual(gth(len), {}) + self.assertEqual(gth(object.__str__), {}) + self.assertEqual(gth(object().__str__), {}) + self.assertEqual(gth(str.join), {}) def test_previous_behavior(self): def testf(x, y): ... testf.__annotations__['x'] = 'int' self.assertEqual(gth(testf), {'x': int}) + def testg(x: None): ... + self.assertEqual(gth(testg), {'x': type(None)}) def test_get_type_hints_for_object_with_annotations(self): class A: ... @@ -1506,9 +1629,10 @@ def test_get_type_hints_ClassVar(self): self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__), {'var': typing.ClassVar[ann_module2.CV]}) self.assertEqual(gth(B, globals()), - {'y': int, 'x': ClassVar[Optional[B]]}) + {'y': int, 'x': ClassVar[Optional[B]], 'b': int}) self.assertEqual(gth(CSub, globals()), - {'z': ClassVar[CSub], 'y': int, 'x': ClassVar[Optional[B]]}) + {'z': ClassVar[CSub], 'y': int, 'b': int, + 'x': ClassVar[Optional[B]]}) self.assertEqual(gth(G), {'lst': ClassVar[List[T]]}) @@ -1628,6 +1752,11 @@ def test_list(self): def test_deque(self): self.assertIsSubclass(collections.deque, typing.Deque) + class MyDeque(typing.Deque[int]): ... + self.assertIsInstance(MyDeque(), collections.deque) + + def test_counter(self): + self.assertIsSubclass(collections.Counter, typing.Counter) def test_set(self): self.assertIsSubclass(set, typing.Set) @@ -1680,13 +1809,10 @@ class MyDict(typing.Dict[str, int]): self.assertIsSubclass(MyDict, dict) self.assertNotIsSubclass(dict, MyDict) - def test_no_defaultdict_instantiation(self): - with self.assertRaises(TypeError): - typing.DefaultDict() - with self.assertRaises(TypeError): - typing.DefaultDict[KT, VT]() - with self.assertRaises(TypeError): - typing.DefaultDict[str, int]() + def test_defaultdict_instantiation(self): + self.assertIs(type(typing.DefaultDict()), collections.defaultdict) + self.assertIs(type(typing.DefaultDict[KT, VT]()), collections.defaultdict) + self.assertIs(type(typing.DefaultDict[str, int]()), collections.defaultdict) def test_defaultdict_subclass(self): @@ -1699,13 +1825,49 @@ class MyDefDict(typing.DefaultDict[str, int]): self.assertIsSubclass(MyDefDict, collections.defaultdict) self.assertNotIsSubclass(collections.defaultdict, MyDefDict) - def test_no_deque_instantiation(self): - with self.assertRaises(TypeError): - typing.Deque() - with self.assertRaises(TypeError): - typing.Deque[T]() - with self.assertRaises(TypeError): - typing.Deque[int]() + @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3') + def test_chainmap_instantiation(self): + self.assertIs(type(typing.ChainMap()), collections.ChainMap) + self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap) + self.assertIs(type(typing.ChainMap[str, int]()), collections.ChainMap) + class CM(typing.ChainMap[KT, VT]): ... + self.assertIs(type(CM[int, str]()), CM) + + @skipUnless(sys.version_info >= (3, 3), 'ChainMap was added in 3.3') + def test_chainmap_subclass(self): + + class MyChainMap(typing.ChainMap[str, int]): + pass + + cm = MyChainMap() + self.assertIsInstance(cm, MyChainMap) + + self.assertIsSubclass(MyChainMap, collections.ChainMap) + self.assertNotIsSubclass(collections.ChainMap, MyChainMap) + + def test_deque_instantiation(self): + self.assertIs(type(typing.Deque()), collections.deque) + self.assertIs(type(typing.Deque[T]()), collections.deque) + self.assertIs(type(typing.Deque[int]()), collections.deque) + class D(typing.Deque[T]): ... + self.assertIs(type(D[int]()), D) + + def test_counter_instantiation(self): + self.assertIs(type(typing.Counter()), collections.Counter) + self.assertIs(type(typing.Counter[T]()), collections.Counter) + self.assertIs(type(typing.Counter[int]()), collections.Counter) + class C(typing.Counter[T]): ... + self.assertIs(type(C[int]()), C) + + def test_counter_subclass_instantiation(self): + + class MyCounter(typing.Counter[int]): + pass + + d = MyCounter() + self.assertIsInstance(d, MyCounter) + self.assertIsInstance(d, typing.Counter) + self.assertIsInstance(d, collections.Counter) def test_no_set_instantiation(self): with self.assertRaises(TypeError): @@ -2018,6 +2180,14 @@ def test_basics(self): collections.OrderedDict([('name', str), ('id', int)])) self.assertIs(Emp._field_types, Emp.__annotations__) + def test_namedtuple_pyversion(self): + if sys.version_info[:2] < (3, 6): + with self.assertRaises(TypeError): + NamedTuple('Name', one=int, other=str) + with self.assertRaises(TypeError): + class NotYet(NamedTuple): + whatever = 0 + @skipUnless(PY36, 'Python 3.6 required') def test_annotation_usage(self): tim = CoolEmployee('Tim', 9000) @@ -2055,10 +2225,18 @@ class NonDefaultAfterDefault(NamedTuple): @skipUnless(PY36, 'Python 3.6 required') def test_annotation_usage_with_methods(self): - self.assertEquals(XMeth(1).double(), 2) - self.assertEquals(XMeth(42).x, XMeth(42)[0]) - self.assertEquals(XMethBad(1)._fields, ('x',)) - self.assertEquals(XMethBad(1).__annotations__, {'x': int}) + self.assertEqual(XMeth(1).double(), 2) + self.assertEqual(XMeth(42).x, XMeth(42)[0]) + self.assertEqual(str(XRepr(42)), '42 -> 1') + self.assertEqual(XRepr(1, 2) + XRepr(3), 0) + + with self.assertRaises(AttributeError): + exec(""" +class XMethBad(NamedTuple): + x: int + def _fields(self): + return 'no chance for this' +""") @skipUnless(PY36, 'Python 3.6 required') def test_namedtuple_keyword_usage(self): @@ -2138,6 +2316,12 @@ def test_basics(self): Pattern[Union[str, bytes]] Match[Union[bytes, str]] + def test_alias_equality(self): + self.assertEqual(Pattern[str], Pattern[str]) + self.assertNotEqual(Pattern[str], Pattern[bytes]) + self.assertNotEqual(Pattern[str], Match[str]) + self.assertNotEqual(Pattern[str], str) + def test_errors(self): with self.assertRaises(TypeError): # Doesn't fit AnyStr. @@ -2152,6 +2336,9 @@ def test_errors(self): with self.assertRaises(TypeError): # We don't support isinstance(). isinstance(42, Pattern[str]) + with self.assertRaises(TypeError): + # We don't support issubclass(). + issubclass(Pattern[bytes], Pattern[str]) def test_repr(self): self.assertEqual(repr(Pattern), 'Pattern[~AnyStr]') diff --git a/Lib/typing.py b/Lib/typing.py index c9e341753769e0..efe358faf20988 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -10,6 +10,12 @@ import collections.abc as collections_abc except ImportError: import collections as collections_abc # Fallback for PY3.2. +try: + from types import SlotWrapperType, MethodWrapperType, MethodDescriptorType +except ImportError: + SlotWrapperType = type(object.__init__) + MethodWrapperType = type(object().__str__) + MethodDescriptorType = type(str.join) # Please keep __all__ alphabetized within each category. @@ -62,6 +68,7 @@ 'SupportsRound', # Concrete collection types. + 'Counter', 'Deque', 'Dict', 'DefaultDict', @@ -849,19 +856,6 @@ def _next_in_mro(cls): return next_in_mro -def _valid_for_check(cls): - """An internal helper to prohibit isinstance([1], List[str]) etc.""" - if cls is Generic: - raise TypeError("Class %r cannot be used with class " - "or instance checks" % cls) - if ( - cls.__origin__ is not None and - sys._getframe(3).f_globals['__name__'] not in ['abc', 'functools'] - ): - raise TypeError("Parameterized generics cannot be used with class " - "or instance checks") - - def _make_subclasshook(cls): """Construct a __subclasshook__ callable that incorporates the associated __extra__ class in subclass checks performed @@ -872,7 +866,6 @@ def _make_subclasshook(cls): # Registered classes need not be checked here because # cls and its extra share the same _abc_registry. def __extrahook__(subclass): - _valid_for_check(cls) res = cls.__extra__.__subclasshook__(subclass) if res is not NotImplemented: return res @@ -887,7 +880,6 @@ def __extrahook__(subclass): else: # For non-ABC extras we'll just call issubclass(). def __extrahook__(subclass): - _valid_for_check(cls) if cls.__extra__ and issubclass(subclass, cls.__extra__): return True return NotImplemented @@ -974,6 +966,7 @@ def __new__(cls, name, bases, namespace, # remove bare Generic from bases if there are other generic bases if any(isinstance(b, GenericMeta) and b is not Generic for b in bases): bases = tuple(b for b in bases if b is not Generic) + namespace.update({'__origin__': origin, '__extra__': extra}) self = super().__new__(cls, name, bases, namespace, _root=True) self.__parameters__ = tvars @@ -982,8 +975,6 @@ def __new__(cls, name, bases, namespace, self.__args__ = tuple(... if a is _TypingEllipsis else () if a is _TypingEmpty else a for a in args) if args else None - self.__origin__ = origin - self.__extra__ = extra # Speed hack (https://github.com/python/typing/issues/196). self.__next_in_mro__ = _next_in_mro(self) # Preserve base classes on subclassing (__bases__ are type erased now). @@ -994,20 +985,56 @@ def __new__(cls, name, bases, namespace, # with issubclass() and isinstance() in the same way as their # collections.abc counterparts (e.g., isinstance([], Iterable)). if ( - # allow overriding '__subclasshook__' not in namespace and extra or - hasattr(self.__subclasshook__, '__name__') and - self.__subclasshook__.__name__ == '__extrahook__' + # allow overriding + getattr(self.__subclasshook__, '__name__', '') == '__extrahook__' ): self.__subclasshook__ = _make_subclasshook(self) if isinstance(extra, abc.ABCMeta): self._abc_registry = extra._abc_registry + self._abc_cache = extra._abc_cache + elif origin is not None: + self._abc_registry = origin._abc_registry + self._abc_cache = origin._abc_cache if origin and hasattr(origin, '__qualname__'): # Fix for Python 3.2. self.__qualname__ = origin.__qualname__ - self.__tree_hash__ = hash(self._subs_tree()) if origin else hash((self.__name__,)) + self.__tree_hash__ = (hash(self._subs_tree()) if origin else + super(GenericMeta, self).__hash__()) return self + # _abc_negative_cache and _abc_negative_cache_version + # realised as descriptors, since GenClass[t1, t2, ...] always + # share subclass info with GenClass. + # This is an important memory optimization. + @property + def _abc_negative_cache(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache + return _gorg(self)._abc_generic_negative_cache + + @_abc_negative_cache.setter + def _abc_negative_cache(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache = value + else: + self._abc_generic_negative_cache = value + + @property + def _abc_negative_cache_version(self): + if isinstance(self.__extra__, abc.ABCMeta): + return self.__extra__._abc_negative_cache_version + return _gorg(self)._abc_generic_negative_cache_version + + @_abc_negative_cache_version.setter + def _abc_negative_cache_version(self, value): + if self.__origin__ is None: + if isinstance(self.__extra__, abc.ABCMeta): + self.__extra__._abc_negative_cache_version = value + else: + self._abc_generic_negative_cache_version = value + def _get_type_vars(self, tvars): if self.__origin__ and self.__parameters__: _get_type_vars(self.__parameters__, tvars) @@ -1095,8 +1122,10 @@ def __getitem__(self, params): _check_generic(self, params) tvars = _type_vars(params) args = params + + prepend = (self,) if self.__origin__ is None else () return self.__class__(self.__name__, - self.__bases__, + prepend + self.__bases__, _no_slots_copy(self.__dict__), tvars=tvars, args=args, @@ -1104,6 +1133,17 @@ def __getitem__(self, params): extra=self.__extra__, orig_bases=self.__orig_bases__) + def __subclasscheck__(self, cls): + if self.__origin__ is not None: + if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']: + raise TypeError("Parameterized generics cannot be used with class " + "or instance checks") + return False + if self is Generic: + raise TypeError("Class %r cannot be used with class " + "or instance checks" % self) + return super().__subclasscheck__(cls) + def __instancecheck__(self, instance): # Since we extend ABC.__subclasscheck__ and # ABC.__instancecheck__ inlines the cache checking done by the @@ -1398,6 +1438,11 @@ def _get_defaults(func): return res +_allowed_types = (types.FunctionType, types.BuiltinFunctionType, + types.MethodType, types.ModuleType, + SlotWrapperType, MethodWrapperType, MethodDescriptorType) + + def get_type_hints(obj, globalns=None, localns=None): """Return type hints for an object. @@ -1452,12 +1497,7 @@ def get_type_hints(obj, globalns=None, localns=None): hints = getattr(obj, '__annotations__', None) if hints is None: # Return empty annotations for something that _could_ have them. - if ( - isinstance(obj, types.FunctionType) or - isinstance(obj, types.BuiltinFunctionType) or - isinstance(obj, types.MethodType) or - isinstance(obj, types.ModuleType) - ): + if isinstance(obj, _allowed_types): return {} else: raise TypeError('{!r} is not a module, class, method, ' @@ -1824,8 +1864,7 @@ class Deque(collections.deque, MutableSequence[T], extra=collections.deque): def __new__(cls, *args, **kwds): if _geqv(cls, Deque): - raise TypeError("Type Deque cannot be instantiated; " - "use deque() instead") + return collections.deque(*args, **kwds) return _generic_new(collections.deque, cls, *args, **kwds) @@ -1894,11 +1933,35 @@ class DefaultDict(collections.defaultdict, MutableMapping[KT, VT], def __new__(cls, *args, **kwds): if _geqv(cls, DefaultDict): - raise TypeError("Type DefaultDict cannot be instantiated; " - "use collections.defaultdict() instead") + return collections.defaultdict(*args, **kwds) return _generic_new(collections.defaultdict, cls, *args, **kwds) +class Counter(collections.Counter, Dict[T, int], extra=collections.Counter): + + __slots__ = () + + def __new__(cls, *args, **kwds): + if _geqv(cls, Counter): + return collections.Counter(*args, **kwds) + return _generic_new(collections.Counter, cls, *args, **kwds) + + +if hasattr(collections, 'ChainMap'): + # ChainMap only exists in 3.3+ + __all__.append('ChainMap') + + class ChainMap(collections.ChainMap, MutableMapping[KT, VT], + extra=collections.ChainMap): + + __slots__ = () + + def __new__(cls, *args, **kwds): + if _geqv(cls, ChainMap): + return collections.ChainMap(*args, **kwds) + return _generic_new(collections.ChainMap, cls, *args, **kwds) + + # Determine what base class to use for Generator. if hasattr(collections_abc, 'Generator'): # Sufficiently recent versions of 3.5 have a Generator ABC. @@ -1975,6 +2038,13 @@ def _make_nmtuple(name, types): _PY36 = sys.version_info[:2] >= (3, 6) +# attributes prohibited to set in NamedTuple class syntax +_prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', + '_fields', '_field_defaults', '_field_types', + '_make', '_replace', '_asdict') + +_special = ('__module__', '__name__', '__qualname__', '__annotations__') + class NamedTupleMeta(type): @@ -2002,7 +2072,9 @@ def __new__(cls, typename, bases, ns): nm_tpl._field_defaults = defaults_dict # update from user namespace without overriding special namedtuple attributes for key in ns: - if not hasattr(nm_tpl, key): + if key in _prohibited: + raise AttributeError("Cannot overwrite NamedTuple attribute " + key) + elif key not in _special and key not in nm_tpl._fields: setattr(nm_tpl, key, ns[key]) return nm_tpl diff --git a/Misc/NEWS b/Misc/NEWS index 6a1abf174c35a5..fe50135c01615c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -25,6 +25,13 @@ Extension Modules Library ------- +- Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, + improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, + Manuel Krebber, and Łukasz Langa. + +- Issue #29100: Fix datetime.fromtimestamp() regression introduced in Python + 3.6.0: check minimum and maximum years. + - Issue #29519: Fix weakref spewing exceptions during interpreter shutdown when used with a rare combination of multiprocessing and custom codecs. From 3ae8fd43fd18160dcb619d7d367cb1b41aeab32a Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 13 Feb 2017 15:49:08 -0800 Subject: [PATCH 007/220] A few README tweaks (#73) (#80) * Add a paragraph at the top for users, not builders, of Python. * Use nicer rst url syntax to avoid borking paragraphs in the plain text. Contributed by Ned Batchelder @nedbat (cherry picked from commit 3cdbd68ce8230cff1afb67472b96fbfa7f047e32) --- README | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README b/README index de3a091e07a598..8133b3191689ef 100644 --- a/README +++ b/README @@ -11,6 +11,14 @@ especially how built-in objects like dictionaries and strings work, have changed considerably, and a lot of deprecated features have finally been removed. +Using Python +------------ + +Installable Python kits, and information about using Python, are available at +`python.org`_. + +.. _python.org: https://www.python.org/ + Build Instructions ------------------ @@ -151,7 +159,7 @@ IMPORTANT: If the tests fail and you decide to mail a bug report, *don't* include the output of "make test". It is useless. Run the failing test manually, as follows: - ./python -m test -v test_whatever + ./python -m test -v test_whatever (substituting the top of the source tree for '.' if you built in a different directory). This runs the test in verbose mode. @@ -198,11 +206,12 @@ Proposals for enhancement ------------------------- If you have a proposal to change Python, you may want to send an email to the -comp.lang.python or python-ideas mailing lists for inital feedback. A Python +comp.lang.python or `python-ideas`_ mailing lists for initial feedback. A Python Enhancement Proposal (PEP) may be submitted if your idea gains ground. All current PEPs, as well as guidelines for submitting a new PEP, are listed at http://www.python.org/dev/peps/. +.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/ Release Schedule ---------------- From c0f9014a51593b2d58721819f8686f96dce5be71 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 14 Feb 2017 06:12:15 -0800 Subject: [PATCH 008/220] Fix some sphinx warnings (#9) (#82) * Fix some deprecation warnings in Doc/conf.py * Fix an rst error in Misc/NEWS Contributed by Ryan Gonzalez @kirbyfan64 (cherry picked from commit e7ffb99f842ebff97cffa0fc90b18be4e5abecf2) --- Doc/Makefile | 2 +- Doc/conf.py | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index 10c3288c590fd9..9ad7b86579d66c 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -10,7 +10,7 @@ PAPER = SOURCES = DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py) -ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \ +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_elements.papersize=$(PAPER) \ $(SPHINXOPTS) . build/$(BUILDER) $(SOURCES) .PHONY: help build html htmlhelp latex text changes linkcheck \ diff --git a/Doc/conf.py b/Doc/conf.py index b1bb6208bb4b8e..b3f26d5a692163 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -88,11 +88,24 @@ # Options for LaTeX output # ------------------------ +# Get LaTeX to handle Unicode correctly +latex_elements = {'inputenc': r'\usepackage[utf8x]{inputenc}', 'utf8extra': ''} + +# Additional stuff for the LaTeX preamble. +latex_elements['preamble'] = r''' +\authoraddress{ + \strong{Python Software Foundation}\\ + Email: \email{docs@python.org} +} +\let\Verbatim=\OriginalVerbatim +\let\endVerbatim=\endOriginalVerbatim +''' + # The paper size ('letter' or 'a4'). -latex_paper_size = 'a4' +latex_elements['papersize'] = 'a4' # The font size ('10pt', '11pt' or '12pt'). -latex_font_size = '10pt' +latex_elements['font_size'] = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). @@ -125,22 +138,9 @@ for fn in os.listdir('howto') if fn.endswith('.rst') and fn != 'index.rst') -# Additional stuff for the LaTeX preamble. -latex_preamble = r''' -\authoraddress{ - \strong{Python Software Foundation}\\ - Email: \email{docs@python.org} -} -\let\Verbatim=\OriginalVerbatim -\let\endVerbatim=\endOriginalVerbatim -''' - # Documents to append as an appendix to all manuals. latex_appendices = ['glossary', 'about', 'license', 'copyright'] -# Get LaTeX to handle Unicode correctly -latex_elements = {'inputenc': r'\usepackage[utf8x]{inputenc}', 'utf8extra': ''} - # Options for Epub output # ----------------------- From 38c8354f3204441f6c6bd22213b449d2d8954fcc Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 14 Feb 2017 08:54:22 -0800 Subject: [PATCH 009/220] bpo-29521 Fix two minor documentation build warnings (#41) (#84) Much of bpo-29521 was fixed in parallel with commit e7ffb99 . This cleans up the rest. Apply parallel change to Doc/make.bat to read "set SPHINXOPTS=-D latex_elements.papersize=" I don't have a Windows system on which to observe the warning, but it should be necessary. The warning: .../workspace/cpython_github/Doc/faq/windows.rst:303: WARNING: unknown option: -t In the Windows FAQ, `How do I keep editors from inserting tabs into my Python source?`, contained a reference to a Python -t option. In Python 2.x, this caused Python to issue warnings about lines with mixed spaces and tabs, but as of Python 3.6 it does nothing. Per discussion at http://bugs.python.org/issue29387, take their wording. Python [3] raises an IndentationError or TabError. Tabnanny is now a module. (cherry picked from commit 3d707be950b387552585451071928e7b39cdfa53) --- Doc/faq/windows.rst | 7 ++++--- Doc/make.bat | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index d7253436beaf61..b9b7b8d359bdf2 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -300,9 +300,10 @@ this respect, and is easily configured to use spaces: Take :menuselection:`Tools --> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent size" to 4, and select the "Insert spaces" radio button. -If you suspect mixed tabs and spaces are causing problems in leading whitespace, -run Python with the :option:`-t` switch or run ``Tools/Scripts/tabnanny.py`` to -check a directory tree in batch mode. +Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs +and spaces are causing problems in leading whitespace. +You may also run the :mod:`tabnanny` module to check a directory tree +in batch mode. How do I check for a keypress without blocking? diff --git a/Doc/make.bat b/Doc/make.bat index 5ab80850a3103b..740f148affa6cf 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -86,7 +86,7 @@ goto end :build if NOT "%PAPER%" == "" ( - set SPHINXOPTS=-D latex_paper_size=%PAPER% %SPHINXOPTS% + set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% ) cmd /C %SPHINXBUILD% %SPHINXOPTS% -b%1 -dbuild\doctrees . %BUILDDIR%\%* From 1bfd33f5732ba5f6d15e99d88e45a62a9cc42542 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 15 Feb 2017 18:59:45 +0900 Subject: [PATCH 010/220] Update URL of Mersenne Twister Home Page (#20) (#114) --- Modules/_randommodule.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 95ad4a429a04f0..9ce788289572c7 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -2,7 +2,7 @@ /* ------------------------------------------------------------------ The code in this module was based on a download from: - http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html It was modified in 2002 by Raymond Hettinger as follows: @@ -60,8 +60,8 @@ Any feedback is very welcome. - http://www.math.keio.ac.jp/matumoto/emt.html - email: matumoto@math.keio.ac.jp + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) */ /* ---------------------------------------------------------------*/ From bb53a27a5d56a4f33c3fc8eebb486b34808c92b7 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 15 Feb 2017 11:39:37 -0800 Subject: [PATCH 011/220] [cherry-pick for 3.5] bpo-29481: add versionadded 3.5.4 to typing.Deque docs (#109) (cherry picked from commit 7e147f1ddb8233964ff0981e6b64fc12edac99aa) --- Doc/library/typing.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 8da71b64a7922f..93ea4f9422997a 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -561,6 +561,8 @@ The module defines the following classes, functions and decorators: A generic version of :class:`collections.deque`. + .. versionadded:: 3.5.4 + .. class:: List(list, MutableSequence[T]) Generic version of :class:`list`. From de553b8210882823d3df3f1ef6882eba3f8accf3 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 15 Feb 2017 15:14:38 -0800 Subject: [PATCH 012/220] bpo-29521 update Misc/ACKS (#111) (cherry picked from commit 6420088b924a23e5de40be6623d2a80b12f71d97) --- Misc/ACKS | 1 + 1 file changed, 1 insertion(+) diff --git a/Misc/ACKS b/Misc/ACKS index 3c169d6ef54778..d33ee913f49c41 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -341,6 +341,7 @@ A. Jesse Jiryu Davis Merlijn van Deen John DeGood Ned Deily +Jim DeLaHunt Vincent Delft Arnaud Delobelle Konrad Delong From 5e04dfecec478db13031fa507d6b2e21adbce035 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 16 Feb 2017 10:43:16 +0100 Subject: [PATCH 013/220] Backport35 doc fixes: PR#68 and PR#124 (#125) (#126) * Travis CI: run rstlint.py in the docs job (#68) Currently, http://buildbot.python.org/all/buildslaves/ware-docs buildbot is only run as post-commit. For example, bpo-29521 (PR#41) introduced two warnings, unnotified by the Travis CI docs job. Modify the docs job to run toosl/rstlint.py. Fix also the two minor warnings which causes the buildbot slave to fail. (cherry picked from commit 2b501866ed493758e4c4b29f0ce9b24023d910a1) * Doc/Makefile: set PYTHON to python3 (#124) rstlint.py run by "make check" doesn't support Python 2. "make venv" runs "$(PYTHON) -m venv", whereas Python 2 doens't provide the venv module: it's a module of Python 3 standard library. (cherry picked from commit 91b0e7d0ca7c59df28f6a6fc1e8eb86a3925b76c) (cherry picked from commit b300c660d34d2027d443098ea605a8e0eb51d383) --- Doc/Makefile | 2 +- Doc/faq/windows.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile index 9ad7b86579d66c..b0800c15b5c80f 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -4,7 +4,7 @@ # # You can set these variables from the command line. -PYTHON = python +PYTHON = python3 SPHINXBUILD = sphinx-build PAPER = SOURCES = diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index b9b7b8d359bdf2..6ac83e45d2e815 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -300,9 +300,9 @@ this respect, and is easily configured to use spaces: Take :menuselection:`Tools --> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent size" to 4, and select the "Insert spaces" radio button. -Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs +Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs and spaces are causing problems in leading whitespace. -You may also run the :mod:`tabnanny` module to check a directory tree +You may also run the :mod:`tabnanny` module to check a directory tree in batch mode. From 760f596b6a4b5514afe35e521621f484aef35413 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 19 Feb 2017 10:03:50 +0530 Subject: [PATCH 014/220] [3.5] bpo-29571: Use correct locale encoding in test_re (#149) (#154) ``local.getlocale(locale.LC_CTYPE)`` and ``locale.getpreferredencoding(False)`` may give different answers in some cases (such as the ``en_IN`` locale). ``re.LOCALE`` uses the latter, so update the test case to match. --- Lib/test/test_re.py | 2 +- Misc/NEWS | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 9acd5abbfd7776..407f3468e86671 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1334,7 +1334,7 @@ def test_ascii_and_unicode_flag(self): def test_locale_flag(self): import locale - _, enc = locale.getlocale(locale.LC_CTYPE) + enc = locale.getpreferredencoding(False) # Search non-ASCII letter for i in range(128, 256): try: diff --git a/Misc/NEWS b/Misc/NEWS index fe50135c01615c..c750d5c952e6e9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -87,6 +87,14 @@ Documentation - Issue #29349: Fix Python 2 syntax in code for building the documentation. +Tests +----- + +- Issue #29571: to match the behaviour of the ``re.LOCALE`` flag, + test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` to + determine the candidate encoding for the test regex (allowing it to correctly + skip the test when the default locale encoding is a multi-byte encoding) + What's New in Python 3.5.3? =========================== From 24bfe15e83c24bf2c2e2654050da809553789002 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Sun, 19 Feb 2017 14:13:02 +0900 Subject: [PATCH 015/220] [backport to 3.5] bpo-29529: Add .travis.yml to 3.5 branch (#26) * Add .travis.yml to 3.5 branch * Only run CI checks when appropriate files have changed (#74) Closes python/core-workflow#14 * Travis CI: run rstlint.py in the docs job (#68) Currently, http://buildbot.python.org/all/buildslaves/ware-docs buildbot is only run as post-commit. For example, bpo-29521 (PR#41) introduced two warnings, unnotified by the Travis CI docs job. Modify the docs job to run toosl/rstlint.py. Fix also the two minor warnings which causes the buildbot slave to fail. * Use 'make check' instead of 'python3 tools/rstlint.py' (#96) --- .travis.yml | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000000..dc3a00d1f4b5a3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,104 @@ +language: c +dist: trusty +sudo: false +group: beta + +# To cache doc-building dependencies. +cache: pip + +os: + - linux + # macOS builds are disabled as the machines are under-provisioned on Travis, + # adding up to an extra hour completing a full CI run. + #- osx + +compiler: + - clang + - gcc + +env: + - TESTING=cpython + +matrix: + allow_failures: + - env: + - TESTING=coverage + include: + - os: linux + language: python + python: 3.5 + env: + - TESTING=docs + before_script: + - | + if git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '^Doc/' + then + echo "Docs weren't updated, stopping build process." + exit + fi + cd Doc + make venv PYTHON=python3 + script: + - make html SPHINXBUILD="./venv/bin/python3 -m sphinx" SPHINXOPTS="-q" + - make check + - os: linux + language: c + compiler: clang + env: + - TESTING=coverage + before_script: + - | + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + then + echo "Only docs were updated, stopping build process." + exit + fi + ./configure + make -s -j4 + # Need a venv that can parse covered code. + ./python -m venv venv + ./venv/bin/python -m pip install -U coverage + script: + # Skip tests that re-run the entire test suite. + - ./venv/bin/python -m coverage run --pylib -m test -uall -x test_multiprocessing_fork -x test_multiprocessing_forkserver -x test_multiprocessing_spawn + after_script: # Probably should be after_success once test suite updated to run under coverage.py. + # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. + - source ./venv/bin/activate + - bash <(curl -s https://codecov.io/bash) + - os: linux + language: cpp + compiler: clang + env: + - TESTING="C++ header compatibility" + before_script: + - ./configure + script: + - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . + +# Travis provides only 2 cores, so don't overdue the parallelism and waste memory. +before_script: + - | + if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.(rst|yml)$)|(^Doc)/' + then + echo "Only docs were updated, stopping build process." + exit + fi + ./configure --with-pydebug + make -j4 + +script: + # `-r -w` implicitly provided through `make buildbottest`. + - make buildbottest TESTOPTS="-j4" + +notifications: + email: false + irc: + channels: + # This is set to a secure variable to prevent forks from notifying the + # IRC channel whenever they fail a build. This can be removed when travis + # implements https://github.com/travis-ci/travis-ci/issues/1094. + # The actual value here is: irc.freenode.net#python-dev + - secure: "s7kAkpcom2yUJ8XqyjFI0obJmhAGrn1xmoivdaPdgBIA++X47TBp1x4pgDsbEsoalef7bEwa4l07KdT4qa+DOd/c4QxaWom7fbN3BuLVsZuVfODnl79+gYq/TAbGfyH+yDs18DXrUfPgwD7C5aW32ugsqAOd4iWzfGJQ5OrOZzqzGjYdYQUEkJFXgxDEIb4aHvxNDWGO3Po9uKISrhb5saQ0l776yLo1Ur7M4oxl8RTbCdgX0vf5TzPg52BgvZpOgt3DHOUYPeiJLKNjAE6ibg0U95sEvMfHX77nz4aFY4/3UI6FFaRla34rZ+mYKrn0TdxOhera1QOgPmM6HzdO4K44FpfK1DS0Xxk9U9/uApq+cG0bU3W+cVUHDBe5+90lpRBAXHeHCgT7TI8gec614aiT8lEr3+yH8OBRYGzkjNK8E2LJZ/SxnVxDe7aLF6AWcoWLfS6/ziAIBFQ5Nc4U72CT8fGVSkl8ywPiRlvixKdvTODMSZo0jMqlfZSNaAPTsNRx4wu5Uis4qekwe32Fz4aB6KGpsuuVjBi+H6v0RKxNJNGY3JKDiEH2TK0UE2auJ5GvLW48aUVFcQMB7euCWYXlSWVRHh3WLU8QXF29Dw4JduRZqUpOdRgMHU79UHRq+mkE0jAS/nBcS6CvsmxCpTSrfVYuMOu32yt18QQoTyU=" + on_success: change + on_failure: always + skip_join: true From f0174c69b7b8bd27ee32d96e890d665da29472af Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 20 Feb 2017 09:46:24 +0900 Subject: [PATCH 016/220] bpo-29520: doc: fix deprecation warning from 'defindex' template (GH-179) --- Doc/tools/templates/indexcontent.html | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Doc/tools/templates/indexcontent.html b/Doc/tools/templates/indexcontent.html index 1076c1f51b7d19..d795c0a5586bc8 100644 --- a/Doc/tools/templates/indexcontent.html +++ b/Doc/tools/templates/indexcontent.html @@ -1,5 +1,12 @@ -{% extends "defindex.html" %} -{% block tables %} +{% extends "layout.html" %} +{%- block htmltitle -%} +{{ shorttitle }} +{%- endblock -%} +{% block body %} +

{{ docstitle|e }}

+

+ {% trans %}Welcome! This is the documentation for Python {{ release }}.{% endtrans %} +

{% trans %}Parts of the documentation:{% endtrans %}

From 314a86bae2ecc5e22bc874ad8a1bb71eb732dda6 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 19 Feb 2017 18:58:20 -0800 Subject: [PATCH 017/220] Change some mercurial/ hg.python.org references. (#8) (#184) (cherry picked from commit b2ee40ed9c9041dcff9c898aa19aacf9ec60308a) --- Doc/faq/general.rst | 6 +++--- Lib/idlelib/help.html | 2 +- Tools/README | 2 +- Tools/importbench/README | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index f1e33afdabf8a5..8f6a907a8a2fda 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -159,7 +159,7 @@ How do I obtain a copy of the Python source? The latest Python source distribution is always available from python.org, at https://www.python.org/downloads/. The latest development sources can be obtained -via anonymous Mercurial access at https://hg.python.org/cpython. +at https://github.com/python/cpython/. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and @@ -222,8 +222,8 @@ releases are announced on the comp.lang.python and comp.lang.python.announce newsgroups and on the Python home page at https://www.python.org/; an RSS feed of news is available. -You can also access the development version of Python through Mercurial. See -https://docs.python.org/devguide/faq.html for details. +You can also access the development version of Python through Git. See +`The Python Developer's Guide `_ for details. How do I submit bug reports and patches for Python? diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index ffc03c4112f073..f10cd345e886c8 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -90,7 +90,7 @@

Navigation

25.5. IDLE

-

Source code: Lib/idlelib/

+

Source code: Lib/idlelib/


IDLE is Python’s Integrated Development and Learning Environment.

IDLE has the following features:

diff --git a/Tools/README b/Tools/README index 0d961de23d6cb8..edbf4fb83321ba 100644 --- a/Tools/README +++ b/Tools/README @@ -45,4 +45,4 @@ unittestgui A Tkinter based GUI test runner for unittest, with test discovery. -(*) A generic benchmark suite is maintained separately at http://hg.python.org/benchmarks/ +(*) A generic benchmark suite is maintained separately at https://github.com/python/performance diff --git a/Tools/importbench/README b/Tools/importbench/README index 81a5544a383b4c..6ba386c2b608d5 100644 --- a/Tools/importbench/README +++ b/Tools/importbench/README @@ -3,4 +3,4 @@ Importbench is a set of micro-benchmarks for various import scenarios. It should not be used as an overall benchmark of import performance, but rather an easy way to measure impact of possible code changes. For a real-world benchmark of import, use the normal_startup benchmark from -hg.python.org/benchmarks. +https://github.com/python/performance From 7c95a94c3ab41e4296e94335d66b2400ad16f052 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 20 Feb 2017 14:33:06 +0800 Subject: [PATCH 018/220] bpo-29347: Fix possibly dereferencing undefined pointers when creating weakref objects (#128) (#188) --- Misc/NEWS | 3 +++ Objects/weakrefobject.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index c750d5c952e6e9..52c87d88c72664 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-29347: Fixed possibly dereferencing undefined pointers + when creating weakref objects. + - bpo-29438: Fixed use-after-free problem in key sharing dict. - Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0]. diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 7e6f36458bc693..892798affe9fe2 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -24,6 +24,8 @@ init_weakref(PyWeakReference *self, PyObject *ob, PyObject *callback) { self->hash = -1; self->wr_object = ob; + self->wr_prev = NULL; + self->wr_next = NULL; Py_XINCREF(callback); self->wr_callback = callback; } From 66fa9d4205e0da672ed19a397069281a4b177af4 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 20 Feb 2017 20:29:30 +0900 Subject: [PATCH 019/220] bpo-24274: fix comment in dictobject.c (GH-194) --- Objects/dictobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 7299f36b2bf88c..e277ab87e7bfae 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -429,7 +429,7 @@ Christian Tismer. lookdict() is general-purpose, and may return NULL if (and only if) a comparison raises an exception (this was new in Python 2.5). lookdict_unicode() below is specialized to string keys, comparison of which can -never raise an exception; that function can never return NULL. +never raise an exception; that function must not return NULL for string key. lookdict_unicode_nodummy is further specialized for string keys that cannot be the value. For both, when the key isn't found a PyDictEntry* is returned From 0936a00fe035e3e52c30bcbc59668dc0f519ced6 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Mon, 20 Feb 2017 21:50:49 +0000 Subject: [PATCH 020/220] bpo-29602: fix signed zero handling in complex constructor. (#203) (#205) * Fix incorrect handling of signed zeros for complex-related classes. * Add Misc/NEWS entry. (cherry picked from commit 112ec38c15b388fe025ccb85369a584d218b1160) --- Lib/test/test_complex.py | 23 +++++++++++++++++++++++ Misc/NEWS | 4 ++++ Objects/complexobject.c | 6 +++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 403ee3bc580f0a..8d551a4fc54c05 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -385,6 +385,29 @@ def __complex__(self): self.assertAlmostEqual(complex(complex1(1j)), 2j) self.assertRaises(TypeError, complex, complex2(1j)) + @support.requires_IEEE_754 + def test_constructor_special_numbers(self): + class complex2(complex): + pass + for x in 0.0, -0.0, INF, -INF, NAN: + for y in 0.0, -0.0, INF, -INF, NAN: + with self.subTest(x=x, y=y): + z = complex(x, y) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex2(x, y) + self.assertIs(type(z), complex2) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex(complex2(x, y)) + self.assertIs(type(z), complex) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + z = complex2(complex(x, y)) + self.assertIs(type(z), complex2) + self.assertFloatsAreIdentical(z.real, x) + self.assertFloatsAreIdentical(z.imag, y) + def test_hash(self): for x in range(-30, 30): self.assertEqual(hash(x), hash(complex(x, 0))) diff --git a/Misc/NEWS b/Misc/NEWS index 52c87d88c72664..038233735f6c13 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-29602: Fix incorrect handling of signed zeros in complex constructor for + complex subclasses and for inputs having a __complex__ method. Patch + by Serhiy Storchaka. + - bpo-29347: Fixed possibly dereferencing undefined pointers when creating weakref objects. diff --git a/Objects/complexobject.c b/Objects/complexobject.c index d82c5eb9f1ea44..606c1011f4d5c2 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -1014,11 +1014,11 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } cr.real = PyFloat_AsDouble(tmp); - cr.imag = 0.0; /* Shut up compiler warning */ + cr.imag = 0.0; Py_DECREF(tmp); } if (i == NULL) { - ci.real = 0.0; + ci.real = cr.imag; } else if (PyComplex_Check(i)) { ci = ((PyComplexObject*)i)->cval; @@ -1040,7 +1040,7 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (ci_is_complex) { cr.real -= ci.imag; } - if (cr_is_complex) { + if (cr_is_complex && i != NULL) { ci.real += cr.imag; } return complex_subtype_from_doubles(type, cr.real, ci.real); From 9ab8eaf965cc75dfd6dbb195c77f9d2c1f33505f Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Tue, 21 Feb 2017 23:55:49 +0900 Subject: [PATCH 021/220] doc: fix compile error on "shoddy" example extension (GH-217) (cherry picked from commit fb8fe72fc593438f6a0b934c6ff2d9c4aa28673d) --- Doc/includes/setup.py | 1 + Doc/includes/shoddy.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/includes/setup.py b/Doc/includes/setup.py index b853d23b170985..a38a39de3e7c86 100644 --- a/Doc/includes/setup.py +++ b/Doc/includes/setup.py @@ -5,4 +5,5 @@ Extension("noddy2", ["noddy2.c"]), Extension("noddy3", ["noddy3.c"]), Extension("noddy4", ["noddy4.c"]), + Extension("shoddy", ["shoddy.c"]), ]) diff --git a/Doc/includes/shoddy.c b/Doc/includes/shoddy.c index 07a272124ceaba..0c6d412b3c4cda 100644 --- a/Doc/includes/shoddy.c +++ b/Doc/includes/shoddy.c @@ -31,7 +31,7 @@ Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) static PyTypeObject ShoddyType = { - PyObject_HEAD_INIT(NULL) + PyVarObject_HEAD_INIT(NULL, 0) "shoddy.Shoddy", /* tp_name */ sizeof(Shoddy), /* tp_basicsize */ 0, /* tp_itemsize */ From 6336f0d156feec0f109a8d01da108cf96e3d9c60 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 22 Feb 2017 04:55:03 +0300 Subject: [PATCH 022/220] bpo-29554: Improve docs for pstat module and profile. (#88) (#228) Clarify that methods take a string which is interpreted as a regex, not a regex object. Also clarify what the old `-1`, `0`, `1` and `2` options were. (cherry picked from commit 8fb1f6e039cbdeb333d83b7a62f0f37af4ce6e02) --- Doc/library/profile.rst | 7 ++++--- Lib/pstats.py | 13 ++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index 959d9b98a84691..bd67fe486abf77 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -444,9 +444,10 @@ Analysis of the profiler data is done using the :class:`~pstats.Stats` class. significant entries. Initially, the list is taken to be the complete set of profiled functions. Each restriction is either an integer (to select a count of lines), or a decimal fraction between 0.0 and 1.0 inclusive (to - select a percentage of lines), or a regular expression (to pattern match - the standard name that is printed. If several restrictions are provided, - then they are applied sequentially. For example:: + select a percentage of lines), or a string that will interpreted as a + regular expression (to pattern match the standard name that is printed). + If several restrictions are provided, then they are applied sequentially. + For example:: print_stats(.1, 'foo:') diff --git a/Lib/pstats.py b/Lib/pstats.py index d861413d4195f7..2c5bf981b85cf8 100644 --- a/Lib/pstats.py +++ b/Lib/pstats.py @@ -48,11 +48,14 @@ class Stats: printed. The sort_stats() method now processes some additional options (i.e., in - addition to the old -1, 0, 1, or 2). It takes an arbitrary number of - quoted strings to select the sort order. For example sort_stats('time', - 'name') sorts on the major key of 'internal function time', and on the - minor key of 'the name of the function'. Look at the two tables in - sort_stats() and get_sort_arg_defs(self) for more examples. + addition to the old -1, 0, 1, or 2 that are respectively interpreted as + 'stdname', 'calls', 'time', and 'cumulative'). It takes an arbitrary number + of quoted strings to select the sort order. + + For example sort_stats('time', 'name') sorts on the major key of 'internal + function time', and on the minor key of 'the name of the function'. Look at + the two tables in sort_stats() and get_sort_arg_defs(self) for more + examples. All methods return self, so you can string together commands like: Stats('foo', 'goo').strip_dirs().sort_stats('calls').\ From f802facf5605b0b88e3735456442a74055c2431b Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 22 Feb 2017 08:02:17 +0300 Subject: [PATCH 023/220] Add .codecov.yml (#210) (#229) (cherry picked from commit e9c0e5559bbadb164d7c57b5a47b5544746dcb89) --- .codecov.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000000000..fcf9df6a7a698e --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,35 @@ +codecov: + notify: + require_ci_to_pass: true +comment: off +ignore: + - "Doc/**/*" + - "Misc/*" + - "Mac/**/*" + - "PC/**/*" + - "PCbuild/**/*" + - "Tools/**/*" + - "Grammar/*" +coverage: + precision: 2 + range: + - 70.0 + - 100.0 + round: down + status: + changes: off + project: off + patch: + default: + target: 100% + only_pulls: true + threshold: 0.05 +parsers: + gcov: + branch_detection: + conditional: true + loop: true + macro: false + method: false + javascript: + enable_partials: false From 8fa7e22134ac9626b2188ff877f6aeecd3c9e618 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Wed, 22 Feb 2017 06:19:55 +0000 Subject: [PATCH 024/220] Fixed bpo-29565: Corrected ctypes passing of large structs by value on Windows AMD64. (#168) (#221) Fixed bpo-29565: Corrected ctypes passing of large structs by value. (cherry picked from commit a86339b83fbd0932e0529a3c91935e997a234582) --- Lib/ctypes/test/test_callbacks.py | 11 +++++++++++ Lib/ctypes/test/test_structures.py | 23 +++++++++++++++++++++++ Modules/_ctypes/_ctypes_test.c | 13 +++++++++++++ Modules/_ctypes/libffi_msvc/ffi.c | 10 ++++++++++ 4 files changed, 57 insertions(+) diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index 8eac58f0262caf..f622093df61da5 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -244,6 +244,7 @@ def callback(a, b, c, d, e): def test_callback_large_struct(self): class Check: pass + # This should mirror the structure in Modules/_ctypes/_ctypes_test.c class X(Structure): _fields_ = [ ('first', c_ulong), @@ -255,6 +256,11 @@ def callback(check, s): check.first = s.first check.second = s.second check.third = s.third + # See issue #29565. + # The structure should be passed by value, so + # any changes to it should not be reflected in + # the value passed + s.first = s.second = s.third = 0x0badf00d check = Check() s = X() @@ -275,6 +281,11 @@ def callback(check, s): self.assertEqual(check.first, 0xdeadbeef) self.assertEqual(check.second, 0xcafebabe) self.assertEqual(check.third, 0x0bad1dea) + # See issue #29565. + # Ensure that the original struct is unchanged. + self.assertEqual(s.first, check.first) + self.assertEqual(s.second, check.second) + self.assertEqual(s.third, check.third) ################################################################ diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index c4a651c9666d7c..0b9391a4dbb5a7 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -3,6 +3,7 @@ from ctypes.test import need_symbol from struct import calcsize import _testcapi +import _ctypes_test class SubclassesTest(unittest.TestCase): def test_subclass(self): @@ -394,6 +395,28 @@ class Z(Y): (1, 0, 0, 0, 0, 0)) self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7)) + def test_pass_by_value(self): + # This should mirror the structure in Modules/_ctypes/_ctypes_test.c + class X(Structure): + _fields_ = [ + ('first', c_ulong), + ('second', c_ulong), + ('third', c_ulong), + ] + + s = X() + s.first = 0xdeadbeef + s.second = 0xcafebabe + s.third = 0x0bad1dea + dll = CDLL(_ctypes_test.__file__) + func = dll._testfunc_large_struct_update_value + func.argtypes = (X,) + func.restype = None + func(s) + self.assertEqual(s.first, 0xdeadbeef) + self.assertEqual(s.second, 0xcafebabe) + self.assertEqual(s.third, 0x0bad1dea) + class PointerMemberTestCase(unittest.TestCase): def test(self): diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 3c7f89249a92b4..20e65d2c1aef2b 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -44,6 +44,19 @@ _testfunc_cbk_large_struct(Test in, void (*func)(Test)) func(in); } +/* + * See issue 29565. Update a structure passed by value; + * the caller should not see any change. + */ + +EXPORT(void) +_testfunc_large_struct_update_value(Test in) +{ + in.first = 0x0badf00d; + in.second = 0x0badf00d; + in.third = 0x0badf00d; +} + EXPORT(void)testfunc_array(int values[4]) { printf("testfunc_array %d %d %d %d\n", diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c index 1d82929f530220..91a27dce3f2575 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -239,6 +239,16 @@ ffi_call(/*@dependent@*/ ffi_cif *cif, break; #else case FFI_SYSV: + /* If a single argument takes more than 8 bytes, + then a copy is passed by reference. */ + for (unsigned i = 0; i < cif->nargs; i++) { + size_t z = cif->arg_types[i]->size; + if (z > 8) { + void *temp = alloca(z); + memcpy(temp, avalue[i], z); + avalue[i] = temp; + } + } /*@-usedef@*/ return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, fn); From 5010a77a4da76d8d3fd861a63a7f1ce8f0e9c520 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 22 Feb 2017 11:46:32 +0200 Subject: [PATCH 025/220] [3.5] bpo-29532: Altering a kwarg dictionary passed to functools.partial() no longer affects a partial object after creation. (#222) --- Lib/test/test_functools.py | 9 +++++++++ Misc/NEWS | 3 +++ Modules/_functoolsmodule.c | 5 ++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 9ccd0cafc489cf..a82ca7ab88c38f 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -80,6 +80,15 @@ def func(a=10, b=20): p(b=7) self.assertEqual(d, {'a':3}) + def test_kwargs_copy(self): + # Issue #29532: Altering a kwarg dictionary passed to a constructor + # should not affect a partial object after creation + d = {'a': 3} + p = self.partial(capture, **d) + self.assertEqual(p(), ((), {'a': 3})) + d['a'] = 5 + self.assertEqual(p(), ((), {'a': 3})) + def test_arg_combinations(self): # exercise special code paths for zero args in either partial # object or the caller diff --git a/Misc/NEWS b/Misc/NEWS index 038233735f6c13..a01d454ab78f7d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Extension Modules Library ------- +- bpo-29532: Altering a kwarg dictionary passed to functools.partial() + no longer affects a partial object after creation. + - Issue #28556: Various updates to typing module: typing.Counter, typing.ChainMap, improved ABC caching, etc. Original PRs by Jelle Zijlstra, Ivan Levkivskyi, Manuel Krebber, and Łukasz Langa. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index be0f5f9e652abc..0471d665e65a58 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -88,10 +88,13 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) if (kw == NULL) { pto->kw = PyDict_New(); } - else { + else if (Py_REFCNT(kw) == 1) { Py_INCREF(kw); pto->kw = kw; } + else { + pto->kw = PyDict_Copy(kw); + } } else { pto->kw = PyDict_Copy(pkw); From 0246422b974b1a0c50dd30b0e1a1138674ef87a5 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 23 Feb 2017 18:45:57 +0300 Subject: [PATCH 026/220] bpo-28814: Undeprecate inadvertently deprecated inspect functions. (#122) (#244) Nick Coghlan said on bpo-28814: > inspect.getargvalues() and inspect.formatargvalues() were deprecated > in Python 3.5 as part of implementing bpo-20438 > This is incorrect, as these are *frame* introspection related functions, > not callable introspection ones. The documentation and implementation > layout is confusing though, as they're interleaved with the callable > introspection operation This commit undeprecates these functions and adds a note to ignore previous deprecation notices. (cherry picked from commit 0899b9809547ec2894dcf88cf4bba732c5d47d0d) --- Doc/library/inspect.rst | 12 ++++-------- Doc/whatsnew/3.5.rst | 11 ++++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 62a3988ae02ea7..89263e7bec1795 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -875,10 +875,8 @@ Classes and functions are the names of the ``*`` and ``**`` arguments or ``None``. *locals* is the locals dictionary of the given frame. - .. deprecated:: 3.5 - Use :func:`signature` and - :ref:`Signature Object `, which provide a - better introspecting API for callables. + .. note:: + This function was inadvertently marked as deprecated in Python 3.5. .. function:: formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]]) @@ -914,10 +912,8 @@ Classes and functions :func:`getargvalues`. The format\* arguments are the corresponding optional formatting functions that are called to turn names and values into strings. - .. deprecated:: 3.5 - Use :func:`signature` and - :ref:`Signature Object `, which provide a - better introspecting API for callables. + .. note:: + This function was inadvertently marked as deprecated in Python 3.5. .. function:: getmro(cls) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index ab61d7a6d41256..39b6ee59ebdfa5 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -2327,11 +2327,12 @@ The :func:`inspect.getargspec` function is deprecated and scheduled to be removed in Python 3.6. (See :issue:`20438` for details.) The :mod:`inspect` :func:`~inspect.getfullargspec`, -:func:`~inspect.getargvalues`, :func:`~inspect.getcallargs`, -:func:`~inspect.getargvalues`, :func:`~inspect.formatargspec`, and -:func:`~inspect.formatargvalues` functions are deprecated in favor of -the :func:`inspect.signature` API. -(Contributed by Yury Selivanov in :issue:`20438`.) +:func:`~inspect.getcallargs`, and :func:`~inspect.formatargspec` functions are +deprecated in favor of the :func:`inspect.signature` API. (Contributed by Yury +Selivanov in :issue:`20438`.) + +:func:`~inspect.getargvalues` and :func:`~inspect.formatargvalues` functions +were inadvertently marked as deprecated with the release of Python 3.5.0. Use of :const:`re.LOCALE` flag with str patterns or :const:`re.ASCII` is now deprecated. (Contributed by Serhiy Storchaka in :issue:`22407`.) From fa30453568ae71861aa1928373bd76da4f3a33f6 Mon Sep 17 00:00:00 2001 From: Arne de Laat Date: Thu, 23 Feb 2017 17:16:56 +0100 Subject: [PATCH 027/220] bpo-28911: Clarify the behaviour of assert_called_once_with. (#254) (cherry picked from commit 9d56b34af2efc4e266bf3ae62da5cd2e422a42be) --- Doc/library/unittest.mock.rst | 11 ++++++----- Lib/unittest/mock.py | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 4b9dac402f9619..1169f0b5d3de66 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -275,14 +275,14 @@ the *new_callable* argument to :func:`patch`. .. method:: assert_called_once_with(*args, **kwargs) - Assert that the mock was called exactly once and with the specified - arguments. + Assert that the mock was called exactly once and that that call was + with the specified arguments. >>> mock = Mock(return_value=None) >>> mock('foo', bar='baz') >>> mock.assert_called_once_with('foo', bar='baz') - >>> mock('foo', bar='baz') - >>> mock.assert_called_once_with('foo', bar='baz') + >>> mock('other', bar='values') + >>> mock.assert_called_once_with('other', bar='values') Traceback (most recent call last): ... AssertionError: Expected 'mock' to be called once. Called 2 times. @@ -294,7 +294,8 @@ the *new_callable* argument to :func:`patch`. The assert passes if the mock has *ever* been called, unlike :meth:`assert_called_with` and :meth:`assert_called_once_with` that - only pass if the call is the most recent one. + only pass if the call is the most recent one, and in the case of + :meth:`assert_called_once_with` it must also be the only call. >>> mock = Mock(return_value=None) >>> mock(1, 2, arg='thing') diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 0512cca4e29ba4..9bc40bc2d15403 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -795,8 +795,8 @@ def _error_message(): def assert_called_once_with(_mock_self, *args, **kwargs): - """assert that the mock was called exactly once and with the specified - arguments.""" + """assert that the mock was called exactly once and that that call was + with the specified arguments.""" self = _mock_self if not self.call_count == 1: msg = ("Expected '%s' to be called once. Called %s times." % From e29741466df0cd01a49bf5ec3b1df3e2bad119a7 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 23 Feb 2017 15:02:43 -0800 Subject: [PATCH 028/220] bpo-29624: Adds purge step and layout test after uploading files. (#258) (#263) --- Tools/msi/uploadrelease.bat | 31 ++++++++++++++++++++++--------- Tools/msi/uploadrelease.proj | 32 +++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/Tools/msi/uploadrelease.bat b/Tools/msi/uploadrelease.bat index 4e319ce4c98ccb..670836be8c1c8b 100644 --- a/Tools/msi/uploadrelease.bat +++ b/Tools/msi/uploadrelease.bat @@ -9,6 +9,8 @@ set USER= set TARGET= set DRYRUN=false set NOGPG= +set PURGE_OPTION=/p:Purge=true +set NOTEST= :CheckOpts if "%1" EQU "-h" goto Help @@ -19,7 +21,11 @@ if "%1" EQU "--user" (set USER=%~2) && shift && shift && goto CheckOpts if "%1" EQU "-t" (set TARGET=%~2) && shift && shift && goto CheckOpts if "%1" EQU "--target" (set TARGET=%~2) && shift && shift && goto CheckOpts if "%1" EQU "--dry-run" (set DRYRUN=true) && shift && goto CheckOpts -if "%1" EQU "--no-gpg" (set NOGPG=true) && shift && goto CheckOpts +if "%1" EQU "--skip-gpg" (set NOGPG=true) && shift && goto CheckOpts +if "%1" EQU "--skip-purge" (set PURGE_OPTION=) && shift && godo CheckOpts +if "%1" EQU "--skip-test" (set NOTEST=true) && shift && godo CheckOpts +if "%1" EQU "-T" (set NOTEST=true) && shift && godo CheckOpts +if "%1" NEQ "" echo Unexpected argument "%1" & exit /B 1 if not defined PLINK where plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" if not defined PLINK where /R "%ProgramFiles(x86)%\PuTTY" plink > "%TEMP%\plink.loc" 2> nul && set /P PLINK= < "%TEMP%\plink.loc" & del "%TEMP%\plink.loc" @@ -35,7 +41,7 @@ echo Found pscp.exe at %PSCP% if defined NOGPG ( set GPG= - echo Skipping GPG signature generation because of --no-gpg + echo Skipping GPG signature generation because of --skip-gpg ) else ( if not defined GPG where gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" if not defined GPG where /R "%PCBUILD%..\externals\windows-installer" gpg2 > "%TEMP%\gpg.loc" 2> nul && set /P GPG= < "%TEMP%\gpg.loc" & del "%TEMP%\gpg.loc" @@ -45,8 +51,12 @@ if defined NOGPG ( call "%PCBUILD%env.bat" > nul 2> nul pushd "%D%" -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 -msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x86 %PURGE_OPTION% +msbuild /v:m /nologo uploadrelease.proj /t:Upload /p:Platform=x64 /p:IncludeDoc=false %PURGE_OPTION% +if not defined NOTEST ( + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x86 + msbuild /v:m /nologo uploadrelease.proj /t:Test /p:Platform=x64 +) msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x86 msbuild /v:m /nologo uploadrelease.proj /t:ShowHashes /p:Platform=x64 /p:IncludeDoc=false popd @@ -55,9 +65,12 @@ exit /B 0 :Help echo uploadrelease.bat --host HOST --user USERNAME [--target TARGET] [--dry-run] [-h] echo. -echo --host (-o) Specify the upload host (required) -echo --user (-u) Specify the user on the host (required) -echo --target (-t) Specify the target directory on the host -echo --dry-run Display commands and filenames without executing them -echo -h Display this help information +echo --host (-o) Specify the upload host (required) +echo --user (-u) Specify the user on the host (required) +echo --target (-t) Specify the target directory on the host +echo --dry-run Display commands and filenames without executing them +echo --skip-gpg Does not generate GPG signatures before uploading +echo --skip-purge Does not perform CDN purge after uploading +echo --skip-test (-T) Does not perform post-upload tests +echo -h Display this help information echo. diff --git a/Tools/msi/uploadrelease.proj b/Tools/msi/uploadrelease.proj index 0d472dea5428a0..305e84fc2d4b28 100644 --- a/Tools/msi/uploadrelease.proj +++ b/Tools/msi/uploadrelease.proj @@ -9,6 +9,7 @@ /srv/www.python.org/ftp/python true false + false @@ -64,7 +65,36 @@ echo. echo." /> - + + + + + + + + + + $(TEMP)\%(Filename)_source + $(TEMP)\%(Filename)_source\%(Filename)%(Extension) + $(TEMP)\%(Filename)_layout + $(OutputPath)\%(Filename)_layoutlog + $(OutputPath)\%(Filename)_layoutlog\%(Filename).log + + + + + + + + + + + + + + + From 66b5092fac4264efdc9c508a7dd425fa9833e147 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 24 Feb 2017 16:15:17 -0500 Subject: [PATCH 029/220] bpo-25008: Deprecate smtpd and point to aiosmtpd (#274) (#279) --- Doc/library/smtpd.rst | 6 ++++++ Misc/NEWS | 3 +++ 2 files changed, 9 insertions(+) diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index a096de006ee72a..4d5a0cebf6ea76 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -13,6 +13,12 @@ This module offers several classes to implement SMTP (email) servers. +.. seealso:: + + The `aiosmtpd `_ package is a recommended + replacement for this module. It is based on :mod:`asyncio` and provides a + more straightforward API. :mod:`smtpd` should be considered deprecated. + Several server implementations are present; one is a generic do-nothing implementation, which can be overridden, while the other two offer specific mail-sending strategies. diff --git a/Misc/NEWS b/Misc/NEWS index a01d454ab78f7d..e680b90ca8979e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -92,6 +92,9 @@ C API Documentation ------------- +- bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to + aiosmtpd, a third-party asyncio-based replacement. + - Issue #26355: Add canonical header link on each page to corresponding major version of the documentation. Patch by Matthias Bussonnier. From bc33cd4e7a36ed4c309807ca9a911ef955582710 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 24 Feb 2017 16:41:19 -0800 Subject: [PATCH 030/220] [3.5] bpo-28556: Update to typing: treat subscripted generics as proxies (GH-265) (GH-269) (cherry picked from commit abb3b8ad94d699c8560d94ee9bac9c917b382abe) (cherry picked from commit 365cb5bb9069273e6970c9d5d17ee2fe5003e7ac) --- Lib/test/test_typing.py | 35 +++++++++++++++++++++++++++++++++++ Lib/typing.py | 10 ++++++++++ 2 files changed, 45 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 64d8276658ee7f..f0070ec975791a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -674,6 +674,41 @@ class C(B[int]): c.bar = 'abc' self.assertEqual(c.__dict__, {'bar': 'abc'}) + def test_subscripted_generics_as_proxies(self): + T = TypeVar('T') + class C(Generic[T]): + x = 'def' + self.assertEqual(C[int].x, 'def') + self.assertEqual(C[C[int]].x, 'def') + C[C[int]].x = 'changed' + self.assertEqual(C.x, 'changed') + self.assertEqual(C[str].x, 'changed') + C[List[str]].z = 'new' + self.assertEqual(C.z, 'new') + self.assertEqual(C[Tuple[int]].z, 'new') + + self.assertEqual(C().x, 'changed') + self.assertEqual(C[Tuple[str]]().z, 'new') + + class D(C[T]): + pass + self.assertEqual(D[int].x, 'changed') + self.assertEqual(D.z, 'new') + D.z = 'from derived z' + D[int].x = 'from derived x' + self.assertEqual(C.x, 'changed') + self.assertEqual(C[int].z, 'new') + self.assertEqual(D.x, 'from derived x') + self.assertEqual(D[str].z, 'from derived z') + + def test_abc_registry_kept(self): + T = TypeVar('T') + class C(Generic[T]): ... + C.register(int) + self.assertIsInstance(1, C) + C[int] + self.assertIsInstance(1, C) + def test_false_subclasses(self): class MyMapping(MutableMapping[str, str]): pass self.assertNotIsInstance({}, MyMapping) diff --git a/Lib/typing.py b/Lib/typing.py index efe358faf20988..9a0f49099a3114 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1158,6 +1158,16 @@ def __copy__(self): self.__parameters__, self.__args__, self.__origin__, self.__extra__, self.__orig_bases__) + def __setattr__(self, attr, value): + # We consider all the subscripted genrics as proxies for original class + if ( + attr.startswith('__') and attr.endswith('__') or + attr.startswith('_abc_') + ): + super(GenericMeta, self).__setattr__(attr, value) + else: + super(GenericMeta, _gorg(self)).__setattr__(attr, value) + # Prevent checks for Generic to crash when defining Generic. Generic = None From 5023686f7ee69e9da07cda4b7da6691f19892111 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Feb 2017 22:33:51 -0800 Subject: [PATCH 031/220] [3.5] bpo-28929: Add to Misc/NEWS (GH-285) mention bpo-28929 in the Documentation section of What's New in Python 3.5.4 release candidate 1 --- Misc/NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index e680b90ca8979e..abd4e53ef449ca 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -92,6 +92,8 @@ C API Documentation ------------- +- bpo-28929: Link the documentation to its source file on GitHub. + - bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to aiosmtpd, a third-party asyncio-based replacement. From 4c784632f7cb5ede6df4b1b20cdfae155069a81b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Feb 2017 22:35:39 -0800 Subject: [PATCH 032/220] [3.5] Fix small typos in introduction and datastructures of tutorial (GH-272) (GH-299) (cherry picked from commit 5bd5b9d81322d2cb6edd5f3804a347f8b2e65a15) (cherry picked from commit 8c5e190d360b9f1a08c9fff249ae80d9c18007d5) (cherry picked from commit 53c1892dc3de1de612b1cf95dc7bf09f82c1babf) --- Doc/tutorial/datastructures.rst | 59 +++++++++++++++++---------------- Doc/tutorial/introduction.rst | 2 +- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index b39bdf4dfb288b..6140ece046b975 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -22,11 +22,11 @@ objects: Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. -.. method:: list.extend(L) +.. method:: list.extend(iterable) :noindex: - Extend the list by appending all the items in the given list. Equivalent to - ``a[len(a):] = L``. + Extend the list by appending all the items from the iterable. Equivalent to + ``a[len(a):] = iterable``. .. method:: list.insert(i, x) @@ -60,11 +60,16 @@ objects: Remove all items from the list. Equivalent to ``del a[:]``. -.. method:: list.index(x) +.. method:: list.index(x[, start[, end]]) :noindex: - Return the index in the list of the first item whose value is *x*. It is an - error if there is no such item. + Return zero-based index in the list of the first item whose value is *x*. + Raises a :exc:`ValueError` if there is no such item. + + The optional arguments *start* and *end* are interpreted as in the slice + notation and are used to limit the search to a particular subsequence of + the list. The returned index is computed relative to the beginning of the full + sequence rather than the *start* argument. .. method:: list.count(x) @@ -94,28 +99,26 @@ objects: An example that uses most of the list methods:: - >>> a = [66.25, 333, 333, 1, 1234.5] - >>> print(a.count(333), a.count(66.25), a.count('x')) - 2 1 0 - >>> a.insert(2, -1) - >>> a.append(333) - >>> a - [66.25, 333, -1, 333, 1, 1234.5, 333] - >>> a.index(333) - 1 - >>> a.remove(333) - >>> a - [66.25, -1, 333, 1, 1234.5, 333] - >>> a.reverse() - >>> a - [333, 1234.5, 1, 333, -1, 66.25] - >>> a.sort() - >>> a - [-1, 1, 66.25, 333, 333, 1234.5] - >>> a.pop() - 1234.5 - >>> a - [-1, 1, 66.25, 333, 333] + >>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] + >>> fruits.count('apple') + 2 + >>> fruits.count('tangerine') + 0 + >>> fruits.index('banana') + 3 + >>> fruits.index('banana', 4) # Find next banana starting a position 4 + 6 + >>> fruits.reverse() + >>> fruits + ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange'] + >>> fruits.append('grape') + >>> fruits + ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape'] + >>> fruits.sort() + >>> fruits + ['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear'] + >>> fruits.pop() + 'pear' You might have noticed that methods like ``insert``, ``remove`` or ``sort`` that only modify the list have no return value printed -- they return the default diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 214032917b477d..af277cec19bb7f 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -356,7 +356,7 @@ The built-in function :func:`len` returns the length of a string:: Information about string formatting with :meth:`str.format`. :ref:`old-string-formatting` - The old formatting operations invoked when strings and Unicode strings are + The old formatting operations invoked when strings are the left operand of the ``%`` operator are described in more detail here. From 6b585fddc9ad472d8c962aba26cf25809451b2b5 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 16:06:11 +0300 Subject: [PATCH 033/220] Fix unittest.mock._Call: don't ignore name (#307) Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter anymore. Patch written by Jiajun Huang. (cherry picked from commits 84b6fb0eea29b3b28a1a11124526b01ec0c9d17a and dea1536fd3a8424d537794cd53715df0989cbbe1) Conflicts: Misc/NEWS --- Lib/unittest/mock.py | 3 +-- Lib/unittest/test/testmock/testhelpers.py | 5 +++++ Misc/NEWS | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 9bc40bc2d15403..99658d47a35610 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1945,9 +1945,8 @@ class _Call(tuple): If the _Call has no name then it will match any name. """ - def __new__(cls, value=(), name=None, parent=None, two=False, + def __new__(cls, value=(), name='', parent=None, two=False, from_kall=True): - name = '' args = () kwargs = {} _len = len(value) diff --git a/Lib/unittest/test/testmock/testhelpers.py b/Lib/unittest/test/testmock/testhelpers.py index 34776347daa637..d2202a7b4132e9 100644 --- a/Lib/unittest/test/testmock/testhelpers.py +++ b/Lib/unittest/test/testmock/testhelpers.py @@ -306,6 +306,11 @@ def test_two_args_call(self): other_args = _Call(((1, 2), {'a': 3})) self.assertEqual(args, other_args) + def test_call_with_name(self): + self.assertEqual(_Call((), 'foo')[0], 'foo') + self.assertEqual(_Call((('bar', 'barz'),),)[0], '') + self.assertEqual(_Call((('bar', 'barz'), {'hello': 'world'}),)[0], '') + class SpecSignatureTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index abd4e53ef449ca..bab13da4342dc4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Extension Modules Library ------- +- Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter + anymore. Patch written by Jiajun Huang. + - bpo-29532: Altering a kwarg dictionary passed to functools.partial() no longer affects a partial object after creation. From 7963bed009c3b1800bfebd0aecad53960edec55c Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 26 Feb 2017 16:07:41 +0300 Subject: [PATCH 034/220] Backport recent .travis.yml changes (#309) Backported changes from master: * b52260d8bf392aa04c48b8c2467a4c034184de86 * 984eef7d6d78e1213d6ea99897343a5059a07c59 * 532519770dea5d353f0b0d718c8881a15c7542df * 91b0e7d0ca7c59df28f6a6fc1e8eb86a3925b76c (cherry picked from commit 05e1a32170dacfa3ffbbd9266c1cb461f96aabdf) --- .travis.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc3a00d1f4b5a3..27b63c6c08b376 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,11 @@ group: beta # To cache doc-building dependencies. cache: pip +branches: + only: + - master + - /^\d\.\d$/ + os: - linux # macOS builds are disabled as the machines are under-provisioned on Travis, @@ -20,6 +25,7 @@ env: - TESTING=cpython matrix: + fast_finish: true allow_failures: - env: - TESTING=coverage @@ -30,17 +36,10 @@ matrix: env: - TESTING=docs before_script: - - | - if git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '^Doc/' - then - echo "Docs weren't updated, stopping build process." - exit - fi - cd Doc - make venv PYTHON=python3 + - cd Doc + - make venv script: - - make html SPHINXBUILD="./venv/bin/python3 -m sphinx" SPHINXOPTS="-q" - - make check + - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q" - os: linux language: c compiler: clang From 63ed9bc94d8df45b16aee9b92f658ebb34aa1012 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 07:40:03 -0800 Subject: [PATCH 035/220] bpo-29648: import.rst: Add reference to create_module() (GH-290) (GH-315) (cherry picked from commit 46ce7599af82a929506baeaaee5c149970440c4c) --- 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 64302b89a84742..a981b873923dab 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -431,7 +431,7 @@ on the module object. If the method returns ``None``, the import machinery will create the new module itself. .. versionadded:: 3.4 - The create_module() method of loaders. + The :meth:`~importlib.abc.Loader.create_module` method of loaders. .. versionchanged:: 3.4 The :meth:`~importlib.abc.Loader.load_module` method was replaced by From 21c697fd1073d6ab59e2ba82ea80bc81b9c4125c Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 26 Feb 2017 07:44:36 -0800 Subject: [PATCH 036/220] bpo-22594: Add a link to the regex module in re documentation (GH-241) (GH-317) (cherry picked from commit ed6795e46f7653e23b862efad240a93453e7df97) --- Doc/library/re.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 1ca621eca6adee..6baac6f53d898c 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -42,6 +42,12 @@ module-level functions and methods on that don't require you to compile a regex object first, but miss some fine-tuning parameters. +.. seealso:: + + The third-party `regex `_ module, + which has an API compatible with the standard library :mod:`re` module, + but offers additional functionality and a more thorough Unicode support. + .. _re-syntax: From b7fb1e25c89a9eb85b95027f4167bc0977687c43 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Mon, 27 Feb 2017 04:35:00 +0900 Subject: [PATCH 037/220] bpo-29110: Fix file object leak in `aifc.open` (GH-311) (cherry picked from commit 03f68b6) (GH-162) (cherry picked from commit 5dc33ee) (GH-293) --- Lib/aifc.py | 37 +++++++++++++++++++++++++------------ Lib/test/test_aifc.py | 18 +++++++++++++++++- Misc/NEWS | 3 +++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py index 7ebdbeb68c1093..d5764a33d054a7 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -294,6 +294,8 @@ class Aifc_read: # _ssnd_chunk -- instantiation of a chunk class for the SSND chunk # _framesize -- size of one frame in the file + _file = None # Set here since __del__ checks it + def initfp(self, file): self._version = 0 self._convert = None @@ -335,9 +337,15 @@ def initfp(self, file): def __init__(self, f): if isinstance(f, str): - f = builtins.open(f, 'rb') - # else, assume it is an open file object already - self.initfp(f) + file_object = builtins.open(f, 'rb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + else: + # assume it is an open file object already + self.initfp(f) def __enter__(self): return self @@ -532,18 +540,23 @@ class Aifc_write: # _datalength -- the size of the audio samples written to the header # _datawritten -- the size of the audio samples actually written + _file = None # Set here since __del__ checks it + def __init__(self, f): if isinstance(f, str): - filename = f - f = builtins.open(f, 'wb') - else: - # else, assume it is an open file object already - filename = '???' - self.initfp(f) - if filename[-5:] == '.aiff': - self._aifc = 0 + file_object = builtins.open(f, 'wb') + try: + self.initfp(file_object) + except: + file_object.close() + raise + + # treat .aiff file extensions as non-compressed audio + if f.endswith('.aiff'): + self._aifc = 0 else: - self._aifc = 1 + # assume it is an open file object already + self.initfp(f) def initfp(self, file): self._file = file diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py index ab5143787b0d44..eaa24b63a26d68 100644 --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,5 +1,6 @@ -from test.support import findfile, TESTFN, unlink +from test.support import check_no_resource_warning, findfile, TESTFN, unlink import unittest +from unittest import mock from test import audiotests from audioop import byteswap import os @@ -150,6 +151,21 @@ def test_skipunknown(self): #This file contains chunk types aifc doesn't recognize. self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif')) + def test_close_opened_files_on_error(self): + non_aifc_file = findfile('pluck-pcm8.wav', subdir='audiodata') + with check_no_resource_warning(self): + with self.assertRaises(aifc.Error): + # Try opening a non-AIFC file, with the expectation that + # `aifc.open` will fail (without raising a ResourceWarning) + self.f = aifc.open(non_aifc_file, 'rb') + + # Aifc_write.initfp() won't raise in normal case. But some errors + # (e.g. MemoryError, KeyboardInterrupt, etc..) can happen. + with mock.patch.object(aifc.Aifc_write, 'initfp', + side_effect=RuntimeError): + with self.assertRaises(RuntimeError): + self.fout = aifc.open(TESTFN, 'wb') + def test_params_added(self): f = self.f = aifc.open(TESTFN, 'wb') f.aiff() diff --git a/Misc/NEWS b/Misc/NEWS index bab13da4342dc4..8a7e1b5cd9c16e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Extension Modules Library ------- +- bpo-29110: Fix file object leak in aifc.open() when file is given as a + filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. + - Issue #28961: Fix unittest.mock._Call helper: don't ignore the name parameter anymore. Patch written by Jiajun Huang. From 8400ae209b5fa3d3bdc39d3876eef13d1ea9a72a Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 27 Feb 2017 11:46:37 +0800 Subject: [PATCH 038/220] bpo-29376: Fix assertion error in threading._DummyThread.is_alive() (GH-329) --- Lib/test/test_threading.py | 3 +++ Lib/threading.py | 4 ++++ Misc/NEWS | 2 ++ 3 files changed, 9 insertions(+) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index b63050982ab694..83a99023d7a8ae 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -170,6 +170,9 @@ def f(mutex): mutex.acquire() self.assertIn(tid, threading._active) self.assertIsInstance(threading._active[tid], threading._DummyThread) + #Issue 29376 + self.assertTrue(threading._active[tid].is_alive()) + self.assertRegex(repr(threading._active[tid]), '_DummyThread') del threading._active[tid] # PyThreadState_SetAsyncExc() is a CPython-only gimmick, not (currently) diff --git a/Lib/threading.py b/Lib/threading.py index 06b7b9b4fac598..c40d3307b2f265 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1215,6 +1215,10 @@ def __init__(self): def _stop(self): pass + def is_alive(self): + assert not self._is_stopped and self._started.is_set() + return True + def join(self, timeout=None): assert False, "cannot join a dummy thread" diff --git a/Misc/NEWS b/Misc/NEWS index 8a7e1b5cd9c16e..635f413dc74be8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,8 @@ Extension Modules Library ------- +- bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). + - bpo-29110: Fix file object leak in aifc.open() when file is given as a filesystem path and is not in valid AIFF format. Patch by Anthony Zhang. From b945e0784f8b64f9dba41c47844cadf483168a0f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 27 Feb 2017 06:01:59 -0800 Subject: [PATCH 039/220] Asyncio documentation: remove `self` from method signatures (GH-334) (GH-336) (cherry picked from commit 091b84f23a2ff57e8320ebf6fdf889af39096ab9) --- Doc/library/asyncio-protocol.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index c0342f7f2f3ddc..e0d2b0f0b6e781 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -33,7 +33,7 @@ BaseTransport Base class for transports. - .. method:: close(self) + .. method:: close() Close the transport. If the transport has a buffer for outgoing data, buffered data will be flushed asynchronously. No more data @@ -41,7 +41,7 @@ BaseTransport protocol's :meth:`connection_lost` method will be called with :const:`None` as its argument. - .. method:: is_closing(self) + .. method:: is_closing() Return ``True`` if the transport is closing or is closed. @@ -248,7 +248,7 @@ BaseSubprocessTransport if it hasn't returned, similarly to the :attr:`subprocess.Popen.returncode` attribute. - .. method:: kill(self) + .. method:: kill() Kill the subprocess, as in :meth:`subprocess.Popen.kill`. From bc144f0abff2b36595171377ee847c0266596ab2 Mon Sep 17 00:00:00 2001 From: Martijn Pieters Date: Mon, 27 Feb 2017 16:07:27 +0000 Subject: [PATCH 040/220] bpo-28598: Support __rmod__ for RHS subclasses of str in % string formatting operations (#94) --- Lib/test/test_unicode.py | 9 +++++++++ Misc/NEWS | 3 +++ Python/ceval.c | 12 +++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 3136ea1a1bad3e..9dbded2d99c530 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1424,6 +1424,15 @@ def test_formatting_huge_precision(self): with self.assertRaises(ValueError): result = format_string % 2.34 + def test_issue28598_strsubclass_rhs(self): + # A subclass of str with an __rmod__ method should be able to hook + # into the % operator + class SubclassedStr(str): + def __rmod__(self, other): + return 'Success, self.__rmod__({!r}) was called'.format(other) + self.assertEqual('lhs %% %r' % SubclassedStr('rhs'), + "Success, self.__rmod__('lhs %% %r') was called") + @support.cpython_only def test_formatting_huge_precision_c_limits(self): from _testcapi import INT_MAX diff --git a/Misc/NEWS b/Misc/NEWS index 635f413dc74be8..fd25a5f325077e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- Issue #28598: Support __rmod__ for subclasses of str being called before + str.__mod__. Patch by Martijn Pieters. + - bpo-29602: Fix incorrect handling of signed zeros in complex constructor for complex subclasses and for inputs having a __complex__ method. Patch by Serhiy Storchaka. diff --git a/Python/ceval.c b/Python/ceval.c index 7b405188d38c66..d3239089284c48 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1545,9 +1545,15 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) TARGET(BINARY_MODULO) { PyObject *divisor = POP(); PyObject *dividend = TOP(); - PyObject *res = PyUnicode_CheckExact(dividend) ? - PyUnicode_Format(dividend, divisor) : - PyNumber_Remainder(dividend, divisor); + PyObject *res; + if (PyUnicode_CheckExact(dividend) && ( + !PyUnicode_Check(divisor) || PyUnicode_CheckExact(divisor))) { + /* fast path; string formatting, but not if the RHS is a str subclass + (see issue28598) */ + res = PyUnicode_Format(dividend, divisor); + } else { + res = PyNumber_Remainder(dividend, divisor); + } Py_DECREF(divisor); Py_DECREF(dividend); SET_TOP(res); From 0dadf56737f591c83d18db5e445960d39448583e Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Mon, 27 Feb 2017 21:25:29 +0300 Subject: [PATCH 041/220] bpo-29655: Fixed possible reference leaks in `import *`. (#301) (#349) Patch by Matthias Bussonnier. (cherry picked from commit 160edb43571311a3785785c1dfa784afc52d87be) --- Python/ceval.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Python/ceval.c b/Python/ceval.c index d3239089284c48..62badebca6502d 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2832,13 +2832,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) TARGET(IMPORT_STAR) { PyObject *from = POP(), *locals; int err; - if (PyFrame_FastToLocalsWithError(f) < 0) + if (PyFrame_FastToLocalsWithError(f) < 0) { + Py_DECREF(from); goto error; + } locals = f->f_locals; if (locals == NULL) { PyErr_SetString(PyExc_SystemError, "no locals found during 'import *'"); + Py_DECREF(from); goto error; } READ_TIMESTAMP(intr0); From df11ce6460fb13c251a7af9b12cd44cfe6ce7520 Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Wed, 1 Mar 2017 06:13:38 -0500 Subject: [PATCH 042/220] Disable mention-bot for maintenance branches (GH-369) --- .mention-bot | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .mention-bot diff --git a/.mention-bot b/.mention-bot new file mode 100644 index 00000000000000..cb53b993fb1e8a --- /dev/null +++ b/.mention-bot @@ -0,0 +1,3 @@ +{ + "findPotentialReviewers": false +} From 564ace834f23587937b325e3545abe3f17fdbd2a Mon Sep 17 00:00:00 2001 From: Donald Stufft Date: Thu, 2 Mar 2017 12:32:30 -0500 Subject: [PATCH 043/220] bpo-29697: Don't use OpenSSL <1.0.2 fallback on 1.1+ (GH-398) --- Modules/_ssl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index a79c3a888666eb..5f7693c2d886f3 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2418,12 +2418,12 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version) #endif -#ifndef OPENSSL_NO_ECDH +#if !defined(OPENSSL_NO_ECDH) && !defined(OPENSSL_VERSION_1_1) /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use prime256v1 by default. This is Apache mod_ssl's initialization policy, so we should be safe. OpenSSL 1.1 has it enabled by default. */ -#if defined(SSL_CTX_set_ecdh_auto) && !defined(OPENSSL_VERSION_1_1) +#if defined(SSL_CTX_set_ecdh_auto) SSL_CTX_set_ecdh_auto(self->ctx, 1); #else { From 8b73b6198bc0753c5ce6e8f91eb7bddc2bd42a73 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 21:40:57 -0500 Subject: [PATCH 044/220] bpo-29703: asyncio: Fix creating new event loops in child processes. (#411) --- Lib/asyncio/events.py | 8 +++++++- Lib/asyncio/test_utils.py | 5 ++++- Lib/test/test_asyncio/test_events.py | 22 ++++++++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 28a45fc3cc5aee..7b30b4c84ad9a7 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -11,6 +11,7 @@ import functools import inspect +import os import reprlib import socket import subprocess @@ -611,6 +612,9 @@ def new_event_loop(self): # A TLS for the running event loop, used by _get_running_loop. class _RunningLoop(threading.local): _loop = None + _pid = None + + _running_loop = _RunningLoop() @@ -620,7 +624,8 @@ def _get_running_loop(): This is a low-level function intended to be used by event loops. This function is thread-specific. """ - return _running_loop._loop + if _running_loop._pid == os.getpid(): + return _running_loop._loop def _set_running_loop(loop): @@ -629,6 +634,7 @@ def _set_running_loop(loop): This is a low-level function intended to be used by event loops. This function is thread-specific. """ + _running_loop._pid = os.getpid() _running_loop._loop = loop diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py index 9d32822fa9e451..fe90b9c29897f4 100644 --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -449,12 +449,15 @@ def new_test_loop(self, gen=None): self.set_event_loop(loop) return loop + def unpatch_get_running_loop(self): + events._get_running_loop = self._get_running_loop + def setUp(self): self._get_running_loop = events._get_running_loop events._get_running_loop = lambda: None def tearDown(self): - events._get_running_loop = self._get_running_loop + self.unpatch_get_running_loop() events.set_event_loop(None) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 28d92a9f4e3eac..802763bd11ff61 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1,6 +1,7 @@ """Tests for events.py.""" import collections.abc +import concurrent.futures import functools import gc import io @@ -57,6 +58,15 @@ def osx_tiger(): return version < (10, 5) +def _test_get_event_loop_new_process__sub_proc(): + async def doit(): + return 'hello' + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + return loop.run_until_complete(doit()) + + ONLYCERT = data_file('ssl_cert.pem') ONLYKEY = data_file('ssl_key.pem') SIGNED_CERTFILE = data_file('keycert3.pem') @@ -2181,6 +2191,18 @@ def tearDown(self): asyncio.set_child_watcher(None) super().tearDown() + def test_get_event_loop_new_process(self): + async def main(): + pool = concurrent.futures.ProcessPoolExecutor() + return await self.loop.run_in_executor( + pool, _test_get_event_loop_new_process__sub_proc) + + self.unpatch_get_running_loop() + + self.assertEqual( + self.loop.run_until_complete(main()), + 'hello') + if hasattr(selectors, 'KqueueSelector'): class KqueueEventLoopTests(UnixEventLoopTestsMixin, SubprocessTestsMixin, diff --git a/Misc/NEWS b/Misc/NEWS index fd25a5f325077e..32741ce1e7d958 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,9 @@ Extension Modules Library ------- +- bpo-29703: Fix asyncio to support instantiation of new event loops + in child processes. + - bpo-29376: Fix assertion error in threading._DummyThread.is_alive(). - bpo-29110: Fix file object leak in aifc.open() when file is given as a From 80fbacc9369c07daeea6a50a61d214820bb29874 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Thu, 2 Mar 2017 23:57:33 -0500 Subject: [PATCH 045/220] asyncio: Optimize _get_running_loop() to call getpid() only when there's a loop --- Lib/asyncio/events.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 7b30b4c84ad9a7..e85634e588f5a5 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -624,8 +624,9 @@ def _get_running_loop(): This is a low-level function intended to be used by event loops. This function is thread-specific. """ - if _running_loop._pid == os.getpid(): - return _running_loop._loop + running_loop = _running_loop._loop + if running_loop is not None and _running_loop._pid == os.getpid(): + return running_loop def _set_running_loop(loop): From 8c851fa3d3044d5bc53e9f931129f5987ece401d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 2 Mar 2017 21:50:46 -0800 Subject: [PATCH 046/220] bpo-29026: Clarify documentation of time.time (GH-34) (GH-418) (cherry picked from commit 23557d59b819f57800ddef0b1373acef8e024670) --- Doc/library/time.rst | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index e6626f262df48a..92e7ce0f6631a8 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -17,11 +17,23 @@ semantics of these functions varies among platforms. An explanation of some terminology and conventions is in order. +.. _epoch: + .. index:: single: epoch -* The :dfn:`epoch` is the point where the time starts. On January 1st of that - year, at 0 hours, the "time since the epoch" is zero. For Unix, the epoch is - 1970. To find out what the epoch is, look at ``gmtime(0)``. +* The :dfn:`epoch` is the point where the time starts, and is platform + dependent. For Unix, the epoch is January 1, 1970, 00:00:00 (UTC). + To find out what the epoch is on a given platform, look at + ``time.gmtime(0)``. + +.. _leap seconds: https://en.wikipedia.org/wiki/Leap_second + +.. index:: seconds since the epoch + +* The term :dfn:`seconds since the epoch` refers to the total number + of elapsed seconds since the epoch, typically excluding + `leap seconds`_. Leap seconds are excluded from this total on all + POSIX-compliant platforms. .. index:: single: Year 2038 @@ -463,7 +475,7 @@ The module defines the following functions and data items: (2) The range really is ``0`` to ``61``; value ``60`` is valid in - timestamps representing leap seconds and value ``61`` is supported + timestamps representing `leap seconds`_ and value ``61`` is supported for historical reasons. (3) @@ -572,12 +584,28 @@ The module defines the following functions and data items: .. function:: time() - Return the time in seconds since the epoch as a floating point number. + Return the time in seconds since the epoch_ as a floating point + number. The specific date of the epoch and the handling of + `leap seconds`_ is platform dependent. + On Windows and most Unix systems, the epoch is January 1, 1970, + 00:00:00 (UTC) and leap seconds are not counted towards the time + in seconds since the epoch. This is commonly referred to as + `Unix time `_. + To find out what the epoch is on a given platform, look at + ``gmtime(0)``. + Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a - lower value than a previous call if the system clock has been set back between - the two calls. + lower value than a previous call if the system clock has been set back + between the two calls. + + The number returned by :func:`.time` may be converted into a more common + time format (i.e. year, month, day, hour, etc...) in UTC by passing it to + :func:`gmtime` function or in local time by passing it to the + :func:`localtime` function. In both cases a + :class:`struct_time` object is returned, from which the components + of the calendar date may be accessed as attributes. .. data:: timezone From 0ad7b628edb95b29b630902842c500de5582e869 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 2 Mar 2017 21:56:28 -0800 Subject: [PATCH 047/220] getpass: update docstrings (GH-49) (GH-420) (cherry picked from commit baf7bb30a02aabde260143136bdf5b3738a1d409) --- Lib/getpass.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/getpass.py b/Lib/getpass.py index be511211585a48..36e17e4cb6965d 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -7,7 +7,6 @@ echoing of the password contents while reading. On Windows, the msvcrt module will be used. -On the Mac EasyDialogs.AskPassword is used, if available. """ From d0620bcd4eb8b7bb39d7aedc3e434585959c3177 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 3 Mar 2017 18:07:01 +0300 Subject: [PATCH 048/220] Add Python version since deprecation in base64 methods. (#33) (#430) Allow developers to not have to either test on N Python versions or looked through multiple versions of the docs to know whether they can easily update. (cherry picked from commit c643a967dd7d33ccefa5b61b38caf40b448057ce) --- Doc/library/base64.rst | 17 +++++++++++++---- Lib/base64.py | 6 ++++-- Lib/test/test_base64.py | 8 ++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 080d9d77ec984e..ceecf17cba23e3 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -237,14 +237,18 @@ The legacy interface: .. function:: decodebytes(s) - decodestring(s) Decode the :term:`bytes-like object` *s*, which must contain one or more lines of base64 encoded data, and return the decoded :class:`bytes`. - ``decodestring`` is a deprecated alias. .. versionadded:: 3.1 +.. function:: decodestring(s) + + Deprecated alias of :func:`decodebytes`. + + .. deprecated:: 3.1 + .. function:: encode(input, output) @@ -257,14 +261,19 @@ The legacy interface: .. function:: encodebytes(s) - encodestring(s) Encode the :term:`bytes-like object` *s*, which can contain arbitrary binary data, and return :class:`bytes` containing the base64-encoded data, with newlines (``b'\n'``) inserted after every 76 bytes of output, and ensuring that there is a trailing newline, as per :rfc:`2045` (MIME). - ``encodestring`` is a deprecated alias. + .. versionadded:: 3.1 + +.. function:: encodestring(s) + + Deprecated alias of :func:`encodebytes`. + + .. deprecated:: 3.1 An example usage of the module: diff --git a/Lib/base64.py b/Lib/base64.py index adaec1de61bf42..0dc64cffa1d24a 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -542,7 +542,8 @@ def encodebytes(s): def encodestring(s): """Legacy alias of encodebytes().""" import warnings - warnings.warn("encodestring() is a deprecated alias, use encodebytes()", + warnings.warn("encodestring() is a deprecated alias since 3.1, " + "use encodebytes()", DeprecationWarning, 2) return encodebytes(s) @@ -555,7 +556,8 @@ def decodebytes(s): def decodestring(s): """Legacy alias of decodebytes().""" import warnings - warnings.warn("decodestring() is a deprecated alias, use decodebytes()", + warnings.warn("decodestring() is a deprecated alias since Python 3.1, " + "use decodebytes()", DeprecationWarning, 2) return decodebytes(s) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index 4f86aaa0c0eb49..47547396b8cb54 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -18,6 +18,14 @@ def check_type_errors(self, f): 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") From f7f024a721d53978d03129e8eb5111d4f74534a9 Mon Sep 17 00:00:00 2001 From: "Seth M. Larson" Date: Thu, 2 Mar 2017 22:21:18 -0600 Subject: [PATCH 049/220] bpo-29704: Fix asyncio.SubprocessStreamProtocol closing (#405) --- Lib/asyncio/subprocess.py | 17 +++++++++++++++-- Lib/test/test_asyncio/test_subprocess.py | 24 ++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py index b2f5304f772121..4c85466859f8f0 100644 --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -24,6 +24,8 @@ def __init__(self, limit, loop): self._limit = limit self.stdin = self.stdout = self.stderr = None self._transport = None + self._process_exited = False + self._pipe_fds = [] def __repr__(self): info = [self.__class__.__name__] @@ -43,12 +45,14 @@ def connection_made(self, transport): self.stdout = streams.StreamReader(limit=self._limit, loop=self._loop) self.stdout.set_transport(stdout_transport) + self._pipe_fds.append(1) stderr_transport = transport.get_pipe_transport(2) if stderr_transport is not None: self.stderr = streams.StreamReader(limit=self._limit, loop=self._loop) self.stderr.set_transport(stderr_transport) + self._pipe_fds.append(2) stdin_transport = transport.get_pipe_transport(0) if stdin_transport is not None: @@ -86,9 +90,18 @@ def pipe_connection_lost(self, fd, exc): else: reader.set_exception(exc) + if fd in self._pipe_fds: + self._pipe_fds.remove(fd) + self._maybe_close_transport() + def process_exited(self): - self._transport.close() - self._transport = None + self._process_exited = True + self._maybe_close_transport() + + def _maybe_close_transport(self): + if len(self._pipe_fds) == 0 and self._process_exited: + self._transport.close() + self._transport = None class Process: diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py index bba688bb5a53c7..2e14a8a9735535 100644 --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -459,6 +459,30 @@ def test_popen_error(self): self.loop.run_until_complete(create) self.assertEqual(warns, []) + def test_read_stdout_after_process_exit(self): + @asyncio.coroutine + def execute(): + code = '\n'.join(['import sys', + 'for _ in range(64):', + ' sys.stdout.write("x" * 4096)', + 'sys.stdout.flush()', + 'sys.exit(1)']) + + fut = asyncio.create_subprocess_exec( + sys.executable, '-c', code, + stdout=asyncio.subprocess.PIPE, + loop=self.loop) + + process = yield from fut + while True: + data = yield from process.stdout.read(65536) + if data: + yield from asyncio.sleep(0.3, loop=self.loop) + else: + break + + self.loop.run_until_complete(execute()) + if sys.platform != 'win32': # Unix diff --git a/Misc/NEWS b/Misc/NEWS index 32741ce1e7d958..b17ad90a01398a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,9 @@ Extension Modules Library ------- +- bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before + all pipes are closed. + - bpo-29703: Fix asyncio to support instantiation of new event loops in child processes. From 6e965d9e78b278f2f720a932e7b149cb7d88bd72 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 3 Mar 2017 13:23:55 -0800 Subject: [PATCH 050/220] bpo-29709: Improve Boolean Operations documentation (#433) (#436) (cherry picked from commit 8eb531d9db0861e14222445fcaebe1a373bba170) --- Doc/library/stdtypes.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 71cb7f2643576e..6b23b3eb610657 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -108,11 +108,11 @@ Notes: (1) This is a short-circuit operator, so it only evaluates the second - argument if the first one is :const:`False`. + argument if the first one is false. (2) This is a short-circuit operator, so it only evaluates the second - argument if the first one is :const:`True`. + argument if the first one is true. (3) ``not`` has a lower priority than non-Boolean operators, so ``not a == b`` is From dd2000cbe475da48fdc94e8f05618e9f460077fd Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 3 Mar 2017 16:07:37 -0600 Subject: [PATCH 051/220] bpo-29572: Update Windows build to OpenSSL 1.0.2k (GH-443) --- Misc/NEWS | 5 +++++ PCbuild/get_externals.bat | 2 +- PCbuild/python.props | 2 +- PCbuild/readme.txt | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index b17ad90a01398a..47e3d05a1bef71 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -127,6 +127,11 @@ Tests determine the candidate encoding for the test regex (allowing it to correctly skip the test when the default locale encoding is a multi-byte encoding) +Build +----- + +- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. + What's New in Python 3.5.3? =========================== diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index 1c3cdee2c4bd84..dfaf5496a2b614 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -54,7 +54,7 @@ echo.Fetching external libraries... set libraries= set libraries=%libraries% bzip2-1.0.6 if NOT "%IncludeSSL%"=="false" set libraries=%libraries% nasm-2.11.06 -if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2j +if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k set libraries=%libraries% sqlite-3.8.11.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.4.2 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tk-8.6.4.2 diff --git a/PCbuild/python.props b/PCbuild/python.props index 1553731d1fece3..0a6fd2a6513826 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -46,7 +46,7 @@ $(ExternalsDir)sqlite-3.8.11.0\ $(ExternalsDir)bzip2-1.0.6\ $(ExternalsDir)xz-5.0.5\ - $(ExternalsDir)openssl-1.0.2j\ + $(ExternalsDir)openssl-1.0.2k\ $(opensslDir)include32 $(opensslDir)include64 $(ExternalsDir)\nasm-2.11.06\ diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 24620128ec98da..68579256f28b84 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -169,7 +169,7 @@ _lzma Homepage: http://tukaani.org/xz/ _ssl - Python wrapper for version 1.0.2j of the OpenSSL secure sockets + Python wrapper for version 1.0.2k of the OpenSSL secure sockets library, which is built by ssl.vcxproj Homepage: http://www.openssl.org/ From 4d0630d9d5ff4919caa463a64887f32d671eaab8 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 3 Mar 2017 14:47:22 -0800 Subject: [PATCH 052/220] bpo-26213: Document _UNPACK bytecodes and BUILD_MAP changes (GH-441) (cherry picked from commit 0705f66eb369aa6a6cdb699e24ff61e1ab2e0c56) --- Doc/library/dis.rst | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index f86725b6016b9b..186aab40f636f9 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -765,8 +765,59 @@ the more significant byte last. .. opcode:: BUILD_MAP (count) - Pushes a new dictionary object onto the stack. The dictionary is pre-sized - to hold *count* entries. + Pushes a new dictionary object onto the stack. Pops ``2 * count`` items + so that the dictionary holds *count* entries: + ``{..., TOS3: TOS2, TOS1: TOS}``. + + .. versionchanged:: 3.5 + The dictionary is created from stack items instead of creating an + empty dictionary pre-sized to hold *count* items. + + +.. opcode:: BUILD_TUPLE_UNPACK (count) + + 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)``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_LIST_UNPACK (count) + + This is similar to :opcode:`BUILD_TUPLE_UNPACK`, but pushes a list + instead of tuple. Implements iterable unpacking in list + displays ``[*x, *y, *z]``. + + .. 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 + + +.. opcode:: BUILD_MAP_UNPACK (count) + + 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}``. + + .. versionadded:: 3.5 + + +.. opcode:: BUILD_MAP_UNPACK_WITH_CALL (oparg) + + This is similar to :opcode:`BUILD_MAP_UNPACK`, + but is used for ``f(**x, **y, **z)`` call syntax. The lowest byte of + *oparg* is the count of mappings, the relative position of the + corresponding callable ``f`` is encoded in the second byte of *oparg*. + + .. versionadded:: 3.5 .. opcode:: LOAD_ATTR (namei) From cf445f10560483d38485204cf46ff1d0adcb4192 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 3 Mar 2017 21:32:23 -0800 Subject: [PATCH 053/220] bpo-27593: Updates Windows build to use information from git (#262) (#449) * bpo-27593: Updates Windows build to use information from git --- PCbuild/build.bat | 8 ++++---- PCbuild/pythoncore.vcxproj | 23 ++++++++++++----------- Tools/msi/buildrelease.bat | 4 ++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 9e63a84bde4570..1dbe888972f4c5 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -105,9 +105,9 @@ if "%platf%"=="x64" ( ) ) -if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc" -if exist "%HG%" set HGProperty=/p:HG="%HG%" -if not exist "%HG%" echo Cannot find Mercurial on PATH & set HGProperty= +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" +if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= rem Setup the environment call "%dir%env.bat" %vs_platf% >nul @@ -145,7 +145,7 @@ msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ /p:Configuration=%conf% /p:Platform=%platf%^ /p:IncludeExternals=%IncludeExternals%^ /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ - /p:UseTestMarker=%UseTestMarker% %HGProperty%^ + /p:UseTestMarker=%UseTestMarker% %GITProperty%^ %1 %2 %3 %4 %5 %6 %7 %8 %9 @echo off diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 970344fd123308..ed16e73ac51861 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -400,23 +400,24 @@ - hg - <_HG>$(HG) - <_HG Condition="$(HG.Contains(` `))">"$(HG)" + git + <_GIT>$(GIT) + <_GIT Condition="$(GIT.Contains(` `))">"$(GIT)" - + - - - + + + - $([System.IO.File]::ReadAllText('$(IntDir)hgbranch.txt').Trim()) - $([System.IO.File]::ReadAllText('$(IntDir)hgversion.txt').Trim()) - $([System.IO.File]::ReadAllText('$(IntDir)hgtag.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) + $([System.IO.File]::ReadAllText('$(IntDir)gittag.txt').Trim()) + - HGVERSION="$(HgVersion)";HGTAG="$(HgTag)";HGBRANCH="$(HgBranch)";%(PreprocessorDefinitions) + GITVERSION="$(GitVersion)";GITTAG="$(GitTag)";GITBRANCH="$(GitBranch)";%(PreprocessorDefinitions) diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index f296e613ac19f6..706febf2534f71 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -64,8 +64,8 @@ if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1 if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1) -if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc" -if not exist "%HG%" echo Cannot find Mercurial on PATH && exit /B 1 +if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" +if not exist "%GIT%" echo Cannot find Git on PATH && exit /B 1 call "%D%get_externals.bat" From 2df52acce2471f6ee27cdcd5f525538abbc13313 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 3 Mar 2017 21:58:48 -0800 Subject: [PATCH 054/220] Fixes git command (#451) (#453) --- PCbuild/pythoncore.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index ed16e73ac51861..b7e0f3cec534d4 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -408,7 +408,7 @@ - + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) From a2edd3ae4074952ce77d9319da2dbb2a47300c27 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sat, 4 Mar 2017 01:34:19 -0500 Subject: [PATCH 055/220] [3.5] bpo-27593: Get SCM build info from git instead of hg. (#446) (#454) (#455) * bpo-27593: Get SCM build info from git instead of hg. (#446) sys.version and the platform module python_build(), python_branch(), and python_revision() functions now use git information rather than hg when building from a repo. Based on original patches by Brett Cannon and Steve Dower. (cherry picked from commit 5c4b0d063aba0a68c325073f5f312a2c9f40d178) (cherry picked from commit 95c50e5aed9e5683676e18349dd94b11901a66b3) --- Include/pylifecycle.h | 4 ++-- Lib/platform.py | 4 +++- Lib/test/test_platform.py | 12 +++++----- Makefile.pre.in | 12 +++++----- Misc/NEWS | 5 ---- Modules/getbuildinfo.c | 46 ++++++++++++++++++------------------- Python/sysmodule.c | 6 ++--- configure | 48 +++++++++++++++++++-------------------- configure.ac | 26 ++++++++++----------- 9 files changed, 80 insertions(+), 83 deletions(-) diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index ccdebe26a4887b..1c5f7a63743fb4 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -69,8 +69,8 @@ PyAPI_FUNC(const char *) Py_GetCopyright(void); PyAPI_FUNC(const char *) Py_GetCompiler(void); PyAPI_FUNC(const char *) Py_GetBuildInfo(void); #ifndef Py_LIMITED_API -PyAPI_FUNC(const char *) _Py_hgidentifier(void); -PyAPI_FUNC(const char *) _Py_hgversion(void); +PyAPI_FUNC(const char *) _Py_gitidentifier(void); +PyAPI_FUNC(const char *) _Py_gitversion(void); #endif /* Internal -- various one-time initializations */ diff --git a/Lib/platform.py b/Lib/platform.py index 3e726a7856ff98..d3ed5bf4c50758 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -1199,7 +1199,9 @@ def _sys_version(sys_version=None): elif buildtime: builddate = builddate + ' ' + buildtime - if hasattr(sys, '_mercurial'): + if hasattr(sys, '_git'): + _, branch, revision = sys._git + elif hasattr(sys, '_mercurial'): _, branch, revision = sys._mercurial elif hasattr(sys, 'subversion'): # sys.subversion was added in Python 2.5 diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 18de110ecb4601..e16b9fa08ca3ed 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -66,12 +66,12 @@ def test_processor(self): def setUp(self): self.save_version = sys.version - self.save_mercurial = sys._mercurial + self.save_git = sys._git self.save_platform = sys.platform def tearDown(self): sys.version = self.save_version - sys._mercurial = self.save_mercurial + sys._git = self.save_git sys.platform = self.save_platform def test_sys_version(self): @@ -101,7 +101,7 @@ def test_sys_version(self): ('CPython', '2.4.3', '', '', 'truncation', '', 'GCC')), ): # branch and revision are not "parsed", but fetched - # from sys._mercurial. Ignore them + # from sys._git. Ignore them (name, version, branch, revision, buildno, builddate, compiler) \ = platform._sys_version(input) self.assertEqual( @@ -148,10 +148,10 @@ def test_sys_version(self): sys_versions.items(): sys.version = version_tag if subversion is None: - if hasattr(sys, "_mercurial"): - del sys._mercurial + if hasattr(sys, "_git"): + del sys._git else: - sys._mercurial = subversion + sys._git = subversion if sys_platform is not None: sys.platform = sys_platform self.assertEqual(platform.python_implementation(), info[0]) diff --git a/Makefile.pre.in b/Makefile.pre.in index dc0a40e237d2f1..e1436c3bfdca91 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -41,9 +41,9 @@ RANLIB= @RANLIB@ READELF= @READELF@ SOABI= @SOABI@ LDVERSION= @LDVERSION@ -HGVERSION= @HGVERSION@ -HGTAG= @HGTAG@ -HGBRANCH= @HGBRANCH@ +GITVERSION= @GITVERSION@ +GITTAG= @GITTAG@ +GITBRANCH= @GITBRANCH@ PGO_PROF_GEN_FLAG=@PGO_PROF_GEN_FLAG@ PGO_PROF_USE_FLAG=@PGO_PROF_USE_FLAG@ LLVM_PROF_MERGER=@LLVM_PROF_MERGER@ @@ -739,9 +739,9 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \ $(MODOBJS) \ $(srcdir)/Modules/getbuildinfo.c $(CC) -c $(PY_CORE_CFLAGS) \ - -DHGVERSION="\"`LC_ALL=C $(HGVERSION)`\"" \ - -DHGTAG="\"`LC_ALL=C $(HGTAG)`\"" \ - -DHGBRANCH="\"`LC_ALL=C $(HGBRANCH)`\"" \ + -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ + -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ + -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ -o $@ $(srcdir)/Modules/getbuildinfo.c Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile diff --git a/Misc/NEWS b/Misc/NEWS index 47e3d05a1bef71..b17ad90a01398a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -127,11 +127,6 @@ Tests determine the candidate encoding for the test regex (allowing it to correctly skip the test when the default locale encoding is a multi-byte encoding) -Build ------ - -- bpo-29572: Update Windows build and OS X installers to use OpenSSL 1.0.2k. - What's New in Python 3.5.3? =========================== diff --git a/Modules/getbuildinfo.c b/Modules/getbuildinfo.c index 0971a64fccbadc..5f941a26e1d54c 100644 --- a/Modules/getbuildinfo.c +++ b/Modules/getbuildinfo.c @@ -21,47 +21,47 @@ #endif /* XXX Only unix build process has been tested */ -#ifndef HGVERSION -#define HGVERSION "" +#ifndef GITVERSION +#define GITVERSION "" #endif -#ifndef HGTAG -#define HGTAG "" +#ifndef GITTAG +#define GITTAG "" #endif -#ifndef HGBRANCH -#define HGBRANCH "" +#ifndef GITBRANCH +#define GITBRANCH "" #endif const char * Py_GetBuildInfo(void) { - static char buildinfo[50 + sizeof(HGVERSION) + - ((sizeof(HGTAG) > sizeof(HGBRANCH)) ? - sizeof(HGTAG) : sizeof(HGBRANCH))]; - const char *revision = _Py_hgversion(); + static char buildinfo[50 + sizeof(GITVERSION) + + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ? + sizeof(GITTAG) : sizeof(GITBRANCH))]; + const char *revision = _Py_gitversion(); const char *sep = *revision ? ":" : ""; - const char *hgid = _Py_hgidentifier(); - if (!(*hgid)) - hgid = "default"; + const char *gitid = _Py_gitidentifier(); + if (!(*gitid)) + gitid = "default"; PyOS_snprintf(buildinfo, sizeof(buildinfo), - "%s%s%s, %.20s, %.9s", hgid, sep, revision, + "%s%s%s, %.20s, %.9s", gitid, sep, revision, DATE, TIME); return buildinfo; } const char * -_Py_hgversion(void) +_Py_gitversion(void) { - return HGVERSION; + return GITVERSION; } const char * -_Py_hgidentifier(void) +_Py_gitidentifier(void) { - const char *hgtag, *hgid; - hgtag = HGTAG; - if ((*hgtag) && strcmp(hgtag, "tip") != 0) - hgid = hgtag; + const char *gittag, *gitid; + gittag = GITTAG; + if ((*gittag) && strcmp(gittag, "undefined") != 0) + gitid = gittag; else - hgid = HGBRANCH; - return hgid; + gitid = GITBRANCH; + return gitid; } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 1dc7d7cf6beb6c..fc769ad1d8c1d2 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1816,9 +1816,9 @@ _PySys_Init(void) PyUnicode_FromString(Py_GetVersion())); SET_SYS_FROM_STRING("hexversion", PyLong_FromLong(PY_VERSION_HEX)); - SET_SYS_FROM_STRING("_mercurial", - Py_BuildValue("(szz)", "CPython", _Py_hgidentifier(), - _Py_hgversion())); + SET_SYS_FROM_STRING("_git", + Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(), + _Py_gitversion())); SET_SYS_FROM_STRING("dont_write_bytecode", PyBool_FromLong(Py_DontWriteBytecodeFlag)); SET_SYS_FROM_STRING("api_version", diff --git a/configure b/configure index 1f84647ce1913a..640cad7c4aa45a 100755 --- a/configure +++ b/configure @@ -757,10 +757,10 @@ build_os build_vendor build_cpu build -HAS_HG -HGBRANCH -HGTAG -HGVERSION +HAS_GIT +GITBRANCH +GITTAG +GITVERSION BASECPPFLAGS target_alias host_alias @@ -2839,17 +2839,17 @@ fi -if test -e $srcdir/.hg/dirstate +if test -e $srcdir/.git/HEAD then -# Extract the first word of "hg", so it can be a program name with args. -set dummy hg; ac_word=$2 +# Extract the first word of "git", so it can be a program name with args. +set dummy git; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAS_HG+:} false; then : +if ${ac_cv_prog_HAS_GIT+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$HAS_HG"; then - ac_cv_prog_HAS_HG="$HAS_HG" # Let the user override the test. + if test -n "$HAS_GIT"; then + ac_cv_prog_HAS_GIT="$HAS_GIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -2858,7 +2858,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_HAS_HG="found" + ac_cv_prog_HAS_GIT="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -2866,13 +2866,13 @@ done done IFS=$as_save_IFS - test -z "$ac_cv_prog_HAS_HG" && ac_cv_prog_HAS_HG="not-found" + test -z "$ac_cv_prog_HAS_GIT" && ac_cv_prog_HAS_GIT="not-found" fi fi -HAS_HG=$ac_cv_prog_HAS_HG -if test -n "$HAS_HG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_HG" >&5 -$as_echo "$HAS_HG" >&6; } +HAS_GIT=$ac_cv_prog_HAS_GIT +if test -n "$HAS_GIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAS_GIT" >&5 +$as_echo "$HAS_GIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -2880,17 +2880,17 @@ fi else -HAS_HG=no-repository +HAS_GIT=no-repository fi -if test $HAS_HG = found +if test $HAS_GIT = found then - HGVERSION="hg id -i \$(srcdir)" - HGTAG="hg id -t \$(srcdir)" - HGBRANCH="hg id -b \$(srcdir)" + GITVERSION="git -C \$(srcdir) rev-parse HEAD" + GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else - HGVERSION="" - HGTAG="" - HGBRANCH="" + GITVERSION="" + GITTAG="" + GITBRANCH="" fi diff --git a/configure.ac b/configure.ac index 49d1a37e5ac2bc..4682341723f038 100644 --- a/configure.ac +++ b/configure.ac @@ -25,25 +25,25 @@ else BASECPPFLAGS="" fi -AC_SUBST(HGVERSION) -AC_SUBST(HGTAG) -AC_SUBST(HGBRANCH) +AC_SUBST(GITVERSION) +AC_SUBST(GITTAG) +AC_SUBST(GITBRANCH) -if test -e $srcdir/.hg/dirstate +if test -e $srcdir/.git/HEAD then -AC_CHECK_PROG(HAS_HG, hg, found, not-found) +AC_CHECK_PROG(HAS_GIT, git, found, not-found) else -HAS_HG=no-repository +HAS_GIT=no-repository fi -if test $HAS_HG = found +if test $HAS_GIT = found then - HGVERSION="hg id -i \$(srcdir)" - HGTAG="hg id -t \$(srcdir)" - HGBRANCH="hg id -b \$(srcdir)" + GITVERSION="git -C \$(srcdir) rev-parse HEAD" + GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else - HGVERSION="" - HGTAG="" - HGBRANCH="" + GITVERSION="" + GITTAG="" + GITBRANCH="" fi AC_CONFIG_SRCDIR([Include/object.h]) From 5789e415e82f91563f62ae08b47f1a264048a72b Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 4 Mar 2017 15:40:36 -0800 Subject: [PATCH 056/220] Correct spelling "instanciate" (GH-465) (GH-468) (cherry picked from commit 6abaed0ddaa1dd9be727ede09f6cd801c467c2ec) --- Doc/library/asyncio-subprocess.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index dc93a74c6dee12..16ba9a3cd6c7f2 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -80,7 +80,7 @@ Run subprocesses asynchronously using the :mod:`subprocess` module. however, where :class:`~subprocess.Popen` takes a single argument which is list of strings, :func:`subprocess_exec` takes multiple string arguments. - The *protocol_factory* must instanciate a subclass of the + The *protocol_factory* must instantiate a subclass of the :class:`asyncio.SubprocessProtocol` class. Other parameters: @@ -123,7 +123,7 @@ Run subprocesses asynchronously using the :mod:`subprocess` module. using the platform's "shell" syntax. This is similar to the standard library :class:`subprocess.Popen` class called with ``shell=True``. - The *protocol_factory* must instanciate a subclass of the + The *protocol_factory* must instantiate a subclass of the :class:`asyncio.SubprocessProtocol` class. See :meth:`~AbstractEventLoop.subprocess_exec` for more details about From 171b674c8bf63153482e7e23e97c57c8b9182466 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 4 Mar 2017 16:44:30 -0800 Subject: [PATCH 057/220] distutils docs: Fix a typo (GH-470) (#472) (cherry picked from commit 2a7bddaab7d6e1f7b243cdbb4fa6f6c8e266b18d) --- Doc/distutils/examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst index 1f5be9cdb29a97..4e2761d8a7d046 100644 --- a/Doc/distutils/examples.rst +++ b/Doc/distutils/examples.rst @@ -321,7 +321,7 @@ You can read back this static file, by using the >>> metadata.description 'Easily download, build, install, upgrade, and uninstall Python packages' -Notice that the class can also be instanciated with a metadata file path to +Notice that the class can also be instantiated with a metadata file path to loads its values:: >>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info' From c6e199f2e9a2514c3fd220aaa4bd23fa1d6da8c9 Mon Sep 17 00:00:00 2001 From: Petr Motejlek Date: Sun, 5 Mar 2017 17:14:26 +0100 Subject: [PATCH 058/220] bpo-29615: backport to 3.5 (#479) --- Lib/test/test_xmlrpc.py | 90 ++++++++++++++++++++++++++++++++++++++++- Lib/xmlrpc/server.py | 43 +++++++++++--------- Misc/NEWS | 4 ++ 3 files changed, 117 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 02d9f5c650c6f3..7e023c16733196 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -295,6 +295,94 @@ def run_server(): self.assertEqual(p.method(), 5) self.assertEqual(p.method(), 5) + +class SimpleXMLRPCDispatcherTestCase(unittest.TestCase): + class DispatchExc(Exception): + """Raised inside the dispatched functions when checking for + chained exceptions""" + + def test_call_registered_func(self): + """Calls explicitly registered function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_params = 1, 2, 3 + + def dispatched_func(*params): + raise self.DispatchExc(params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_function(dispatched_func) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch('dispatched_func', exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_params,)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_call_instance_func(self): + """Calls a registered instance attribute as a function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_params = 1, 2, 3 + + class DispatchedClass: + def dispatched_func(self, *params): + raise SimpleXMLRPCDispatcherTestCase.DispatchExc(params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(DispatchedClass()) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch('dispatched_func', exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_params,)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_call_dispatch_func(self): + """Calls the registered instance's `_dispatch` function""" + # Makes sure any exception raised inside the function has no other + # exception chained to it + + exp_method = 'method' + exp_params = 1, 2, 3 + + class TestInstance: + def _dispatch(self, method, params): + raise SimpleXMLRPCDispatcherTestCase.DispatchExc( + method, params) + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(TestInstance()) + with self.assertRaises(self.DispatchExc) as exc_ctx: + dispatcher._dispatch(exp_method, exp_params) + self.assertEqual(exc_ctx.exception.args, (exp_method, exp_params)) + self.assertIsNone(exc_ctx.exception.__cause__) + self.assertIsNone(exc_ctx.exception.__context__) + + def test_registered_func_is_none(self): + """Calls explicitly registered function which is None""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_function(None, name='method') + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + def test_instance_has_no_func(self): + """Attempts to call nonexistent function on a registered instance""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + dispatcher.register_instance(object()) + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + def test_cannot_locate_func(self): + """Calls a function that the dispatcher cannot locate""" + + dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() + with self.assertRaises(Exception, expected_regex='method'): + dispatcher._dispatch('method', ('param',)) + + class HelperTestCase(unittest.TestCase): def test_escape(self): self.assertEqual(xmlrpclib.escape("a&b"), "a&b") @@ -1265,7 +1353,7 @@ def test_main(): KeepaliveServerTestCase1, KeepaliveServerTestCase2, GzipServerTestCase, GzipUtilTestCase, MultiPathServerTestCase, ServerProxyTestCase, FailingServerTestCase, - CGIHandlerTestCase) + CGIHandlerTestCase, SimpleXMLRPCDispatcherTestCase) if __name__ == "__main__": diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 781769323272c7..276394dfbf33d4 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -386,31 +386,36 @@ def _dispatch(self, method, params): not be called. """ - func = None try: - # check to see if a matching function has been registered + # call the matching registered function func = self.funcs[method] except KeyError: - if self.instance is not None: - # check for a _dispatch method - if hasattr(self.instance, '_dispatch'): - return self.instance._dispatch(method, params) - else: - # call instance method directly - try: - func = resolve_dotted_attribute( - self.instance, - method, - self.allow_dotted_names - ) - except AttributeError: - pass - - if func is not None: - return func(*params) + pass else: + if func is not None: + return func(*params) raise Exception('method "%s" is not supported' % method) + if self.instance is not None: + if hasattr(self.instance, '_dispatch'): + # call the `_dispatch` method on the instance + return self.instance._dispatch(method, params) + + # call the instance's method directly + try: + func = resolve_dotted_attribute( + self.instance, + method, + self.allow_dotted_names + ) + except AttributeError: + pass + else: + if func is not None: + return func(*params) + + raise Exception('method "%s" is not supported' % method) + class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler): """Simple XML-RPC request handler class. diff --git a/Misc/NEWS b/Misc/NEWS index b17ad90a01398a..03f8286f080ba6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,10 @@ Extension Modules Library ------- +- bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other + exception) to exception(s) raised in the dispatched methods. + Patch by Petr Motejlek. + - bpo-29704: asyncio.subprocess.SubprocessStreamProtocol no longer closes before all pipes are closed. From 997cc69a6832be4818491e0462896d9572bf71b0 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Sun, 5 Mar 2017 20:19:42 +0100 Subject: [PATCH 059/220] Backport fix for spurious refleak failures (#482) --- Lib/test/regrtest.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index c1d85f6a18482a..12909ec4778319 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1480,9 +1480,14 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): sys._clear_type_cache() # Clear ABC registries, restoring previously saved ABC registries. - for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]: - if not isabstract(abc): - continue + abs_classes = [getattr(collections.abc, a) for a in collections.abc.__all__] + abs_classes = filter(isabstract, abs_classes) + if 'typing' in sys.modules: + t = sys.modules['typing'] + # these classes require special treatment because they do not appear + # in direct subclasses on collections.abc classes + abs_classes = list(abs_classes) + [t.ChainMap, t.Counter, t.DefaultDict] + for abc in abs_classes: for obj in abc.__subclasses__() + [abc]: obj._abc_registry = abcs.get(obj, WeakSet()).copy() obj._abc_cache.clear() From b8b3b9b97c82bb0ac718c446b66fd516eb9ad18b Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Sun, 5 Mar 2017 19:58:10 -0800 Subject: [PATCH 060/220] Fixes the upload script to purge the CDN correctly and display success output. (#466) (#496) --- Tools/msi/uploadrelease.proj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Tools/msi/uploadrelease.proj b/Tools/msi/uploadrelease.proj index 305e84fc2d4b28..75840f2f851ecd 100644 --- a/Tools/msi/uploadrelease.proj +++ b/Tools/msi/uploadrelease.proj @@ -8,6 +8,7 @@ $(TARGET) /srv/www.python.org/ftp/python true + true false false @@ -91,6 +92,7 @@ echo." /> + From 6b7bc45e33ec953c542788420adc305ec026fa40 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 6 Mar 2017 09:31:00 -0800 Subject: [PATCH 061/220] bpo-29557: Remove ambiguous line in binhex docs (GH-90) (GH-474) "appears to not work in all cases" does not inspire confidence in this module. I can find no context for what bug this was referencing so it should be removed. (cherry picked from commit 6de2b7817fa9403e81dc38f13f3690f0bbf3d064) --- Doc/library/binhex.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst index 359ab23b2f9787..2966e0dbfbcfe8 100644 --- a/Doc/library/binhex.rst +++ b/Doc/library/binhex.rst @@ -55,5 +55,3 @@ the source for details. If you code or decode textfiles on non-Macintosh platforms they will still use the old Macintosh newline convention (carriage-return as end of line). -As of this writing, :func:`hexbin` appears to not work in all cases. - From bef209d449afcdc391b108d197a95b15902197d9 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Tue, 7 Mar 2017 17:18:33 +0900 Subject: [PATCH 062/220] PCbuild: Add -q option to svn export (GH-538) Without this option, AppVeyor log is too unreadable. (cherry picked from commit 8886d5f39286dffa7d9337857b151e7fb4af23fd) --- PCbuild/get_externals.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat index dfaf5496a2b614..9cd13065c7abb9 100644 --- a/PCbuild/get_externals.bat +++ b/PCbuild/get_externals.bat @@ -66,7 +66,7 @@ for %%e in (%libraries%) do ( echo.%%e already exists, skipping. ) else ( echo.Fetching %%e... - svn export %SVNROOT%%%e + svn export -q %SVNROOT%%%e ) ) From 93602e3af70d3b9f98ae2da654b16b3382b68d50 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Wed, 8 Mar 2017 16:41:01 +1000 Subject: [PATCH 063/220] [3.5] bpo-29537: Tolerate legacy invalid bytecode (#169) bpo-27286 fixed a problem where BUILD_MAP_UNPACK_WITH_CALL could be emitted with an incorrect oparg value, causing the eval loop to access the wrong stack entry when attempting to read the function name. The associated magic number change caused significant problems when attempting to upgrade to 3.5.3 for anyone that relies on pre-cached bytecode remaining valid across maintenance releases. This patch restores the ability to import legacy bytecode generated by 3.5.0, 3.5.1 or 3.5.2, and modifies the eval loop to avoid any harmful consequences from the potentially malformed legacy bytecode. Original import patch by Petr Viktorin, eval loop patch by Serhiy Storchaka, and tests and integration by Nick Coghlan. --- Lib/importlib/_bootstrap_external.py | 28 +- Lib/importlib/util.py | 2 +- Lib/pkgutil.py | 5 +- Lib/pydoc.py | 7 +- Lib/test/test_extcall.py | 6 +- .../test_importlib/source/test_file_loader.py | 104 + Lib/test/test_unpack_ex.py | 2 +- Misc/NEWS | 6 + Modules/zipimport.c | 11 +- Python/ceval.c | 85 +- Python/import.c | 10 +- Python/importlib_external.h | 5145 +++++++++-------- Python/pythonrun.c | 19 +- 13 files changed, 2823 insertions(+), 2607 deletions(-) diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index e54d6916e89306..506bb33598a325 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -230,7 +230,7 @@ def _write_atomic(path, data, mode=0o666): # Python 3.5b1 3330 (PEP 448: Additional Unpacking Generalizations) # Python 3.5b2 3340 (fix dictionary display evaluation order #11205) # Python 3.5b2 3350 (add GET_YIELD_FROM_ITER opcode #24400) -# Python 3.5.2 3351 (fix BUILD_MAP_UNPACK_WITH_CALL opcode #27286) +# Python 3.5.3 3351 (fix BUILD_MAP_UNPACK_WITH_CALL opcode #27286) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -242,6 +242,28 @@ def _write_atomic(path, data, mode=0o666): MAGIC_NUMBER = (3351).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c +# Issue #29537: handle issue27286 bytecode incompatibility +# +# The magic number bump in Python 3.5.3 for issue27286 turned out to create +# significant backwards compatibility problems for redistributors and +# other folks that rely on the bytecode format remaining stable within a +# given maintenance release series. See http://bugs.python.org/issue29514 +# for more discussion of the problems that the original change caused. +# +# The _BACKCOMPAT_MAGIC_NUMBER below and any other changes marked with +# "Issue #29537" comments allow Python 3.5.4+ to load bytecode files with both +# the original 3.5.0 magic number and those with the updated magic number used +# since 3.5.3. +# +# This is expected to be a one-off change used solely to restore legacy +# bytecode compatibility within the 3.5.x series, so it avoids any changes +# that would prompt a rebuild of C extension modules. +# +if _RAW_MAGIC_NUMBER != 168627479: + _msg = 'Magic number mismatch (the issue27286 workaround is for 3.5 only)' + raise SystemError(_msg) +_BACKCOMPAT_MAGIC_NUMBER = (3350).to_bytes(2, 'little') + b'\r\n' + _PYCACHE = '__pycache__' _OPT = 'opt-' @@ -446,7 +468,9 @@ def _validate_bytecode_header(data, source_stats=None, name=None, path=None): magic = data[:4] raw_timestamp = data[4:8] raw_size = data[8:12] - if magic != MAGIC_NUMBER: + if (magic != MAGIC_NUMBER + # Issue #29537: handle issue27286 bytecode incompatibility + and magic != _BACKCOMPAT_MAGIC_NUMBER): message = 'bad magic number in {!r}: {!r}'.format(name, magic) _verbose_message('{}', message) raise ImportError(message, **exc_details) diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py index e1fa07a6645ea3..a15cf009dbc4f3 100644 --- a/Lib/importlib/util.py +++ b/Lib/importlib/util.py @@ -4,7 +4,7 @@ from ._bootstrap import _resolve_name from ._bootstrap import spec_from_loader from ._bootstrap import _find_spec -from ._bootstrap_external import MAGIC_NUMBER +from ._bootstrap_external import MAGIC_NUMBER, _BACKCOMPAT_MAGIC_NUMBER from ._bootstrap_external import cache_from_source from ._bootstrap_external import decode_source from ._bootstrap_external import source_from_cache diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py index 81d418da56e7e4..9d1879a20c08d8 100644 --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -37,7 +37,10 @@ def read_code(stream): import marshal magic = stream.read(4) - if magic != importlib.util.MAGIC_NUMBER: + if (magic != importlib.util.MAGIC_NUMBER + # Issue #29537: handle issue27286 bytecode incompatibility + # See Lib/importlib/_bootstrap_external.py + and magic != importlib.util._BACKCOMPAT_MAGIC_NUMBER): return None stream.read(8) # Skip timestamp and size diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 0d0d0abec1ba7e..729efba1878e93 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -289,7 +289,12 @@ def importfile(path): """Import a Python source file or compiled file given its path.""" magic = importlib.util.MAGIC_NUMBER with open(path, 'rb') as file: - is_bytecode = magic == file.read(len(magic)) + first_bytes = file.read(len(magic)) + is_bytecode = first_bytes in (magic, + # Issue #29537: handle issue27286 + # bytecode incompatibility + # See Lib/importlib/_bootstrap_external.py + importlib.util._BACKCOMPAT_MAGIC_NUMBER) filename = os.path.basename(path) name, ext = os.path.splitext(filename) if is_bytecode: diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index 9cb0d38669be58..94501de061980a 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -52,15 +52,15 @@ >>> f(1, 2, **{'a': -1, 'b': 5}, **{'a': 4, 'c': 6}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: function got multiple values for keyword argument 'a' >>> f(1, 2, **{'a': -1, 'b': 5}, a=4, c=6) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: function got multiple values for keyword argument 'a' >>> f(1, 2, a=3, **{'a': 4}, **{'a': 5}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'a' + TypeError: function got multiple values for keyword argument 'a' >>> f(1, 2, 3, *[4, 5], **{'a':6, 'b':7}) (1, 2, 3, 4, 5) {'a': 6, 'b': 7} >>> f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b': 9}) diff --git a/Lib/test/test_importlib/source/test_file_loader.py b/Lib/test/test_importlib/source/test_file_loader.py index 73f4c620706ba6..6d5a886d532056 100644 --- a/Lib/test/test_importlib/source/test_file_loader.py +++ b/Lib/test/test_importlib/source/test_file_loader.py @@ -603,5 +603,109 @@ class SourcelessLoaderBadBytecodeTestPEP302(SourcelessLoaderBadBytecodeTest, util=importlib_util) +########################################################################### +# Issue #29537: Test backwards compatibility with legacy 3.5.0/1/2 bytecode +########################################################################### + +class LegacyBytecodeTest: + + def _test_legacy_magic(self, test, *, del_source=False): + # Replace the default magic number with one copied from a pyc file + # generated by Python 3.5.2 + with util.create_modules('_temp') as mapping: + bc_path = self.manipulate_bytecode('_temp', mapping, + lambda bc: b'\x16\r\r\n' + bc[4:]) + test('_temp', mapping, bc_path) + +LegacyBytecodeTestPEP451 = BadBytecodeTestPEP451 +LegacyBytecodeTestPEP302 = BadBytecodeTestPEP302 + +# SourceLoader via both PEP 451 and 302 hooks + +class SourceLoaderLegacyBytecodeTest(LegacyBytecodeTest): + + @classmethod + def setUpClass(cls): + cls.loader = cls.machinery.SourceFileLoader + + @util.writes_bytecode_files + def test_legacy_magic(self): + # The magic number from 3.5.0/1/2 should be accepted as is + def test(name, mapping, bytecode_path): + self.import_(mapping[name], name) + with open(bytecode_path, 'rb') as bytecode_file: + self.assertEqual(bytecode_file.read(4), + self.util._BACKCOMPAT_MAGIC_NUMBER) + + self._test_legacy_magic(test) + + +class SourceLoaderLegacyBytecodeTestPEP451( + SourceLoaderLegacyBytecodeTest, LegacyBytecodeTestPEP451): + pass + + +(Frozen_SourceLegacyBytecodePEP451, + Source_SourceLegacyBytecodePEP451 + ) = util.test_both(SourceLoaderLegacyBytecodeTestPEP451, importlib=importlib, + machinery=machinery, abc=importlib_abc, + util=importlib_util) + + +class SourceLoaderLegacyBytecodeTestPEP302( + SourceLoaderLegacyBytecodeTest, LegacyBytecodeTestPEP302): + pass + + +(Frozen_SourceLegacyBytecodePEP302, + Source_SourceLegacyBytecodePEP302 + ) = util.test_both(SourceLoaderLegacyBytecodeTestPEP302, importlib=importlib, + machinery=machinery, abc=importlib_abc, + util=importlib_util) + +# SourcelessLoader via both PEP 451 and 302 hooks + +class SourcelessLoaderLegacyBytecodeTest(LegacyBytecodeTest): + + @classmethod + def setUpClass(cls): + cls.loader = cls.machinery.SourcelessFileLoader + + + @util.writes_bytecode_files + def test_legacy_magic(self): + # The magic number from 3.5.0/1/2 should be accepted as is + def test(name, mapping, bytecode_path): + self.import_(bytecode_path, name) + with open(bytecode_path, 'rb') as bytecode_file: + self.assertEqual(bytecode_file.read(4), + self.util._BACKCOMPAT_MAGIC_NUMBER) + + self._test_legacy_magic(test) + +class SourcelessLoaderLegacyBytecodeTestPEP451( + SourcelessLoaderLegacyBytecodeTest, LegacyBytecodeTestPEP451): + pass + +(Frozen_SourcelessLegacyBytecodePEP451, + Source_SourcelessLegacyBytecodePEP451 + ) = util.test_both(SourcelessLoaderLegacyBytecodeTestPEP451, importlib=importlib, + machinery=machinery, abc=importlib_abc, + util=importlib_util) + + +class SourcelessLoaderLegacyBytecodeTestPEP302(SourcelessLoaderLegacyBytecodeTest, + LegacyBytecodeTestPEP302): + pass + + +(Frozen_SourcelessLegacyBytecodePEP302, + Source_SourcelessLegacyBytecodePEP302 + ) = util.test_both(SourcelessLoaderLegacyBytecodeTestPEP302, importlib=importlib, + machinery=machinery, abc=importlib_abc, + util=importlib_util) + +# End of Issue #29537 legacy bytecode compatibility tests + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_unpack_ex.py b/Lib/test/test_unpack_ex.py index 74346b42054f8e..43cf6385f07bd4 100644 --- a/Lib/test/test_unpack_ex.py +++ b/Lib/test/test_unpack_ex.py @@ -251,7 +251,7 @@ >>> f(x=5, **{'x': 3}, **{'x': 2}) Traceback (most recent call last): ... - TypeError: f() got multiple values for keyword argument 'x' + TypeError: function got multiple values for keyword argument 'x' >>> f(**{1: 3}, **{1: 5}) Traceback (most recent call last): diff --git a/Misc/NEWS b/Misc/NEWS index 03f8286f080ba6..82f9f9a1f58b07 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,12 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- Issue #29537: Restore runtime compatibility with bytecode files generated by + CPython 3.5.0 and 3.5.1, and adjust the eval loop to avoid the problems that + could be caused by the malformed variant of the BUILD_MAP_UNPACK_WITH_CALL + opcode that they may contain. Patch by Petr Viktorin, Serhiy Storchaka, + and Nick Coghlan. + - Issue #28598: Support __rmod__ for subclasses of str being called before str.__mod__. Patch by Martijn Pieters. diff --git a/Modules/zipimport.c b/Modules/zipimport.c index 7473a8fe877875..a693fbbf6e280e 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -1263,6 +1263,11 @@ eq_mtime(time_t t1, time_t t2) return d <= 1; } +/* Issue #29537: handle issue27286 bytecode incompatibility + * See Lib/importlib/_bootstrap_external.py for general discussion + */ +extern PY_UINT32_T _Py_BACKCOMPAT_MAGIC_NUMBER; + /* Given the contents of a .py[co] file in a buffer, unmarshal the data and return the code object. Return None if it the magic word doesn't match (we do this instead of raising an exception as we fall back @@ -1274,6 +1279,7 @@ unmarshal_code(PyObject *pathname, PyObject *data, time_t mtime) PyObject *code; unsigned char *buf = (unsigned char *)PyBytes_AsString(data); Py_ssize_t size = PyBytes_Size(data); + PY_UINT32_T magic; if (size < 12) { PyErr_SetString(ZipImportError, @@ -1281,7 +1287,10 @@ unmarshal_code(PyObject *pathname, PyObject *data, time_t mtime) return NULL; } - if (get_uint32(buf) != (unsigned int)PyImport_GetMagicNumber()) { + magic = get_uint32(buf); + if (magic != (unsigned int)PyImport_GetMagicNumber() + /* Issue #29537: handle issue27286 bytecode incompatibility */ + && magic != _Py_BACKCOMPAT_MAGIC_NUMBER) { if (Py_VerboseFlag) { PySys_FormatStderr("# %R has bad magic\n", pathname); diff --git a/Python/ceval.c b/Python/ceval.c index 62badebca6502d..9ae8653f7e4e84 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2672,14 +2672,22 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) if (PyErr_ExceptionMatches(PyExc_AttributeError) || !PyMapping_Check(arg)) { int function_location = (oparg>>8) & 0xff; - PyObject *func = ( - PEEK(function_location + num_maps)); - PyErr_Format(PyExc_TypeError, - "%.200s%.200s argument after ** " - "must be a mapping, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - arg->ob_type->tp_name); + if (function_location == 1) { + PyObject *func = ( + PEEK(function_location + num_maps)); + PyErr_Format(PyExc_TypeError, + "%.200s%.200s argument after ** " + "must be a mapping, not %.200s", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + arg->ob_type->tp_name); + } + else { + PyErr_Format(PyExc_TypeError, + "argument after ** " + "must be a mapping, not %.200s", + arg->ob_type->tp_name); + } } Py_DECREF(sum); goto error; @@ -2689,21 +2697,34 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) Py_ssize_t idx = 0; PyObject *key; int function_location = (oparg>>8) & 0xff; - PyObject *func = PEEK(function_location + num_maps); Py_hash_t hash; _PySet_NextEntry(intersection, &idx, &key, &hash); - if (!PyUnicode_Check(key)) { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s keywords must be strings", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func)); - } else { - PyErr_Format(PyExc_TypeError, - "%.200s%.200s got multiple " - "values for keyword argument '%U'", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - key); + if (function_location == 1) { + PyObject *func = PEEK(function_location + num_maps); + if (!PyUnicode_Check(key)) { + PyErr_Format(PyExc_TypeError, + "%.200s%.200s keywords must be strings", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func)); + } else { + PyErr_Format(PyExc_TypeError, + "%.200s%.200s got multiple " + "values for keyword argument '%U'", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + key); + } + } + else { + if (!PyUnicode_Check(key)) { + PyErr_SetString(PyExc_TypeError, + "keywords must be strings"); + } else { + PyErr_Format(PyExc_TypeError, + "function got multiple " + "values for keyword argument '%U'", + key); + } } Py_DECREF(intersection); Py_DECREF(sum); @@ -2716,13 +2737,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) if (PyErr_ExceptionMatches(PyExc_AttributeError)) { if (with_call) { int function_location = (oparg>>8) & 0xff; - PyObject *func = PEEK(function_location + num_maps); - PyErr_Format(PyExc_TypeError, - "%.200s%.200s argument after ** " - "must be a mapping, not %.200s", - PyEval_GetFuncName(func), - PyEval_GetFuncDesc(func), - arg->ob_type->tp_name); + if (function_location == 1) { + PyObject *func = PEEK(function_location + num_maps); + PyErr_Format(PyExc_TypeError, + "%.200s%.200s argument after ** " + "must be a mapping, not %.200s", + PyEval_GetFuncName(func), + PyEval_GetFuncDesc(func), + arg->ob_type->tp_name); + } + else { + PyErr_Format(PyExc_TypeError, + "argument after ** " + "must be a mapping, not %.200s", + arg->ob_type->tp_name); + } } else { PyErr_Format(PyExc_TypeError, diff --git a/Python/import.c b/Python/import.c index 3579273ae0fefe..ea8bc00a73a782 100644 --- a/Python/import.c +++ b/Python/import.c @@ -483,9 +483,17 @@ PyImport_Cleanup(void) #undef STORE_MODULE_WEAKREF } +/* Issue #29537: handle issue27286 bytecode incompatibility + * + * In order to avoid forcing recompilation of all extension modules, we export + * the legacy 3.5.0 magic number here rather than putting it in a header file. + * + * See Lib/importlib/_bootstrap_external.py for general discussion + */ +PY_UINT32_T _Py_BACKCOMPAT_MAGIC_NUMBER = 168627478; +PY_UINT32_T _Py_BACKCOMPAT_HALF_MAGIC = 3350; /* Helper for pythonrun.c -- return magic number and tag. */ - long PyImport_GetMagicNumber(void) { diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 5ee843a4638a24..f337c8b5b9096a 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -1,8 +1,8 @@ /* Auto-generated by Programs/_freeze_importlib.c */ const unsigned char _Py_M__importlib_external[] = { 99,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0, - 0,64,0,0,0,115,244,2,0,0,100,0,0,90,0,0, - 100,96,0,90,1,0,100,97,0,90,2,0,101,2,0,101, + 0,64,0,0,0,115,40,3,0,0,100,0,0,90,0,0, + 100,99,0,90,1,0,100,100,0,90,2,0,101,2,0,101, 1,0,23,90,3,0,100,4,0,100,5,0,132,0,0,90, 4,0,100,6,0,100,7,0,132,0,0,90,5,0,100,8, 0,100,9,0,132,0,0,90,6,0,100,10,0,100,11,0, @@ -14,2592 +14,2605 @@ const unsigned char _Py_M__importlib_external[] = { 0,101,14,0,101,13,0,106,15,0,131,1,0,90,16,0, 100,25,0,106,17,0,100,26,0,100,27,0,131,2,0,100, 28,0,23,90,18,0,101,19,0,106,20,0,101,18,0,100, - 27,0,131,2,0,90,21,0,100,29,0,90,22,0,100,30, - 0,90,23,0,100,31,0,103,1,0,90,24,0,100,32,0, - 103,1,0,90,25,0,101,25,0,4,90,26,0,90,27,0, - 100,33,0,100,34,0,100,33,0,100,35,0,100,36,0,132, - 1,1,90,28,0,100,37,0,100,38,0,132,0,0,90,29, - 0,100,39,0,100,40,0,132,0,0,90,30,0,100,41,0, - 100,42,0,132,0,0,90,31,0,100,43,0,100,44,0,132, - 0,0,90,32,0,100,45,0,100,46,0,100,47,0,100,48, - 0,132,0,1,90,33,0,100,49,0,100,50,0,132,0,0, - 90,34,0,100,51,0,100,52,0,132,0,0,90,35,0,100, - 33,0,100,33,0,100,33,0,100,53,0,100,54,0,132,3, - 0,90,36,0,100,33,0,100,33,0,100,33,0,100,55,0, - 100,56,0,132,3,0,90,37,0,100,57,0,100,57,0,100, - 58,0,100,59,0,132,2,0,90,38,0,100,60,0,100,61, - 0,132,0,0,90,39,0,101,40,0,131,0,0,90,41,0, - 100,33,0,100,62,0,100,33,0,100,63,0,101,41,0,100, - 64,0,100,65,0,132,1,2,90,42,0,71,100,66,0,100, - 67,0,132,0,0,100,67,0,131,2,0,90,43,0,71,100, - 68,0,100,69,0,132,0,0,100,69,0,131,2,0,90,44, - 0,71,100,70,0,100,71,0,132,0,0,100,71,0,101,44, - 0,131,3,0,90,45,0,71,100,72,0,100,73,0,132,0, - 0,100,73,0,131,2,0,90,46,0,71,100,74,0,100,75, - 0,132,0,0,100,75,0,101,46,0,101,45,0,131,4,0, - 90,47,0,71,100,76,0,100,77,0,132,0,0,100,77,0, - 101,46,0,101,44,0,131,4,0,90,48,0,103,0,0,90, - 49,0,71,100,78,0,100,79,0,132,0,0,100,79,0,101, - 46,0,101,44,0,131,4,0,90,50,0,71,100,80,0,100, - 81,0,132,0,0,100,81,0,131,2,0,90,51,0,71,100, - 82,0,100,83,0,132,0,0,100,83,0,131,2,0,90,52, - 0,71,100,84,0,100,85,0,132,0,0,100,85,0,131,2, - 0,90,53,0,71,100,86,0,100,87,0,132,0,0,100,87, - 0,131,2,0,90,54,0,100,33,0,100,88,0,100,89,0, - 132,1,0,90,55,0,100,90,0,100,91,0,132,0,0,90, - 56,0,100,92,0,100,93,0,132,0,0,90,57,0,100,94, - 0,100,95,0,132,0,0,90,58,0,100,33,0,83,41,98, - 97,94,1,0,0,67,111,114,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,112,97,116,104, - 45,98,97,115,101,100,32,105,109,112,111,114,116,46,10,10, - 84,104,105,115,32,109,111,100,117,108,101,32,105,115,32,78, - 79,84,32,109,101,97,110,116,32,116,111,32,98,101,32,100, - 105,114,101,99,116,108,121,32,105,109,112,111,114,116,101,100, - 33,32,73,116,32,104,97,115,32,98,101,101,110,32,100,101, - 115,105,103,110,101,100,32,115,117,99,104,10,116,104,97,116, - 32,105,116,32,99,97,110,32,98,101,32,98,111,111,116,115, - 116,114,97,112,112,101,100,32,105,110,116,111,32,80,121,116, - 104,111,110,32,97,115,32,116,104,101,32,105,109,112,108,101, - 109,101,110,116,97,116,105,111,110,32,111,102,32,105,109,112, - 111,114,116,46,32,65,115,10,115,117,99,104,32,105,116,32, - 114,101,113,117,105,114,101,115,32,116,104,101,32,105,110,106, - 101,99,116,105,111,110,32,111,102,32,115,112,101,99,105,102, - 105,99,32,109,111,100,117,108,101,115,32,97,110,100,32,97, - 116,116,114,105,98,117,116,101,115,32,105,110,32,111,114,100, - 101,114,32,116,111,10,119,111,114,107,46,32,79,110,101,32, - 115,104,111,117,108,100,32,117,115,101,32,105,109,112,111,114, - 116,108,105,98,32,97,115,32,116,104,101,32,112,117,98,108, - 105,99,45,102,97,99,105,110,103,32,118,101,114,115,105,111, - 110,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101, - 46,10,10,218,3,119,105,110,218,6,99,121,103,119,105,110, - 218,6,100,97,114,119,105,110,99,0,0,0,0,0,0,0, - 0,1,0,0,0,3,0,0,0,3,0,0,0,115,88,0, - 0,0,116,0,0,106,1,0,106,2,0,116,3,0,131,1, - 0,114,72,0,116,0,0,106,1,0,106,2,0,116,4,0, - 131,1,0,114,45,0,100,1,0,137,0,0,110,6,0,100, - 2,0,137,0,0,135,0,0,102,1,0,100,3,0,100,4, - 0,134,0,0,125,0,0,110,12,0,100,5,0,100,4,0, - 132,0,0,125,0,0,124,0,0,83,41,6,78,90,12,80, - 89,84,72,79,78,67,65,83,69,79,75,115,12,0,0,0, - 80,89,84,72,79,78,67,65,83,69,79,75,99,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,19,0,0, - 0,115,13,0,0,0,136,0,0,116,0,0,106,1,0,107, - 6,0,83,41,1,122,53,84,114,117,101,32,105,102,32,102, + 27,0,131,2,0,90,21,0,101,21,0,100,29,0,107,3, + 0,114,236,0,100,30,0,90,22,0,101,23,0,101,22,0, + 131,1,0,130,1,0,100,31,0,106,17,0,100,26,0,100, + 27,0,131,2,0,100,28,0,23,90,24,0,100,32,0,90, + 25,0,100,33,0,90,26,0,100,34,0,103,1,0,90,27, + 0,100,35,0,103,1,0,90,28,0,101,28,0,4,90,29, + 0,90,30,0,100,36,0,100,37,0,100,36,0,100,38,0, + 100,39,0,132,1,1,90,31,0,100,40,0,100,41,0,132, + 0,0,90,32,0,100,42,0,100,43,0,132,0,0,90,33, + 0,100,44,0,100,45,0,132,0,0,90,34,0,100,46,0, + 100,47,0,132,0,0,90,35,0,100,48,0,100,49,0,100, + 50,0,100,51,0,132,0,1,90,36,0,100,52,0,100,53, + 0,132,0,0,90,37,0,100,54,0,100,55,0,132,0,0, + 90,38,0,100,36,0,100,36,0,100,36,0,100,56,0,100, + 57,0,132,3,0,90,39,0,100,36,0,100,36,0,100,36, + 0,100,58,0,100,59,0,132,3,0,90,40,0,100,60,0, + 100,60,0,100,61,0,100,62,0,132,2,0,90,41,0,100, + 63,0,100,64,0,132,0,0,90,42,0,101,43,0,131,0, + 0,90,44,0,100,36,0,100,65,0,100,36,0,100,66,0, + 101,44,0,100,67,0,100,68,0,132,1,2,90,45,0,71, + 100,69,0,100,70,0,132,0,0,100,70,0,131,2,0,90, + 46,0,71,100,71,0,100,72,0,132,0,0,100,72,0,131, + 2,0,90,47,0,71,100,73,0,100,74,0,132,0,0,100, + 74,0,101,47,0,131,3,0,90,48,0,71,100,75,0,100, + 76,0,132,0,0,100,76,0,131,2,0,90,49,0,71,100, + 77,0,100,78,0,132,0,0,100,78,0,101,49,0,101,48, + 0,131,4,0,90,50,0,71,100,79,0,100,80,0,132,0, + 0,100,80,0,101,49,0,101,47,0,131,4,0,90,51,0, + 103,0,0,90,52,0,71,100,81,0,100,82,0,132,0,0, + 100,82,0,101,49,0,101,47,0,131,4,0,90,53,0,71, + 100,83,0,100,84,0,132,0,0,100,84,0,131,2,0,90, + 54,0,71,100,85,0,100,86,0,132,0,0,100,86,0,131, + 2,0,90,55,0,71,100,87,0,100,88,0,132,0,0,100, + 88,0,131,2,0,90,56,0,71,100,89,0,100,90,0,132, + 0,0,100,90,0,131,2,0,90,57,0,100,36,0,100,91, + 0,100,92,0,132,1,0,90,58,0,100,93,0,100,94,0, + 132,0,0,90,59,0,100,95,0,100,96,0,132,0,0,90, + 60,0,100,97,0,100,98,0,132,0,0,90,61,0,100,36, + 0,83,41,101,97,94,1,0,0,67,111,114,101,32,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32, + 112,97,116,104,45,98,97,115,101,100,32,105,109,112,111,114, + 116,46,10,10,84,104,105,115,32,109,111,100,117,108,101,32, + 105,115,32,78,79,84,32,109,101,97,110,116,32,116,111,32, + 98,101,32,100,105,114,101,99,116,108,121,32,105,109,112,111, + 114,116,101,100,33,32,73,116,32,104,97,115,32,98,101,101, + 110,32,100,101,115,105,103,110,101,100,32,115,117,99,104,10, + 116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,98, + 111,111,116,115,116,114,97,112,112,101,100,32,105,110,116,111, + 32,80,121,116,104,111,110,32,97,115,32,116,104,101,32,105, + 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, + 32,105,109,112,111,114,116,46,32,65,115,10,115,117,99,104, + 32,105,116,32,114,101,113,117,105,114,101,115,32,116,104,101, + 32,105,110,106,101,99,116,105,111,110,32,111,102,32,115,112, + 101,99,105,102,105,99,32,109,111,100,117,108,101,115,32,97, + 110,100,32,97,116,116,114,105,98,117,116,101,115,32,105,110, + 32,111,114,100,101,114,32,116,111,10,119,111,114,107,46,32, + 79,110,101,32,115,104,111,117,108,100,32,117,115,101,32,105, + 109,112,111,114,116,108,105,98,32,97,115,32,116,104,101,32, + 112,117,98,108,105,99,45,102,97,99,105,110,103,32,118,101, + 114,115,105,111,110,32,111,102,32,116,104,105,115,32,109,111, + 100,117,108,101,46,10,10,218,3,119,105,110,218,6,99,121, + 103,119,105,110,218,6,100,97,114,119,105,110,99,0,0,0, + 0,0,0,0,0,1,0,0,0,3,0,0,0,3,0,0, + 0,115,88,0,0,0,116,0,0,106,1,0,106,2,0,116, + 3,0,131,1,0,114,72,0,116,0,0,106,1,0,106,2, + 0,116,4,0,131,1,0,114,45,0,100,1,0,137,0,0, + 110,6,0,100,2,0,137,0,0,135,0,0,102,1,0,100, + 3,0,100,4,0,134,0,0,125,0,0,110,12,0,100,5, + 0,100,4,0,132,0,0,125,0,0,124,0,0,83,41,6, + 78,90,12,80,89,84,72,79,78,67,65,83,69,79,75,115, + 12,0,0,0,80,89,84,72,79,78,67,65,83,69,79,75, + 99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,19,0,0,0,115,13,0,0,0,136,0,0,116,0,0, + 106,1,0,107,6,0,83,41,1,122,53,84,114,117,101,32, + 105,102,32,102,105,108,101,110,97,109,101,115,32,109,117,115, + 116,32,98,101,32,99,104,101,99,107,101,100,32,99,97,115, + 101,45,105,110,115,101,110,115,105,116,105,118,101,108,121,46, + 41,2,218,3,95,111,115,90,7,101,110,118,105,114,111,110, + 169,0,41,1,218,3,107,101,121,114,4,0,0,0,250,38, + 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, + 98,46,95,98,111,111,116,115,116,114,97,112,95,101,120,116, + 101,114,110,97,108,62,218,11,95,114,101,108,97,120,95,99, + 97,115,101,37,0,0,0,115,2,0,0,0,0,2,122,37, + 95,109,97,107,101,95,114,101,108,97,120,95,99,97,115,101, + 46,60,108,111,99,97,108,115,62,46,95,114,101,108,97,120, + 95,99,97,115,101,99,0,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,83,0,0,0,115,4,0,0,0,100, + 1,0,83,41,2,122,53,84,114,117,101,32,105,102,32,102, 105,108,101,110,97,109,101,115,32,109,117,115,116,32,98,101, 32,99,104,101,99,107,101,100,32,99,97,115,101,45,105,110, - 115,101,110,115,105,116,105,118,101,108,121,46,41,2,218,3, - 95,111,115,90,7,101,110,118,105,114,111,110,169,0,41,1, - 218,3,107,101,121,114,4,0,0,0,250,38,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,95,101,120,116,101,114,110,97, - 108,62,218,11,95,114,101,108,97,120,95,99,97,115,101,37, - 0,0,0,115,2,0,0,0,0,2,122,37,95,109,97,107, - 101,95,114,101,108,97,120,95,99,97,115,101,46,60,108,111, - 99,97,108,115,62,46,95,114,101,108,97,120,95,99,97,115, - 101,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,83,0,0,0,115,4,0,0,0,100,1,0,83,41, - 2,122,53,84,114,117,101,32,105,102,32,102,105,108,101,110, - 97,109,101,115,32,109,117,115,116,32,98,101,32,99,104,101, - 99,107,101,100,32,99,97,115,101,45,105,110,115,101,110,115, - 105,116,105,118,101,108,121,46,70,114,4,0,0,0,114,4, + 115,101,110,115,105,116,105,118,101,108,121,46,70,114,4,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,6,0,0,0,114,7,0,0,0,41,0,0,0,115, + 2,0,0,0,0,2,41,5,218,3,115,121,115,218,8,112, + 108,97,116,102,111,114,109,218,10,115,116,97,114,116,115,119, + 105,116,104,218,27,95,67,65,83,69,95,73,78,83,69,78, + 83,73,84,73,86,69,95,80,76,65,84,70,79,82,77,83, + 218,35,95,67,65,83,69,95,73,78,83,69,78,83,73,84, + 73,86,69,95,80,76,65,84,70,79,82,77,83,95,83,84, + 82,95,75,69,89,41,1,114,7,0,0,0,114,4,0,0, + 0,41,1,114,5,0,0,0,114,6,0,0,0,218,16,95, + 109,97,107,101,95,114,101,108,97,120,95,99,97,115,101,30, + 0,0,0,115,14,0,0,0,0,1,18,1,18,1,9,2, + 6,2,21,4,12,3,114,13,0,0,0,99,1,0,0,0, + 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, + 115,26,0,0,0,116,0,0,124,0,0,131,1,0,100,1, + 0,64,106,1,0,100,2,0,100,3,0,131,2,0,83,41, + 4,122,42,67,111,110,118,101,114,116,32,97,32,51,50,45, + 98,105,116,32,105,110,116,101,103,101,114,32,116,111,32,108, + 105,116,116,108,101,45,101,110,100,105,97,110,46,108,3,0, + 0,0,255,127,255,127,3,0,233,4,0,0,0,218,6,108, + 105,116,116,108,101,41,2,218,3,105,110,116,218,8,116,111, + 95,98,121,116,101,115,41,1,218,1,120,114,4,0,0,0, + 114,4,0,0,0,114,6,0,0,0,218,7,95,119,95,108, + 111,110,103,47,0,0,0,115,2,0,0,0,0,2,114,19, + 0,0,0,99,1,0,0,0,0,0,0,0,1,0,0,0, + 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,0, + 106,1,0,124,0,0,100,1,0,131,2,0,83,41,2,122, + 47,67,111,110,118,101,114,116,32,52,32,98,121,116,101,115, + 32,105,110,32,108,105,116,116,108,101,45,101,110,100,105,97, + 110,32,116,111,32,97,110,32,105,110,116,101,103,101,114,46, + 114,15,0,0,0,41,2,114,16,0,0,0,218,10,102,114, + 111,109,95,98,121,116,101,115,41,1,90,9,105,110,116,95, + 98,121,116,101,115,114,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,218,7,95,114,95,108,111,110,103,52,0,0, + 0,115,2,0,0,0,0,2,114,21,0,0,0,99,0,0, + 0,0,0,0,0,0,1,0,0,0,3,0,0,0,71,0, + 0,0,115,26,0,0,0,116,0,0,106,1,0,100,1,0, + 100,2,0,132,0,0,124,0,0,68,131,1,0,131,1,0, + 83,41,3,122,31,82,101,112,108,97,99,101,109,101,110,116, + 32,102,111,114,32,111,115,46,112,97,116,104,46,106,111,105, + 110,40,41,46,99,1,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,83,0,0,0,115,37,0,0,0,103,0, + 0,124,0,0,93,27,0,125,1,0,124,1,0,114,6,0, + 124,1,0,106,0,0,116,1,0,131,1,0,145,2,0,113, + 6,0,83,114,4,0,0,0,41,2,218,6,114,115,116,114, + 105,112,218,15,112,97,116,104,95,115,101,112,97,114,97,116, + 111,114,115,41,2,218,2,46,48,218,4,112,97,114,116,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,250,10, + 60,108,105,115,116,99,111,109,112,62,59,0,0,0,115,2, + 0,0,0,9,1,122,30,95,112,97,116,104,95,106,111,105, + 110,46,60,108,111,99,97,108,115,62,46,60,108,105,115,116, + 99,111,109,112,62,41,2,218,8,112,97,116,104,95,115,101, + 112,218,4,106,111,105,110,41,1,218,10,112,97,116,104,95, + 112,97,114,116,115,114,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,218,10,95,112,97,116,104,95,106,111,105,110, + 57,0,0,0,115,4,0,0,0,0,2,15,1,114,30,0, + 0,0,99,1,0,0,0,0,0,0,0,5,0,0,0,5, + 0,0,0,67,0,0,0,115,134,0,0,0,116,0,0,116, + 1,0,131,1,0,100,1,0,107,2,0,114,52,0,124,0, + 0,106,2,0,116,3,0,131,1,0,92,3,0,125,1,0, + 125,2,0,125,3,0,124,1,0,124,3,0,102,2,0,83, + 120,69,0,116,4,0,124,0,0,131,1,0,68,93,55,0, + 125,4,0,124,4,0,116,1,0,107,6,0,114,65,0,124, + 0,0,106,5,0,124,4,0,100,2,0,100,1,0,131,1, + 1,92,2,0,125,1,0,125,3,0,124,1,0,124,3,0, + 102,2,0,83,113,65,0,87,100,3,0,124,0,0,102,2, + 0,83,41,4,122,32,82,101,112,108,97,99,101,109,101,110, + 116,32,102,111,114,32,111,115,46,112,97,116,104,46,115,112, + 108,105,116,40,41,46,233,1,0,0,0,90,8,109,97,120, + 115,112,108,105,116,218,0,41,6,218,3,108,101,110,114,23, + 0,0,0,218,10,114,112,97,114,116,105,116,105,111,110,114, + 27,0,0,0,218,8,114,101,118,101,114,115,101,100,218,6, + 114,115,112,108,105,116,41,5,218,4,112,97,116,104,90,5, + 102,114,111,110,116,218,1,95,218,4,116,97,105,108,114,18, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,7,0,0,0,41,0,0,0,115,2,0,0,0, - 0,2,41,5,218,3,115,121,115,218,8,112,108,97,116,102, - 111,114,109,218,10,115,116,97,114,116,115,119,105,116,104,218, - 27,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73, - 86,69,95,80,76,65,84,70,79,82,77,83,218,35,95,67, - 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95, - 80,76,65,84,70,79,82,77,83,95,83,84,82,95,75,69, - 89,41,1,114,7,0,0,0,114,4,0,0,0,41,1,114, - 5,0,0,0,114,6,0,0,0,218,16,95,109,97,107,101, - 95,114,101,108,97,120,95,99,97,115,101,30,0,0,0,115, - 14,0,0,0,0,1,18,1,18,1,9,2,6,2,21,4, - 12,3,114,13,0,0,0,99,1,0,0,0,0,0,0,0, - 1,0,0,0,3,0,0,0,67,0,0,0,115,26,0,0, - 0,116,0,0,124,0,0,131,1,0,100,1,0,64,106,1, - 0,100,2,0,100,3,0,131,2,0,83,41,4,122,42,67, - 111,110,118,101,114,116,32,97,32,51,50,45,98,105,116,32, - 105,110,116,101,103,101,114,32,116,111,32,108,105,116,116,108, - 101,45,101,110,100,105,97,110,46,108,3,0,0,0,255,127, - 255,127,3,0,233,4,0,0,0,218,6,108,105,116,116,108, - 101,41,2,218,3,105,110,116,218,8,116,111,95,98,121,116, - 101,115,41,1,218,1,120,114,4,0,0,0,114,4,0,0, - 0,114,6,0,0,0,218,7,95,119,95,108,111,110,103,47, - 0,0,0,115,2,0,0,0,0,2,114,19,0,0,0,99, - 1,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0, - 67,0,0,0,115,16,0,0,0,116,0,0,106,1,0,124, - 0,0,100,1,0,131,2,0,83,41,2,122,47,67,111,110, - 118,101,114,116,32,52,32,98,121,116,101,115,32,105,110,32, - 108,105,116,116,108,101,45,101,110,100,105,97,110,32,116,111, - 32,97,110,32,105,110,116,101,103,101,114,46,114,15,0,0, - 0,41,2,114,16,0,0,0,218,10,102,114,111,109,95,98, - 121,116,101,115,41,1,90,9,105,110,116,95,98,121,116,101, - 115,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 218,7,95,114,95,108,111,110,103,52,0,0,0,115,2,0, - 0,0,0,2,114,21,0,0,0,99,0,0,0,0,0,0, - 0,0,1,0,0,0,3,0,0,0,71,0,0,0,115,26, - 0,0,0,116,0,0,106,1,0,100,1,0,100,2,0,132, - 0,0,124,0,0,68,131,1,0,131,1,0,83,41,3,122, - 31,82,101,112,108,97,99,101,109,101,110,116,32,102,111,114, - 32,111,115,46,112,97,116,104,46,106,111,105,110,40,41,46, - 99,1,0,0,0,0,0,0,0,2,0,0,0,4,0,0, - 0,83,0,0,0,115,37,0,0,0,103,0,0,124,0,0, - 93,27,0,125,1,0,124,1,0,114,6,0,124,1,0,106, - 0,0,116,1,0,131,1,0,145,2,0,113,6,0,83,114, - 4,0,0,0,41,2,218,6,114,115,116,114,105,112,218,15, - 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,41, - 2,218,2,46,48,218,4,112,97,114,116,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,250,10,60,108,105,115, - 116,99,111,109,112,62,59,0,0,0,115,2,0,0,0,9, - 1,122,30,95,112,97,116,104,95,106,111,105,110,46,60,108, - 111,99,97,108,115,62,46,60,108,105,115,116,99,111,109,112, - 62,41,2,218,8,112,97,116,104,95,115,101,112,218,4,106, - 111,105,110,41,1,218,10,112,97,116,104,95,112,97,114,116, - 115,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 218,10,95,112,97,116,104,95,106,111,105,110,57,0,0,0, - 115,4,0,0,0,0,2,15,1,114,30,0,0,0,99,1, - 0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,67, - 0,0,0,115,134,0,0,0,116,0,0,116,1,0,131,1, - 0,100,1,0,107,2,0,114,52,0,124,0,0,106,2,0, - 116,3,0,131,1,0,92,3,0,125,1,0,125,2,0,125, - 3,0,124,1,0,124,3,0,102,2,0,83,120,69,0,116, - 4,0,124,0,0,131,1,0,68,93,55,0,125,4,0,124, - 4,0,116,1,0,107,6,0,114,65,0,124,0,0,106,5, - 0,124,4,0,100,2,0,100,1,0,131,1,1,92,2,0, - 125,1,0,125,3,0,124,1,0,124,3,0,102,2,0,83, - 113,65,0,87,100,3,0,124,0,0,102,2,0,83,41,4, - 122,32,82,101,112,108,97,99,101,109,101,110,116,32,102,111, - 114,32,111,115,46,112,97,116,104,46,115,112,108,105,116,40, - 41,46,233,1,0,0,0,90,8,109,97,120,115,112,108,105, - 116,218,0,41,6,218,3,108,101,110,114,23,0,0,0,218, - 10,114,112,97,114,116,105,116,105,111,110,114,27,0,0,0, - 218,8,114,101,118,101,114,115,101,100,218,6,114,115,112,108, - 105,116,41,5,218,4,112,97,116,104,90,5,102,114,111,110, - 116,218,1,95,218,4,116,97,105,108,114,18,0,0,0,114, - 4,0,0,0,114,4,0,0,0,114,6,0,0,0,218,11, - 95,112,97,116,104,95,115,112,108,105,116,63,0,0,0,115, - 16,0,0,0,0,2,18,1,24,1,10,1,19,1,12,1, - 27,1,14,1,114,40,0,0,0,99,1,0,0,0,0,0, - 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,13, - 0,0,0,116,0,0,106,1,0,124,0,0,131,1,0,83, - 41,1,122,126,83,116,97,116,32,116,104,101,32,112,97,116, - 104,46,10,10,32,32,32,32,77,97,100,101,32,97,32,115, - 101,112,97,114,97,116,101,32,102,117,110,99,116,105,111,110, - 32,116,111,32,109,97,107,101,32,105,116,32,101,97,115,105, - 101,114,32,116,111,32,111,118,101,114,114,105,100,101,32,105, - 110,32,101,120,112,101,114,105,109,101,110,116,115,10,32,32, - 32,32,40,101,46,103,46,32,99,97,99,104,101,32,115,116, - 97,116,32,114,101,115,117,108,116,115,41,46,10,10,32,32, - 32,32,41,2,114,3,0,0,0,90,4,115,116,97,116,41, - 1,114,37,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,218,10,95,112,97,116,104,95,115,116,97, - 116,75,0,0,0,115,2,0,0,0,0,7,114,41,0,0, - 0,99,2,0,0,0,0,0,0,0,3,0,0,0,11,0, - 0,0,67,0,0,0,115,58,0,0,0,121,16,0,116,0, - 0,124,0,0,131,1,0,125,2,0,87,110,22,0,4,116, - 1,0,107,10,0,114,40,0,1,1,1,100,1,0,83,89, - 110,1,0,88,124,2,0,106,2,0,100,2,0,64,124,1, - 0,107,2,0,83,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,41,0,0,0,218,7,79,83,69,114,114,111,114, - 218,7,115,116,95,109,111,100,101,41,3,114,37,0,0,0, - 218,4,109,111,100,101,90,9,115,116,97,116,95,105,110,102, - 111,114,4,0,0,0,114,4,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,85,0,0,0,115,10,0,0,0,0,2,3, - 1,16,1,13,1,9,1,114,45,0,0,0,99,1,0,0, - 0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0, - 0,115,13,0,0,0,116,0,0,124,0,0,100,1,0,131, - 2,0,83,41,2,122,31,82,101,112,108,97,99,101,109,101, + 0,0,218,11,95,112,97,116,104,95,115,112,108,105,116,63, + 0,0,0,115,16,0,0,0,0,2,18,1,24,1,10,1, + 19,1,12,1,27,1,14,1,114,40,0,0,0,99,1,0, + 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, + 0,0,115,13,0,0,0,116,0,0,106,1,0,124,0,0, + 131,1,0,83,41,1,122,126,83,116,97,116,32,116,104,101, + 32,112,97,116,104,46,10,10,32,32,32,32,77,97,100,101, + 32,97,32,115,101,112,97,114,97,116,101,32,102,117,110,99, + 116,105,111,110,32,116,111,32,109,97,107,101,32,105,116,32, + 101,97,115,105,101,114,32,116,111,32,111,118,101,114,114,105, + 100,101,32,105,110,32,101,120,112,101,114,105,109,101,110,116, + 115,10,32,32,32,32,40,101,46,103,46,32,99,97,99,104, + 101,32,115,116,97,116,32,114,101,115,117,108,116,115,41,46, + 10,10,32,32,32,32,41,2,114,3,0,0,0,90,4,115, + 116,97,116,41,1,114,37,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,218,10,95,112,97,116,104, + 95,115,116,97,116,75,0,0,0,115,2,0,0,0,0,7, + 114,41,0,0,0,99,2,0,0,0,0,0,0,0,3,0, + 0,0,11,0,0,0,67,0,0,0,115,58,0,0,0,121, + 16,0,116,0,0,124,0,0,131,1,0,125,2,0,87,110, + 22,0,4,116,1,0,107,10,0,114,40,0,1,1,1,100, + 1,0,83,89,110,1,0,88,124,2,0,106,2,0,100,2, + 0,64,124,1,0,107,2,0,83,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,41,0,0,0,218,7,79,83,69, + 114,114,111,114,218,7,115,116,95,109,111,100,101,41,3,114, + 37,0,0,0,218,4,109,111,100,101,90,9,115,116,97,116, + 95,105,110,102,111,114,4,0,0,0,114,4,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,85,0,0,0,115,10,0,0, + 0,0,2,3,1,16,1,13,1,9,1,114,45,0,0,0, + 99,1,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,13,0,0,0,116,0,0,124,0,0, + 100,1,0,131,2,0,83,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,45,0,0,0,41,1,114,37,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,218,12,95,112, + 97,116,104,95,105,115,102,105,108,101,94,0,0,0,115,2, + 0,0,0,0,2,114,46,0,0,0,99,1,0,0,0,0, + 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, + 31,0,0,0,124,0,0,115,18,0,116,0,0,106,1,0, + 131,0,0,125,0,0,116,2,0,124,0,0,100,1,0,131, + 2,0,83,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,102,105,108,101,46,105,0,128,0,0,41,1,114,45,0, - 0,0,41,1,114,37,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,12,95,112,97,116,104,95, - 105,115,102,105,108,101,94,0,0,0,115,2,0,0,0,0, - 2,114,46,0,0,0,99,1,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,31,0,0,0, - 124,0,0,115,18,0,116,0,0,106,1,0,131,0,0,125, - 0,0,116,2,0,124,0,0,100,1,0,131,2,0,83,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,3,0,0,0,218,6,103, - 101,116,99,119,100,114,45,0,0,0,41,1,114,37,0,0, - 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 218,11,95,112,97,116,104,95,105,115,100,105,114,99,0,0, - 0,115,6,0,0,0,0,2,6,1,12,1,114,48,0,0, - 0,105,182,1,0,0,99,3,0,0,0,0,0,0,0,6, - 0,0,0,17,0,0,0,67,0,0,0,115,193,0,0,0, - 100,1,0,106,0,0,124,0,0,116,1,0,124,0,0,131, - 1,0,131,2,0,125,3,0,116,2,0,106,3,0,124,3, - 0,116,2,0,106,4,0,116,2,0,106,5,0,66,116,2, - 0,106,6,0,66,124,2,0,100,2,0,64,131,3,0,125, - 4,0,121,61,0,116,7,0,106,8,0,124,4,0,100,3, - 0,131,2,0,143,20,0,125,5,0,124,5,0,106,9,0, - 124,1,0,131,1,0,1,87,100,4,0,81,82,88,116,2, - 0,106,10,0,124,3,0,124,0,0,131,2,0,1,87,110, - 59,0,4,116,11,0,107,10,0,114,188,0,1,1,1,121, - 17,0,116,2,0,106,12,0,124,3,0,131,1,0,1,87, - 110,18,0,4,116,11,0,107,10,0,114,180,0,1,1,1, - 89,110,1,0,88,130,0,0,89,110,1,0,88,100,4,0, - 83,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,122,5,123,125,46,123,125,105,182, - 1,0,0,90,2,119,98,78,41,13,218,6,102,111,114,109, - 97,116,218,2,105,100,114,3,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,42,0,0,0,90,6, - 117,110,108,105,110,107,41,6,114,37,0,0,0,218,4,100, - 97,116,97,114,44,0,0,0,90,8,112,97,116,104,95,116, - 109,112,90,2,102,100,218,4,102,105,108,101,114,4,0,0, - 0,114,4,0,0,0,114,6,0,0,0,218,13,95,119,114, - 105,116,101,95,97,116,111,109,105,99,106,0,0,0,115,26, - 0,0,0,0,5,24,1,9,1,33,1,3,3,21,1,20, - 1,20,1,13,1,3,1,17,1,13,1,5,1,114,57,0, - 0,0,105,23,13,0,0,233,2,0,0,0,114,15,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,218,12,111,112,116,105,109,105,122, - 97,116,105,111,110,99,2,0,0,0,1,0,0,0,11,0, - 0,0,6,0,0,0,67,0,0,0,115,87,1,0,0,124, - 1,0,100,1,0,107,9,0,114,76,0,116,0,0,106,1, - 0,100,2,0,116,2,0,131,2,0,1,124,2,0,100,1, - 0,107,9,0,114,58,0,100,3,0,125,3,0,116,3,0, - 124,3,0,131,1,0,130,1,0,124,1,0,114,70,0,100, - 4,0,110,3,0,100,5,0,125,2,0,116,4,0,124,0, - 0,131,1,0,92,2,0,125,4,0,125,5,0,124,5,0, - 106,5,0,100,6,0,131,1,0,92,3,0,125,6,0,125, - 7,0,125,8,0,116,6,0,106,7,0,106,8,0,125,9, - 0,124,9,0,100,1,0,107,8,0,114,154,0,116,9,0, - 100,7,0,131,1,0,130,1,0,100,4,0,106,10,0,124, - 6,0,114,172,0,124,6,0,110,3,0,124,8,0,124,7, - 0,124,9,0,103,3,0,131,1,0,125,10,0,124,2,0, - 100,1,0,107,8,0,114,241,0,116,6,0,106,11,0,106, - 12,0,100,8,0,107,2,0,114,229,0,100,4,0,125,2, - 0,110,12,0,116,6,0,106,11,0,106,12,0,125,2,0, - 116,13,0,124,2,0,131,1,0,125,2,0,124,2,0,100, - 4,0,107,3,0,114,63,1,124,2,0,106,14,0,131,0, - 0,115,42,1,116,15,0,100,9,0,106,16,0,124,2,0, - 131,1,0,131,1,0,130,1,0,100,10,0,106,16,0,124, - 10,0,116,17,0,124,2,0,131,3,0,125,10,0,116,18, - 0,124,4,0,116,19,0,124,10,0,116,20,0,100,8,0, - 25,23,131,3,0,83,41,11,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,32,0,0,0,114,31,0, - 0,0,218,1,46,122,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,41,21,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,40,0,0,0,114,34,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,28,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,49,0,0,0,218,4,95,79,80,84,114, - 30,0,0,0,218,8,95,80,89,67,65,67,72,69,218,17, - 66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,69, - 83,41,11,114,37,0,0,0,90,14,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,114,59,0,0,0,218,7,109, - 101,115,115,97,103,101,218,4,104,101,97,100,114,39,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,114,4,0,0,0,114,4,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,254,0,0,0,115,46, - 0,0,0,0,18,12,1,9,1,7,1,12,1,6,1,12, - 1,18,1,18,1,24,1,12,1,12,1,12,1,36,1,12, - 1,18,1,9,2,12,1,12,1,12,1,12,1,21,1,21, - 1,114,81,0,0,0,99,1,0,0,0,0,0,0,0,8, - 0,0,0,5,0,0,0,67,0,0,0,115,62,1,0,0, - 116,0,0,106,1,0,106,2,0,100,1,0,107,8,0,114, - 30,0,116,3,0,100,2,0,131,1,0,130,1,0,116,4, - 0,124,0,0,131,1,0,92,2,0,125,1,0,125,2,0, - 116,4,0,124,1,0,131,1,0,92,2,0,125,1,0,125, - 3,0,124,3,0,116,5,0,107,3,0,114,102,0,116,6, - 0,100,3,0,106,7,0,116,5,0,124,0,0,131,2,0, - 131,1,0,130,1,0,124,2,0,106,8,0,100,4,0,131, - 1,0,125,4,0,124,4,0,100,11,0,107,7,0,114,153, - 0,116,6,0,100,7,0,106,7,0,124,2,0,131,1,0, - 131,1,0,130,1,0,110,125,0,124,4,0,100,6,0,107, - 2,0,114,22,1,124,2,0,106,9,0,100,4,0,100,5, - 0,131,2,0,100,12,0,25,125,5,0,124,5,0,106,10, - 0,116,11,0,131,1,0,115,223,0,116,6,0,100,8,0, - 106,7,0,116,11,0,131,1,0,131,1,0,130,1,0,124, - 5,0,116,12,0,116,11,0,131,1,0,100,1,0,133,2, - 0,25,125,6,0,124,6,0,106,13,0,131,0,0,115,22, - 1,116,6,0,100,9,0,106,7,0,124,5,0,131,1,0, - 131,1,0,130,1,0,124,2,0,106,14,0,100,4,0,131, - 1,0,100,10,0,25,125,7,0,116,15,0,124,1,0,124, - 7,0,116,16,0,100,10,0,25,23,131,2,0,83,41,13, - 97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,102, - 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32, - 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,32, - 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, - 112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,111, - 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59, - 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116, - 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111, - 10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,108, - 101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,32, - 99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104, - 101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,102, - 32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,110, - 111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,69, - 80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,97, - 116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,105, - 108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,102, - 10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,101, - 110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,97, - 103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, - 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,78,122,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,122,37,123,125,32,110, - 111,116,32,98,111,116,116,111,109,45,108,101,118,101,108,32, - 100,105,114,101,99,116,111,114,121,32,105,110,32,123,33,114, - 125,114,60,0,0,0,114,58,0,0,0,233,3,0,0,0, - 122,33,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,123, - 33,114,125,122,57,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,123,33,114,125,122,52, - 111,112,116,105,109,105,122,97,116,105,111,110,32,108,101,118, - 101,108,32,123,33,114,125,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,61,0,0,0,62,2,0,0,0,114,58, - 0,0,0,114,82,0,0,0,233,254,255,255,255,41,17,114, - 8,0,0,0,114,66,0,0,0,114,67,0,0,0,114,68, - 0,0,0,114,40,0,0,0,114,75,0,0,0,114,73,0, - 0,0,114,49,0,0,0,218,5,99,111,117,110,116,114,36, - 0,0,0,114,10,0,0,0,114,74,0,0,0,114,33,0, - 0,0,114,72,0,0,0,218,9,112,97,114,116,105,116,105, - 111,110,114,30,0,0,0,218,15,83,79,85,82,67,69,95, - 83,85,70,70,73,88,69,83,41,8,114,37,0,0,0,114, - 78,0,0,0,90,16,112,121,99,97,99,104,101,95,102,105, - 108,101,110,97,109,101,90,7,112,121,99,97,99,104,101,90, - 9,100,111,116,95,99,111,117,110,116,114,59,0,0,0,90, - 9,111,112,116,95,108,101,118,101,108,90,13,98,97,115,101, + 115,100,105,114,46,105,0,64,0,0,41,3,114,3,0,0, + 0,218,6,103,101,116,99,119,100,114,45,0,0,0,41,1, + 114,37,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,218,11,95,112,97,116,104,95,105,115,100,105, + 114,99,0,0,0,115,6,0,0,0,0,2,6,1,12,1, + 114,48,0,0,0,105,182,1,0,0,99,3,0,0,0,0, + 0,0,0,6,0,0,0,17,0,0,0,67,0,0,0,115, + 193,0,0,0,100,1,0,106,0,0,124,0,0,116,1,0, + 124,0,0,131,1,0,131,2,0,125,3,0,116,2,0,106, + 3,0,124,3,0,116,2,0,106,4,0,116,2,0,106,5, + 0,66,116,2,0,106,6,0,66,124,2,0,100,2,0,64, + 131,3,0,125,4,0,121,61,0,116,7,0,106,8,0,124, + 4,0,100,3,0,131,2,0,143,20,0,125,5,0,124,5, + 0,106,9,0,124,1,0,131,1,0,1,87,100,4,0,81, + 82,88,116,2,0,106,10,0,124,3,0,124,0,0,131,2, + 0,1,87,110,59,0,4,116,11,0,107,10,0,114,188,0, + 1,1,1,121,17,0,116,2,0,106,12,0,124,3,0,131, + 1,0,1,87,110,18,0,4,116,11,0,107,10,0,114,180, + 0,1,1,1,89,110,1,0,88,130,0,0,89,110,1,0, + 88,100,4,0,83,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,122,5,123,125,46, + 123,125,105,182,1,0,0,90,2,119,98,78,41,13,218,6, + 102,111,114,109,97,116,218,2,105,100,114,3,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,42,0, + 0,0,90,6,117,110,108,105,110,107,41,6,114,37,0,0, + 0,218,4,100,97,116,97,114,44,0,0,0,90,8,112,97, + 116,104,95,116,109,112,90,2,102,100,218,4,102,105,108,101, + 114,4,0,0,0,114,4,0,0,0,114,6,0,0,0,218, + 13,95,119,114,105,116,101,95,97,116,111,109,105,99,106,0, + 0,0,115,26,0,0,0,0,5,24,1,9,1,33,1,3, + 3,21,1,20,1,20,1,13,1,3,1,17,1,13,1,5, + 1,114,57,0,0,0,105,23,13,0,0,233,2,0,0,0, + 114,15,0,0,0,115,2,0,0,0,13,10,105,23,13,13, + 10,122,65,77,97,103,105,99,32,110,117,109,98,101,114,32, + 109,105,115,109,97,116,99,104,32,40,116,104,101,32,105,115, + 115,117,101,50,55,50,56,54,32,119,111,114,107,97,114,111, + 117,110,100,32,105,115,32,102,111,114,32,51,46,53,32,111, + 110,108,121,41,105,22,13,0,0,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,218,12,111,112,116,105,109,105, + 122,97,116,105,111,110,99,2,0,0,0,1,0,0,0,11, + 0,0,0,6,0,0,0,67,0,0,0,115,87,1,0,0, + 124,1,0,100,1,0,107,9,0,114,76,0,116,0,0,106, + 1,0,100,2,0,116,2,0,131,2,0,1,124,2,0,100, + 1,0,107,9,0,114,58,0,100,3,0,125,3,0,116,3, + 0,124,3,0,131,1,0,130,1,0,124,1,0,114,70,0, + 100,4,0,110,3,0,100,5,0,125,2,0,116,4,0,124, + 0,0,131,1,0,92,2,0,125,4,0,125,5,0,124,5, + 0,106,5,0,100,6,0,131,1,0,92,3,0,125,6,0, + 125,7,0,125,8,0,116,6,0,106,7,0,106,8,0,125, + 9,0,124,9,0,100,1,0,107,8,0,114,154,0,116,9, + 0,100,7,0,131,1,0,130,1,0,100,4,0,106,10,0, + 124,6,0,114,172,0,124,6,0,110,3,0,124,8,0,124, + 7,0,124,9,0,103,3,0,131,1,0,125,10,0,124,2, + 0,100,1,0,107,8,0,114,241,0,116,6,0,106,11,0, + 106,12,0,100,8,0,107,2,0,114,229,0,100,4,0,125, + 2,0,110,12,0,116,6,0,106,11,0,106,12,0,125,2, + 0,116,13,0,124,2,0,131,1,0,125,2,0,124,2,0, + 100,4,0,107,3,0,114,63,1,124,2,0,106,14,0,131, + 0,0,115,42,1,116,15,0,100,9,0,106,16,0,124,2, + 0,131,1,0,131,1,0,130,1,0,100,10,0,106,16,0, + 124,10,0,116,17,0,124,2,0,131,3,0,125,10,0,116, + 18,0,124,4,0,116,19,0,124,10,0,116,20,0,100,8, + 0,25,23,131,3,0,83,41,11,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,32,0,0,0,114,31, + 0,0,0,218,1,46,122,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,41,21,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,40,0,0,0,114,34,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,28,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,49,0,0,0,218,4,95,79,80,84, + 114,30,0,0,0,218,8,95,80,89,67,65,67,72,69,218, + 17,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,41,11,114,37,0,0,0,90,14,100,101,98,117,103, + 95,111,118,101,114,114,105,100,101,114,59,0,0,0,218,7, + 109,101,115,115,97,103,101,218,4,104,101,97,100,114,39,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,114,4,0,0,0,114,4, - 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,42,1,0,0,115, - 44,0,0,0,0,9,18,1,12,1,18,1,18,1,12,1, - 9,1,15,1,15,1,12,1,9,1,15,1,12,1,22,1, - 15,1,9,1,12,1,22,1,12,1,9,1,12,1,19,1, - 114,87,0,0,0,99,1,0,0,0,0,0,0,0,5,0, - 0,0,12,0,0,0,67,0,0,0,115,164,0,0,0,116, - 0,0,124,0,0,131,1,0,100,1,0,107,2,0,114,22, - 0,100,2,0,83,124,0,0,106,1,0,100,3,0,131,1, - 0,92,3,0,125,1,0,125,2,0,125,3,0,124,1,0, - 12,115,81,0,124,3,0,106,2,0,131,0,0,100,7,0, - 100,8,0,133,2,0,25,100,6,0,107,3,0,114,85,0, - 124,0,0,83,121,16,0,116,3,0,124,0,0,131,1,0, - 125,4,0,87,110,40,0,4,116,4,0,116,5,0,102,2, - 0,107,10,0,114,143,0,1,1,1,124,0,0,100,2,0, - 100,9,0,133,2,0,25,125,4,0,89,110,1,0,88,116, - 6,0,124,4,0,131,1,0,114,160,0,124,4,0,83,124, - 0,0,83,41,10,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,61,0,0,0,78,114,60,0,0,0,114,82, - 0,0,0,114,31,0,0,0,90,2,112,121,233,253,255,255, - 255,233,255,255,255,255,114,89,0,0,0,41,7,114,33,0, - 0,0,114,34,0,0,0,218,5,108,111,119,101,114,114,87, - 0,0,0,114,68,0,0,0,114,73,0,0,0,114,46,0, - 0,0,41,5,218,13,98,121,116,101,99,111,100,101,95,112, - 97,116,104,114,80,0,0,0,114,38,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,4,0,0,0,114,4,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,75,1,0,0,115,20,0,0,0,0,7, - 18,1,4,1,24,1,35,1,4,1,3,1,16,1,19,1, - 21,1,114,93,0,0,0,99,1,0,0,0,0,0,0,0, - 1,0,0,0,11,0,0,0,67,0,0,0,115,92,0,0, - 0,124,0,0,106,0,0,116,1,0,116,2,0,131,1,0, - 131,1,0,114,59,0,121,14,0,116,3,0,124,0,0,131, - 1,0,83,87,113,88,0,4,116,4,0,107,10,0,114,55, - 0,1,1,1,89,113,88,0,88,110,29,0,124,0,0,106, - 0,0,116,1,0,116,5,0,131,1,0,131,1,0,114,84, - 0,124,0,0,83,100,0,0,83,100,0,0,83,41,1,78, - 41,6,218,8,101,110,100,115,119,105,116,104,218,5,116,117, - 112,108,101,114,86,0,0,0,114,81,0,0,0,114,68,0, - 0,0,114,76,0,0,0,41,1,218,8,102,105,108,101,110, - 97,109,101,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,218,11,95,103,101,116,95,99,97,99,104,101,100,94, - 1,0,0,115,16,0,0,0,0,1,21,1,3,1,14,1, - 13,1,8,1,21,1,4,2,114,97,0,0,0,99,1,0, - 0,0,0,0,0,0,2,0,0,0,11,0,0,0,67,0, - 0,0,115,60,0,0,0,121,19,0,116,0,0,124,0,0, - 131,1,0,106,1,0,125,1,0,87,110,24,0,4,116,2, - 0,107,10,0,114,45,0,1,1,1,100,1,0,125,1,0, - 89,110,1,0,88,124,1,0,100,2,0,79,125,1,0,124, - 1,0,83,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,105,182,1,0,0,233, - 128,0,0,0,41,3,114,41,0,0,0,114,43,0,0,0, - 114,42,0,0,0,41,2,114,37,0,0,0,114,44,0,0, + 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,20,1,0,0,115, + 46,0,0,0,0,18,12,1,9,1,7,1,12,1,6,1, + 12,1,18,1,18,1,24,1,12,1,12,1,12,1,36,1, + 12,1,18,1,9,2,12,1,12,1,12,1,12,1,21,1, + 21,1,114,81,0,0,0,99,1,0,0,0,0,0,0,0, + 8,0,0,0,5,0,0,0,67,0,0,0,115,62,1,0, + 0,116,0,0,106,1,0,106,2,0,100,1,0,107,8,0, + 114,30,0,116,3,0,100,2,0,131,1,0,130,1,0,116, + 4,0,124,0,0,131,1,0,92,2,0,125,1,0,125,2, + 0,116,4,0,124,1,0,131,1,0,92,2,0,125,1,0, + 125,3,0,124,3,0,116,5,0,107,3,0,114,102,0,116, + 6,0,100,3,0,106,7,0,116,5,0,124,0,0,131,2, + 0,131,1,0,130,1,0,124,2,0,106,8,0,100,4,0, + 131,1,0,125,4,0,124,4,0,100,11,0,107,7,0,114, + 153,0,116,6,0,100,7,0,106,7,0,124,2,0,131,1, + 0,131,1,0,130,1,0,110,125,0,124,4,0,100,6,0, + 107,2,0,114,22,1,124,2,0,106,9,0,100,4,0,100, + 5,0,131,2,0,100,12,0,25,125,5,0,124,5,0,106, + 10,0,116,11,0,131,1,0,115,223,0,116,6,0,100,8, + 0,106,7,0,116,11,0,131,1,0,131,1,0,130,1,0, + 124,5,0,116,12,0,116,11,0,131,1,0,100,1,0,133, + 2,0,25,125,6,0,124,6,0,106,13,0,131,0,0,115, + 22,1,116,6,0,100,9,0,106,7,0,124,5,0,131,1, + 0,131,1,0,130,1,0,124,2,0,106,14,0,100,4,0, + 131,1,0,100,10,0,25,125,7,0,116,15,0,124,1,0, + 124,7,0,116,16,0,100,10,0,25,23,131,2,0,83,41, + 13,97,110,1,0,0,71,105,118,101,110,32,116,104,101,32, + 112,97,116,104,32,116,111,32,97,32,46,112,121,99,46,32, + 102,105,108,101,44,32,114,101,116,117,114,110,32,116,104,101, + 32,112,97,116,104,32,116,111,32,105,116,115,32,46,112,121, + 32,102,105,108,101,46,10,10,32,32,32,32,84,104,101,32, + 46,112,121,99,32,102,105,108,101,32,100,111,101,115,32,110, + 111,116,32,110,101,101,100,32,116,111,32,101,120,105,115,116, + 59,32,116,104,105,115,32,115,105,109,112,108,121,32,114,101, + 116,117,114,110,115,32,116,104,101,32,112,97,116,104,32,116, + 111,10,32,32,32,32,116,104,101,32,46,112,121,32,102,105, + 108,101,32,99,97,108,99,117,108,97,116,101,100,32,116,111, + 32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116, + 104,101,32,46,112,121,99,32,102,105,108,101,46,32,32,73, + 102,32,112,97,116,104,32,100,111,101,115,10,32,32,32,32, + 110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,80, + 69,80,32,51,49,52,55,47,52,56,56,32,102,111,114,109, + 97,116,44,32,86,97,108,117,101,69,114,114,111,114,32,119, + 105,108,108,32,98,101,32,114,97,105,115,101,100,46,32,73, + 102,10,32,32,32,32,115,121,115,46,105,109,112,108,101,109, + 101,110,116,97,116,105,111,110,46,99,97,99,104,101,95,116, + 97,103,32,105,115,32,78,111,110,101,32,116,104,101,110,32, + 78,111,116,73,109,112,108,101,109,101,110,116,101,100,69,114, + 114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,10, + 32,32,32,32,78,122,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,122,37,123,125,32, + 110,111,116,32,98,111,116,116,111,109,45,108,101,118,101,108, + 32,100,105,114,101,99,116,111,114,121,32,105,110,32,123,33, + 114,125,114,60,0,0,0,114,58,0,0,0,233,3,0,0, + 0,122,33,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, + 123,33,114,125,122,57,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,123,33,114,125,122, + 52,111,112,116,105,109,105,122,97,116,105,111,110,32,108,101, + 118,101,108,32,123,33,114,125,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,61,0,0,0,62,2,0,0,0,114, + 58,0,0,0,114,82,0,0,0,233,254,255,255,255,41,17, + 114,8,0,0,0,114,66,0,0,0,114,67,0,0,0,114, + 68,0,0,0,114,40,0,0,0,114,75,0,0,0,114,73, + 0,0,0,114,49,0,0,0,218,5,99,111,117,110,116,114, + 36,0,0,0,114,10,0,0,0,114,74,0,0,0,114,33, + 0,0,0,114,72,0,0,0,218,9,112,97,114,116,105,116, + 105,111,110,114,30,0,0,0,218,15,83,79,85,82,67,69, + 95,83,85,70,70,73,88,69,83,41,8,114,37,0,0,0, + 114,78,0,0,0,90,16,112,121,99,97,99,104,101,95,102, + 105,108,101,110,97,109,101,90,7,112,121,99,97,99,104,101, + 90,9,100,111,116,95,99,111,117,110,116,114,59,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,4,0,0,0,114, + 4,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,64,1,0,0, + 115,44,0,0,0,0,9,18,1,12,1,18,1,18,1,12, + 1,9,1,15,1,15,1,12,1,9,1,15,1,12,1,22, + 1,15,1,9,1,12,1,22,1,12,1,9,1,12,1,19, + 1,114,87,0,0,0,99,1,0,0,0,0,0,0,0,5, + 0,0,0,12,0,0,0,67,0,0,0,115,164,0,0,0, + 116,0,0,124,0,0,131,1,0,100,1,0,107,2,0,114, + 22,0,100,2,0,83,124,0,0,106,1,0,100,3,0,131, + 1,0,92,3,0,125,1,0,125,2,0,125,3,0,124,1, + 0,12,115,81,0,124,3,0,106,2,0,131,0,0,100,7, + 0,100,8,0,133,2,0,25,100,6,0,107,3,0,114,85, + 0,124,0,0,83,121,16,0,116,3,0,124,0,0,131,1, + 0,125,4,0,87,110,40,0,4,116,4,0,116,5,0,102, + 2,0,107,10,0,114,143,0,1,1,1,124,0,0,100,2, + 0,100,9,0,133,2,0,25,125,4,0,89,110,1,0,88, + 116,6,0,124,4,0,131,1,0,114,160,0,124,4,0,83, + 124,0,0,83,41,10,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,61,0,0,0,78,114,60,0,0,0,114, + 82,0,0,0,114,31,0,0,0,90,2,112,121,233,253,255, + 255,255,233,255,255,255,255,114,89,0,0,0,41,7,114,33, + 0,0,0,114,34,0,0,0,218,5,108,111,119,101,114,114, + 87,0,0,0,114,68,0,0,0,114,73,0,0,0,114,46, + 0,0,0,41,5,218,13,98,121,116,101,99,111,100,101,95, + 112,97,116,104,114,80,0,0,0,114,38,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,4,0,0,0,114,4,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,97,1,0,0,115,20,0,0,0,0, + 7,18,1,4,1,24,1,35,1,4,1,3,1,16,1,19, + 1,21,1,114,93,0,0,0,99,1,0,0,0,0,0,0, + 0,1,0,0,0,11,0,0,0,67,0,0,0,115,92,0, + 0,0,124,0,0,106,0,0,116,1,0,116,2,0,131,1, + 0,131,1,0,114,59,0,121,14,0,116,3,0,124,0,0, + 131,1,0,83,87,113,88,0,4,116,4,0,107,10,0,114, + 55,0,1,1,1,89,113,88,0,88,110,29,0,124,0,0, + 106,0,0,116,1,0,116,5,0,131,1,0,131,1,0,114, + 84,0,124,0,0,83,100,0,0,83,100,0,0,83,41,1, + 78,41,6,218,8,101,110,100,115,119,105,116,104,218,5,116, + 117,112,108,101,114,86,0,0,0,114,81,0,0,0,114,68, + 0,0,0,114,76,0,0,0,41,1,218,8,102,105,108,101, + 110,97,109,101,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,218,11,95,103,101,116,95,99,97,99,104,101,100, + 116,1,0,0,115,16,0,0,0,0,1,21,1,3,1,14, + 1,13,1,8,1,21,1,4,2,114,97,0,0,0,99,1, + 0,0,0,0,0,0,0,2,0,0,0,11,0,0,0,67, + 0,0,0,115,60,0,0,0,121,19,0,116,0,0,124,0, + 0,131,1,0,106,1,0,125,1,0,87,110,24,0,4,116, + 2,0,107,10,0,114,45,0,1,1,1,100,1,0,125,1, + 0,89,110,1,0,88,124,1,0,100,2,0,79,125,1,0, + 124,1,0,83,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,105,182,1,0,0, + 233,128,0,0,0,41,3,114,41,0,0,0,114,43,0,0, + 0,114,42,0,0,0,41,2,114,37,0,0,0,114,44,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,10,95,99,97,108,99,95,109,111,100,101,128,1,0, + 0,115,12,0,0,0,0,2,3,1,19,1,13,1,11,3, + 10,1,114,99,0,0,0,218,9,118,101,114,98,111,115,105, + 116,121,114,31,0,0,0,99,1,0,0,0,1,0,0,0, + 3,0,0,0,4,0,0,0,71,0,0,0,115,75,0,0, + 0,116,0,0,106,1,0,106,2,0,124,1,0,107,5,0, + 114,71,0,124,0,0,106,3,0,100,6,0,131,1,0,115, + 43,0,100,3,0,124,0,0,23,125,0,0,116,4,0,124, + 0,0,106,5,0,124,2,0,140,0,0,100,4,0,116,0, + 0,106,6,0,131,1,1,1,100,5,0,83,41,7,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,250,1,35, + 250,7,105,109,112,111,114,116,32,122,2,35,32,114,56,0, + 0,0,78,41,2,114,101,0,0,0,114,102,0,0,0,41, + 7,114,8,0,0,0,114,69,0,0,0,218,7,118,101,114, + 98,111,115,101,114,10,0,0,0,218,5,112,114,105,110,116, + 114,49,0,0,0,218,6,115,116,100,101,114,114,41,3,114, + 77,0,0,0,114,100,0,0,0,218,4,97,114,103,115,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,218,16, + 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, + 140,1,0,0,115,8,0,0,0,0,2,18,1,15,1,10, + 1,114,107,0,0,0,99,1,0,0,0,0,0,0,0,3, + 0,0,0,11,0,0,0,3,0,0,0,115,84,0,0,0, + 100,1,0,135,0,0,102,1,0,100,2,0,100,3,0,134, + 1,0,125,1,0,121,13,0,116,0,0,106,1,0,125,2, + 0,87,110,30,0,4,116,2,0,107,10,0,114,66,0,1, + 1,1,100,4,0,100,5,0,132,0,0,125,2,0,89,110, + 1,0,88,124,2,0,124,1,0,136,0,0,131,2,0,1, + 124,1,0,83,41,6,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,4,0, + 0,0,5,0,0,0,31,0,0,0,115,89,0,0,0,124, + 1,0,100,0,0,107,8,0,114,24,0,124,0,0,106,0, + 0,125,1,0,110,46,0,124,0,0,106,0,0,124,1,0, + 107,3,0,114,70,0,116,1,0,100,1,0,124,0,0,106, + 0,0,124,1,0,102,2,0,22,100,2,0,124,1,0,131, + 1,1,130,1,0,136,0,0,124,0,0,124,1,0,124,2, + 0,124,3,0,142,2,0,83,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,218,4,110,97,109, + 101,41,2,114,108,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,108,0, + 0,0,114,106,0,0,0,90,6,107,119,97,114,103,115,41, + 1,218,6,109,101,116,104,111,100,114,4,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,156,1,0,0,115,12,0,0, + 0,0,1,12,1,12,1,15,1,6,1,25,1,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, + 3,0,0,0,7,0,0,0,83,0,0,0,115,92,0,0, + 0,120,66,0,100,1,0,100,2,0,100,3,0,100,4,0, + 103,4,0,68,93,46,0,125,2,0,116,0,0,124,1,0, + 124,2,0,131,2,0,114,19,0,116,1,0,124,0,0,124, + 2,0,116,2,0,124,1,0,124,2,0,131,2,0,131,3, + 0,1,113,19,0,87,124,0,0,106,3,0,106,4,0,124, + 1,0,106,3,0,131,1,0,1,100,0,0,83,41,5,78, + 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,54,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,218,5,95,119, + 114,97,112,167,1,0,0,115,8,0,0,0,0,1,25,1, + 15,1,29,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,3,218,10,95,98,111,111,116,115,116,114,97,112,114,122, + 0,0,0,218,9,78,97,109,101,69,114,114,111,114,41,3, + 114,111,0,0,0,114,112,0,0,0,114,122,0,0,0,114, + 4,0,0,0,41,1,114,111,0,0,0,114,6,0,0,0, + 218,11,95,99,104,101,99,107,95,110,97,109,101,148,1,0, + 0,115,14,0,0,0,0,8,21,7,3,1,13,1,13,2, + 17,5,13,1,114,125,0,0,0,99,2,0,0,0,0,0, + 0,0,5,0,0,0,4,0,0,0,67,0,0,0,115,84, + 0,0,0,124,0,0,106,0,0,124,1,0,131,1,0,92, + 2,0,125,2,0,125,3,0,124,2,0,100,1,0,107,8, + 0,114,80,0,116,1,0,124,3,0,131,1,0,114,80,0, + 100,2,0,125,4,0,116,2,0,106,3,0,124,4,0,106, + 4,0,124,3,0,100,3,0,25,131,1,0,116,5,0,131, + 2,0,1,124,2,0,83,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,61,0,0,0,41,6,218,11,102,105, + 110,100,95,108,111,97,100,101,114,114,33,0,0,0,114,62, + 0,0,0,114,63,0,0,0,114,49,0,0,0,218,13,73, + 109,112,111,114,116,87,97,114,110,105,110,103,41,5,114,110, + 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,4,0,0,0,114,4,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,176,1,0,0,115,10,0,0,0,0, + 10,21,1,24,1,6,1,29,1,114,132,0,0,0,99,4, + 0,0,0,0,0,0,0,11,0,0,0,19,0,0,0,67, + 0,0,0,115,252,1,0,0,105,0,0,125,4,0,124,2, + 0,100,1,0,107,9,0,114,31,0,124,2,0,124,4,0, + 100,2,0,60,110,6,0,100,3,0,125,2,0,124,3,0, + 100,1,0,107,9,0,114,59,0,124,3,0,124,4,0,100, + 4,0,60,124,0,0,100,1,0,100,5,0,133,2,0,25, + 125,5,0,124,0,0,100,5,0,100,6,0,133,2,0,25, + 125,6,0,124,0,0,100,6,0,100,7,0,133,2,0,25, + 125,7,0,124,5,0,116,0,0,107,3,0,114,180,0,124, + 5,0,116,1,0,107,3,0,114,180,0,100,8,0,106,2, + 0,124,2,0,124,5,0,131,2,0,125,8,0,116,3,0, + 100,9,0,124,8,0,131,2,0,1,116,4,0,124,8,0, + 124,4,0,141,1,0,130,1,0,110,119,0,116,5,0,124, + 6,0,131,1,0,100,5,0,107,3,0,114,241,0,100,10, + 0,106,2,0,124,2,0,131,1,0,125,8,0,116,3,0, + 100,9,0,124,8,0,131,2,0,1,116,6,0,124,8,0, + 131,1,0,130,1,0,110,58,0,116,5,0,124,7,0,131, + 1,0,100,5,0,107,3,0,114,43,1,100,11,0,106,2, + 0,124,2,0,131,1,0,125,8,0,116,3,0,100,9,0, + 124,8,0,131,2,0,1,116,6,0,124,8,0,131,1,0, + 130,1,0,124,1,0,100,1,0,107,9,0,114,238,1,121, + 20,0,116,7,0,124,1,0,100,12,0,25,131,1,0,125, + 9,0,87,110,18,0,4,116,8,0,107,10,0,114,95,1, + 1,1,1,89,110,62,0,88,116,9,0,124,6,0,131,1, + 0,124,9,0,107,3,0,114,157,1,100,13,0,106,2,0, + 124,2,0,131,1,0,125,8,0,116,3,0,100,9,0,124, + 8,0,131,2,0,1,116,4,0,124,8,0,124,4,0,141, + 1,0,130,1,0,121,18,0,124,1,0,100,14,0,25,100, + 15,0,64,125,10,0,87,110,18,0,4,116,8,0,107,10, + 0,114,195,1,1,1,1,89,110,43,0,88,116,9,0,124, + 7,0,131,1,0,124,10,0,107,3,0,114,238,1,116,4, + 0,100,13,0,106,2,0,124,2,0,131,1,0,124,4,0, + 141,1,0,130,1,0,124,0,0,100,7,0,100,1,0,133, + 2,0,25,83,41,16,97,122,1,0,0,86,97,108,105,100, + 97,116,101,32,116,104,101,32,104,101,97,100,101,114,32,111, + 102,32,116,104,101,32,112,97,115,115,101,100,45,105,110,32, + 98,121,116,101,99,111,100,101,32,97,103,97,105,110,115,116, + 32,115,111,117,114,99,101,95,115,116,97,116,115,32,40,105, + 102,10,32,32,32,32,103,105,118,101,110,41,32,97,110,100, + 32,114,101,116,117,114,110,105,110,103,32,116,104,101,32,98, + 121,116,101,99,111,100,101,32,116,104,97,116,32,99,97,110, + 32,98,101,32,99,111,109,112,105,108,101,100,32,98,121,32, + 99,111,109,112,105,108,101,40,41,46,10,10,32,32,32,32, + 65,108,108,32,111,116,104,101,114,32,97,114,103,117,109,101, + 110,116,115,32,97,114,101,32,117,115,101,100,32,116,111,32, + 101,110,104,97,110,99,101,32,101,114,114,111,114,32,114,101, + 112,111,114,116,105,110,103,46,10,10,32,32,32,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,119,104,101,110,32,116,104,101,32,109,97,103, + 105,99,32,110,117,109,98,101,114,32,105,115,32,105,110,99, + 111,114,114,101,99,116,32,111,114,32,116,104,101,32,98,121, + 116,101,99,111,100,101,32,105,115,10,32,32,32,32,102,111, + 117,110,100,32,116,111,32,98,101,32,115,116,97,108,101,46, + 32,69,79,70,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,32,119,104,101,110,32,116,104,101,32,100,97,116, + 97,32,105,115,32,102,111,117,110,100,32,116,111,32,98,101, + 10,32,32,32,32,116,114,117,110,99,97,116,101,100,46,10, + 10,32,32,32,32,78,114,108,0,0,0,122,10,60,98,121, + 116,101,99,111,100,101,62,114,37,0,0,0,114,14,0,0, + 0,233,8,0,0,0,233,12,0,0,0,122,30,98,97,100, + 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, + 32,123,33,114,125,58,32,123,33,114,125,122,2,123,125,122, + 43,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,116,105,109,101,115, + 116,97,109,112,32,105,110,32,123,33,114,125,122,48,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,115,105,122,101,32,111,102,32, + 115,111,117,114,99,101,32,105,110,32,123,33,114,125,218,5, + 109,116,105,109,101,122,26,98,121,116,101,99,111,100,101,32, + 105,115,32,115,116,97,108,101,32,102,111,114,32,123,33,114, + 125,218,4,115,105,122,101,108,3,0,0,0,255,127,255,127, + 3,0,41,10,218,12,77,65,71,73,67,95,78,85,77,66, + 69,82,218,24,95,66,65,67,75,67,79,77,80,65,84,95, + 77,65,71,73,67,95,78,85,77,66,69,82,114,49,0,0, + 0,114,107,0,0,0,114,109,0,0,0,114,33,0,0,0, + 218,8,69,79,70,69,114,114,111,114,114,16,0,0,0,218, + 8,75,101,121,69,114,114,111,114,114,21,0,0,0,41,11, + 114,55,0,0,0,218,12,115,111,117,114,99,101,95,115,116, + 97,116,115,114,108,0,0,0,114,37,0,0,0,90,11,101, + 120,99,95,100,101,116,97,105,108,115,90,5,109,97,103,105, + 99,90,13,114,97,119,95,116,105,109,101,115,116,97,109,112, + 90,8,114,97,119,95,115,105,122,101,114,77,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,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,218,25,95,118,97,108,105, + 100,97,116,101,95,98,121,116,101,99,111,100,101,95,104,101, + 97,100,101,114,193,1,0,0,115,78,0,0,0,0,11,6, + 1,12,1,13,3,6,1,12,1,10,1,16,1,16,1,16, + 1,12,2,12,1,18,1,13,1,18,1,18,1,15,1,13, + 1,15,1,18,1,15,1,13,1,12,1,12,1,3,1,20, + 1,13,1,5,2,18,1,15,1,13,1,15,1,3,1,18, + 1,13,1,5,2,18,1,15,1,9,1,114,144,0,0,0, + 99,4,0,0,0,0,0,0,0,5,0,0,0,6,0,0, + 0,67,0,0,0,115,112,0,0,0,116,0,0,106,1,0, + 124,0,0,131,1,0,125,4,0,116,2,0,124,4,0,116, + 3,0,131,2,0,114,75,0,116,4,0,100,1,0,124,2, + 0,131,2,0,1,124,3,0,100,2,0,107,9,0,114,71, + 0,116,5,0,106,6,0,124,4,0,124,3,0,131,2,0, + 1,124,4,0,83,116,7,0,100,3,0,106,8,0,124,2, + 0,131,1,0,100,4,0,124,1,0,100,5,0,124,2,0, + 131,1,2,130,1,0,100,2,0,83,41,6,122,60,67,111, + 109,112,105,108,101,32,98,121,116,101,99,111,100,101,32,97, + 115,32,114,101,116,117,114,110,101,100,32,98,121,32,95,118, + 97,108,105,100,97,116,101,95,98,121,116,101,99,111,100,101, + 95,104,101,97,100,101,114,40,41,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,114,108,0,0,0, + 114,37,0,0,0,41,9,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, + 107,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,109,0,0, + 0,114,49,0,0,0,41,5,114,55,0,0,0,114,108,0, + 0,0,114,91,0,0,0,114,92,0,0,0,218,4,99,111, + 100,101,114,4,0,0,0,114,4,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,250,1,0,0,115,16,0,0,0,0,2,15, + 1,15,1,13,1,12,1,16,1,4,2,18,1,114,150,0, + 0,0,114,61,0,0,0,99,3,0,0,0,0,0,0,0, + 4,0,0,0,3,0,0,0,67,0,0,0,115,76,0,0, + 0,116,0,0,116,1,0,131,1,0,125,3,0,124,3,0, + 106,2,0,116,3,0,124,1,0,131,1,0,131,1,0,1, + 124,3,0,106,2,0,116,3,0,124,2,0,131,1,0,131, + 1,0,1,124,3,0,106,2,0,116,4,0,106,5,0,124, + 0,0,131,1,0,131,1,0,1,124,3,0,83,41,1,122, + 80,67,111,109,112,105,108,101,32,97,32,99,111,100,101,32, + 111,98,106,101,99,116,32,105,110,116,111,32,98,121,116,101, + 99,111,100,101,32,102,111,114,32,119,114,105,116,105,110,103, + 32,111,117,116,32,116,111,32,97,32,98,121,116,101,45,99, + 111,109,112,105,108,101,100,10,32,32,32,32,102,105,108,101, + 46,41,6,218,9,98,121,116,101,97,114,114,97,121,114,137, + 0,0,0,218,6,101,120,116,101,110,100,114,19,0,0,0, + 114,145,0,0,0,90,5,100,117,109,112,115,41,4,114,149, + 0,0,0,114,135,0,0,0,114,143,0,0,0,114,55,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,17,95,99,111,100,101,95,116,111,95,98,121,116,101, + 99,111,100,101,6,2,0,0,115,10,0,0,0,0,3,12, + 1,19,1,19,1,22,1,114,153,0,0,0,99,1,0,0, + 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, + 0,115,89,0,0,0,100,1,0,100,2,0,108,0,0,125, + 1,0,116,1,0,106,2,0,124,0,0,131,1,0,106,3, + 0,125,2,0,124,1,0,106,4,0,124,2,0,131,1,0, + 125,3,0,116,1,0,106,5,0,100,2,0,100,3,0,131, + 2,0,125,4,0,124,4,0,106,6,0,124,0,0,106,6, + 0,124,3,0,100,1,0,25,131,1,0,131,1,0,83,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,61,0,0, + 0,78,84,41,7,218,8,116,111,107,101,110,105,122,101,114, + 51,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,154,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,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,13,100,101,99,111,100,101,95,115,111,117,114,99,101, + 16,2,0,0,115,10,0,0,0,0,5,12,1,18,1,15, + 1,18,1,114,158,0,0,0,114,129,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,2,0, + 0,0,9,0,0,0,19,0,0,0,67,0,0,0,115,89, + 1,0,0,124,1,0,100,1,0,107,8,0,114,73,0,100, + 2,0,125,1,0,116,0,0,124,2,0,100,3,0,131,2, + 0,114,73,0,121,19,0,124,2,0,106,1,0,124,0,0, + 131,1,0,125,1,0,87,110,18,0,4,116,2,0,107,10, + 0,114,72,0,1,1,1,89,110,1,0,88,116,3,0,106, + 4,0,124,0,0,124,2,0,100,4,0,124,1,0,131,2, + 1,125,4,0,100,5,0,124,4,0,95,5,0,124,2,0, + 100,1,0,107,8,0,114,194,0,120,73,0,116,6,0,131, + 0,0,68,93,58,0,92,2,0,125,5,0,125,6,0,124, + 1,0,106,7,0,116,8,0,124,6,0,131,1,0,131,1, + 0,114,128,0,124,5,0,124,0,0,124,1,0,131,2,0, + 125,2,0,124,2,0,124,4,0,95,9,0,80,113,128,0, + 87,100,1,0,83,124,3,0,116,10,0,107,8,0,114,23, + 1,116,0,0,124,2,0,100,6,0,131,2,0,114,32,1, + 121,19,0,124,2,0,106,11,0,124,0,0,131,1,0,125, + 7,0,87,110,18,0,4,116,2,0,107,10,0,114,4,1, + 1,1,1,89,113,32,1,88,124,7,0,114,32,1,103,0, + 0,124,4,0,95,12,0,110,9,0,124,3,0,124,4,0, + 95,12,0,124,4,0,106,12,0,103,0,0,107,2,0,114, + 85,1,124,1,0,114,85,1,116,13,0,124,1,0,131,1, + 0,100,7,0,25,125,8,0,124,4,0,106,12,0,106,14, + 0,124,8,0,131,1,0,1,124,4,0,83,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,218,6,111,114,105,103, + 105,110,84,218,10,105,115,95,112,97,99,107,97,103,101,114, + 61,0,0,0,41,15,114,117,0,0,0,114,160,0,0,0, + 114,109,0,0,0,114,123,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,94,0,0,0,114,95,0,0,0,114,129,0,0, + 0,218,9,95,80,79,80,85,76,65,84,69,114,162,0,0, + 0,114,159,0,0,0,114,40,0,0,0,218,6,97,112,112, + 101,110,100,41,9,114,108,0,0,0,90,8,108,111,99,97, + 116,105,111,110,114,129,0,0,0,114,159,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,162,0,0, + 0,90,7,100,105,114,110,97,109,101,114,4,0,0,0,114, + 4,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,33,2,0,0,115,60,0,0,0,0,12,12,4,6, + 1,15,2,3,1,19,1,13,1,5,8,24,1,9,3,12, + 1,22,1,21,1,15,1,9,1,5,2,4,3,12,2,15, + 1,3,1,19,1,13,1,5,2,6,1,12,2,9,1,15, + 1,6,1,16,1,16,2,114,170,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,5,0,0,0,64,0,0, + 0,115,121,0,0,0,101,0,0,90,1,0,100,0,0,90, + 2,0,100,1,0,90,3,0,100,2,0,90,4,0,100,3, + 0,90,5,0,100,4,0,90,6,0,101,7,0,100,5,0, + 100,6,0,132,0,0,131,1,0,90,8,0,101,7,0,100, + 7,0,100,8,0,132,0,0,131,1,0,90,9,0,101,7, + 0,100,9,0,100,9,0,100,10,0,100,11,0,132,2,0, + 131,1,0,90,10,0,101,7,0,100,9,0,100,12,0,100, + 13,0,132,1,0,131,1,0,90,11,0,100,9,0,83,41, + 14,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,2,0,0,0,11,0,0,0,67,0,0,0,115,67, + 0,0,0,121,23,0,116,0,0,106,1,0,116,0,0,106, + 2,0,124,1,0,131,2,0,83,87,110,37,0,4,116,3, + 0,107,10,0,114,62,0,1,1,1,116,0,0,106,1,0, + 116,0,0,106,4,0,124,1,0,131,2,0,83,89,110,1, + 0,88,100,0,0,83,41,1,78,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,42,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,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,218,14,95,111,112,101,110,95,114,101,103,105, + 115,116,114,121,111,2,0,0,115,8,0,0,0,0,2,3, + 1,23,1,13,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,6,0,0,0,16,0,0,0,67,0,0,0, + 115,143,0,0,0,124,0,0,106,0,0,114,21,0,124,0, + 0,106,1,0,125,2,0,110,9,0,124,0,0,106,2,0, + 125,2,0,124,2,0,106,3,0,100,1,0,124,1,0,100, + 2,0,116,4,0,106,5,0,100,0,0,100,3,0,133,2, + 0,25,131,0,2,125,3,0,121,47,0,124,0,0,106,6, + 0,124,3,0,131,1,0,143,25,0,125,4,0,116,7,0, + 106,8,0,124,4,0,100,4,0,131,2,0,125,5,0,87, + 100,0,0,81,82,88,87,110,22,0,4,116,9,0,107,10, + 0,114,138,0,1,1,1,100,0,0,83,89,110,1,0,88, + 124,5,0,83,41,5,78,114,128,0,0,0,90,11,115,121, + 115,95,118,101,114,115,105,111,110,114,82,0,0,0,114,32, + 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,49,0,0,0,114,8,0,0,0,218,7, + 118,101,114,115,105,111,110,114,174,0,0,0,114,172,0,0, + 0,90,10,81,117,101,114,121,86,97,108,117,101,114,42,0, + 0,0,41,6,114,173,0,0,0,114,128,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,4,0,0,0,114,4,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,118,2,0,0,115,22,0,0,0,0,2,9,1,12, + 2,9,1,15,1,22,1,3,1,18,1,29,1,13,1,9, + 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,8,0,0,0,14,0,0,0,67,0,0,0,115, + 158,0,0,0,124,0,0,106,0,0,124,1,0,131,1,0, + 125,4,0,124,4,0,100,0,0,107,8,0,114,31,0,100, + 0,0,83,121,14,0,116,1,0,124,4,0,131,1,0,1, + 87,110,22,0,4,116,2,0,107,10,0,114,69,0,1,1, + 1,100,0,0,83,89,110,1,0,88,120,81,0,116,3,0, + 131,0,0,68,93,70,0,92,2,0,125,5,0,125,6,0, + 124,4,0,106,4,0,116,5,0,124,6,0,131,1,0,131, + 1,0,114,80,0,116,6,0,106,7,0,124,1,0,124,5, + 0,124,1,0,124,4,0,131,2,0,100,1,0,124,4,0, + 131,2,1,125,7,0,124,7,0,83,113,80,0,87,100,0, + 0,83,41,2,78,114,161,0,0,0,41,8,114,180,0,0, + 0,114,41,0,0,0,114,42,0,0,0,114,164,0,0,0, + 114,94,0,0,0,114,95,0,0,0,114,123,0,0,0,218, + 16,115,112,101,99,95,102,114,111,109,95,108,111,97,100,101, + 114,41,8,114,173,0,0,0,114,128,0,0,0,114,37,0, + 0,0,218,6,116,97,114,103,101,116,114,179,0,0,0,114, + 129,0,0,0,114,169,0,0,0,114,167,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,6,0,0,0,218,9,102, + 105,110,100,95,115,112,101,99,133,2,0,0,115,26,0,0, + 0,0,2,15,1,12,1,4,1,3,1,14,1,13,1,9, + 1,22,1,21,1,9,1,15,1,9,1,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,4,0,0,0,3,0,0,0,67,0,0, + 0,115,45,0,0,0,124,0,0,106,0,0,124,1,0,124, + 2,0,131,2,0,125,3,0,124,3,0,100,1,0,107,9, + 0,114,37,0,124,3,0,106,1,0,83,100,1,0,83,100, + 1,0,83,41,2,122,108,70,105,110,100,32,109,111,100,117, + 108,101,32,110,97,109,101,100,32,105,110,32,116,104,101,32, + 114,101,103,105,115,116,114,121,46,10,10,32,32,32,32,32, + 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, + 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, + 115,101,32,101,120,101,99,95,109,111,100,117,108,101,40,41, + 32,105,110,115,116,101,97,100,46,10,10,32,32,32,32,32, + 32,32,32,78,41,2,114,183,0,0,0,114,129,0,0,0, + 41,4,114,173,0,0,0,114,128,0,0,0,114,37,0,0, + 0,114,167,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,6,0,0,0,218,11,102,105,110,100,95,109,111,100,117, + 108,101,149,2,0,0,115,8,0,0,0,0,7,18,1,12, + 1,7,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,12,114,114,0,0,0,114,113,0, + 0,0,114,115,0,0,0,114,116,0,0,0,114,177,0,0, + 0,114,176,0,0,0,114,175,0,0,0,218,11,99,108,97, + 115,115,109,101,116,104,111,100,114,174,0,0,0,114,180,0, + 0,0,114,183,0,0,0,114,184,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 218,10,95,99,97,108,99,95,109,111,100,101,106,1,0,0, - 115,12,0,0,0,0,2,3,1,19,1,13,1,11,3,10, - 1,114,99,0,0,0,218,9,118,101,114,98,111,115,105,116, - 121,114,31,0,0,0,99,1,0,0,0,1,0,0,0,3, - 0,0,0,4,0,0,0,71,0,0,0,115,75,0,0,0, - 116,0,0,106,1,0,106,2,0,124,1,0,107,5,0,114, - 71,0,124,0,0,106,3,0,100,6,0,131,1,0,115,43, - 0,100,3,0,124,0,0,23,125,0,0,116,4,0,124,0, - 0,106,5,0,124,2,0,140,0,0,100,4,0,116,0,0, - 106,6,0,131,1,1,1,100,5,0,83,41,7,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,250,1,35,250, - 7,105,109,112,111,114,116,32,122,2,35,32,114,56,0,0, - 0,78,41,2,114,101,0,0,0,114,102,0,0,0,41,7, - 114,8,0,0,0,114,69,0,0,0,218,7,118,101,114,98, - 111,115,101,114,10,0,0,0,218,5,112,114,105,110,116,114, - 49,0,0,0,218,6,115,116,100,101,114,114,41,3,114,77, - 0,0,0,114,100,0,0,0,218,4,97,114,103,115,114,4, - 0,0,0,114,4,0,0,0,114,6,0,0,0,218,16,95, - 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,118, - 1,0,0,115,8,0,0,0,0,2,18,1,15,1,10,1, - 114,107,0,0,0,99,1,0,0,0,0,0,0,0,3,0, - 0,0,11,0,0,0,3,0,0,0,115,84,0,0,0,100, - 1,0,135,0,0,102,1,0,100,2,0,100,3,0,134,1, - 0,125,1,0,121,13,0,116,0,0,106,1,0,125,2,0, - 87,110,30,0,4,116,2,0,107,10,0,114,66,0,1,1, - 1,100,4,0,100,5,0,132,0,0,125,2,0,89,110,1, - 0,88,124,2,0,124,1,0,136,0,0,131,2,0,1,124, - 1,0,83,41,6,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,4,0,0, - 0,5,0,0,0,31,0,0,0,115,89,0,0,0,124,1, - 0,100,0,0,107,8,0,114,24,0,124,0,0,106,0,0, - 125,1,0,110,46,0,124,0,0,106,0,0,124,1,0,107, - 3,0,114,70,0,116,1,0,100,1,0,124,0,0,106,0, - 0,124,1,0,102,2,0,22,100,2,0,124,1,0,131,1, - 1,130,1,0,136,0,0,124,0,0,124,1,0,124,2,0, - 124,3,0,142,2,0,83,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,218,4,110,97,109,101, - 41,2,114,108,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,108,0,0, - 0,114,106,0,0,0,90,6,107,119,97,114,103,115,41,1, - 218,6,109,101,116,104,111,100,114,4,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,134,1,0,0,115,12,0,0,0, - 0,1,12,1,12,1,15,1,6,1,25,1,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,3, - 0,0,0,7,0,0,0,83,0,0,0,115,92,0,0,0, - 120,66,0,100,1,0,100,2,0,100,3,0,100,4,0,103, - 4,0,68,93,46,0,125,2,0,116,0,0,124,1,0,124, - 2,0,131,2,0,114,19,0,116,1,0,124,0,0,124,2, - 0,116,2,0,124,1,0,124,2,0,131,2,0,131,3,0, - 1,113,19,0,87,124,0,0,106,3,0,106,4,0,124,1, - 0,106,3,0,131,1,0,1,100,0,0,83,41,5,78,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,54,0,0,0,114,4,0,0, - 0,114,4,0,0,0,114,6,0,0,0,218,5,95,119,114, - 97,112,145,1,0,0,115,8,0,0,0,0,1,25,1,15, - 1,29,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, - 3,218,10,95,98,111,111,116,115,116,114,97,112,114,122,0, - 0,0,218,9,78,97,109,101,69,114,114,111,114,41,3,114, - 111,0,0,0,114,112,0,0,0,114,122,0,0,0,114,4, - 0,0,0,41,1,114,111,0,0,0,114,6,0,0,0,218, - 11,95,99,104,101,99,107,95,110,97,109,101,126,1,0,0, - 115,14,0,0,0,0,8,21,7,3,1,13,1,13,2,17, - 5,13,1,114,125,0,0,0,99,2,0,0,0,0,0,0, - 0,5,0,0,0,4,0,0,0,67,0,0,0,115,84,0, - 0,0,124,0,0,106,0,0,124,1,0,131,1,0,92,2, - 0,125,2,0,125,3,0,124,2,0,100,1,0,107,8,0, - 114,80,0,116,1,0,124,3,0,131,1,0,114,80,0,100, - 2,0,125,4,0,116,2,0,106,3,0,124,4,0,106,4, - 0,124,3,0,100,3,0,25,131,1,0,116,5,0,131,2, - 0,1,124,2,0,83,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,61,0,0,0,41,6,218,11,102,105,110, - 100,95,108,111,97,100,101,114,114,33,0,0,0,114,62,0, - 0,0,114,63,0,0,0,114,49,0,0,0,218,13,73,109, - 112,111,114,116,87,97,114,110,105,110,103,41,5,114,110,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,4,0,0,0,114,4,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,154,1,0,0,115,10,0,0,0,0,10, - 21,1,24,1,6,1,29,1,114,132,0,0,0,99,4,0, - 0,0,0,0,0,0,11,0,0,0,19,0,0,0,67,0, - 0,0,115,240,1,0,0,105,0,0,125,4,0,124,2,0, - 100,1,0,107,9,0,114,31,0,124,2,0,124,4,0,100, - 2,0,60,110,6,0,100,3,0,125,2,0,124,3,0,100, - 1,0,107,9,0,114,59,0,124,3,0,124,4,0,100,4, - 0,60,124,0,0,100,1,0,100,5,0,133,2,0,25,125, - 5,0,124,0,0,100,5,0,100,6,0,133,2,0,25,125, - 6,0,124,0,0,100,6,0,100,7,0,133,2,0,25,125, - 7,0,124,5,0,116,0,0,107,3,0,114,168,0,100,8, - 0,106,1,0,124,2,0,124,5,0,131,2,0,125,8,0, - 116,2,0,100,9,0,124,8,0,131,2,0,1,116,3,0, - 124,8,0,124,4,0,141,1,0,130,1,0,110,119,0,116, - 4,0,124,6,0,131,1,0,100,5,0,107,3,0,114,229, - 0,100,10,0,106,1,0,124,2,0,131,1,0,125,8,0, - 116,2,0,100,9,0,124,8,0,131,2,0,1,116,5,0, - 124,8,0,131,1,0,130,1,0,110,58,0,116,4,0,124, - 7,0,131,1,0,100,5,0,107,3,0,114,31,1,100,11, - 0,106,1,0,124,2,0,131,1,0,125,8,0,116,2,0, - 100,9,0,124,8,0,131,2,0,1,116,5,0,124,8,0, - 131,1,0,130,1,0,124,1,0,100,1,0,107,9,0,114, - 226,1,121,20,0,116,6,0,124,1,0,100,12,0,25,131, - 1,0,125,9,0,87,110,18,0,4,116,7,0,107,10,0, - 114,83,1,1,1,1,89,110,62,0,88,116,8,0,124,6, - 0,131,1,0,124,9,0,107,3,0,114,145,1,100,13,0, - 106,1,0,124,2,0,131,1,0,125,8,0,116,2,0,100, - 9,0,124,8,0,131,2,0,1,116,3,0,124,8,0,124, - 4,0,141,1,0,130,1,0,121,18,0,124,1,0,100,14, - 0,25,100,15,0,64,125,10,0,87,110,18,0,4,116,7, - 0,107,10,0,114,183,1,1,1,1,89,110,43,0,88,116, - 8,0,124,7,0,131,1,0,124,10,0,107,3,0,114,226, - 1,116,3,0,100,13,0,106,1,0,124,2,0,131,1,0, - 124,4,0,141,1,0,130,1,0,124,0,0,100,7,0,100, - 1,0,133,2,0,25,83,41,16,97,122,1,0,0,86,97, - 108,105,100,97,116,101,32,116,104,101,32,104,101,97,100,101, - 114,32,111,102,32,116,104,101,32,112,97,115,115,101,100,45, - 105,110,32,98,121,116,101,99,111,100,101,32,97,103,97,105, - 110,115,116,32,115,111,117,114,99,101,95,115,116,97,116,115, - 32,40,105,102,10,32,32,32,32,103,105,118,101,110,41,32, - 97,110,100,32,114,101,116,117,114,110,105,110,103,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,116,104,97,116,32, - 99,97,110,32,98,101,32,99,111,109,112,105,108,101,100,32, - 98,121,32,99,111,109,112,105,108,101,40,41,46,10,10,32, - 32,32,32,65,108,108,32,111,116,104,101,114,32,97,114,103, - 117,109,101,110,116,115,32,97,114,101,32,117,115,101,100,32, - 116,111,32,101,110,104,97,110,99,101,32,101,114,114,111,114, - 32,114,101,112,111,114,116,105,110,103,46,10,10,32,32,32, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,115,32, - 114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32, - 109,97,103,105,99,32,110,117,109,98,101,114,32,105,115,32, - 105,110,99,111,114,114,101,99,116,32,111,114,32,116,104,101, - 32,98,121,116,101,99,111,100,101,32,105,115,10,32,32,32, - 32,102,111,117,110,100,32,116,111,32,98,101,32,115,116,97, - 108,101,46,32,69,79,70,69,114,114,111,114,32,105,115,32, - 114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32, - 100,97,116,97,32,105,115,32,102,111,117,110,100,32,116,111, - 32,98,101,10,32,32,32,32,116,114,117,110,99,97,116,101, - 100,46,10,10,32,32,32,32,78,114,108,0,0,0,122,10, - 60,98,121,116,101,99,111,100,101,62,114,37,0,0,0,114, - 14,0,0,0,233,8,0,0,0,233,12,0,0,0,122,30, - 98,97,100,32,109,97,103,105,99,32,110,117,109,98,101,114, - 32,105,110,32,123,33,114,125,58,32,123,33,114,125,122,2, - 123,125,122,43,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,116,105, - 109,101,115,116,97,109,112,32,105,110,32,123,33,114,125,122, - 48,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,115,105,122,101,32, - 111,102,32,115,111,117,114,99,101,32,105,110,32,123,33,114, - 125,218,5,109,116,105,109,101,122,26,98,121,116,101,99,111, - 100,101,32,105,115,32,115,116,97,108,101,32,102,111,114,32, - 123,33,114,125,218,4,115,105,122,101,108,3,0,0,0,255, - 127,255,127,3,0,41,9,218,12,77,65,71,73,67,95,78, - 85,77,66,69,82,114,49,0,0,0,114,107,0,0,0,114, - 109,0,0,0,114,33,0,0,0,218,8,69,79,70,69,114, - 114,111,114,114,16,0,0,0,218,8,75,101,121,69,114,114, - 111,114,114,21,0,0,0,41,11,114,55,0,0,0,218,12, - 115,111,117,114,99,101,95,115,116,97,116,115,114,108,0,0, - 0,114,37,0,0,0,90,11,101,120,99,95,100,101,116,97, - 105,108,115,90,5,109,97,103,105,99,90,13,114,97,119,95, - 116,105,109,101,115,116,97,109,112,90,8,114,97,119,95,115, - 105,122,101,114,77,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,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,218,25,95,118,97,108,105,100,97,116,101,95,98,121, - 116,101,99,111,100,101,95,104,101,97,100,101,114,171,1,0, - 0,115,76,0,0,0,0,11,6,1,12,1,13,3,6,1, - 12,1,10,1,16,1,16,1,16,1,12,1,18,1,13,1, - 18,1,18,1,15,1,13,1,15,1,18,1,15,1,13,1, - 12,1,12,1,3,1,20,1,13,1,5,2,18,1,15,1, - 13,1,15,1,3,1,18,1,13,1,5,2,18,1,15,1, - 9,1,114,143,0,0,0,99,4,0,0,0,0,0,0,0, - 5,0,0,0,6,0,0,0,67,0,0,0,115,112,0,0, - 0,116,0,0,106,1,0,124,0,0,131,1,0,125,4,0, - 116,2,0,124,4,0,116,3,0,131,2,0,114,75,0,116, - 4,0,100,1,0,124,2,0,131,2,0,1,124,3,0,100, - 2,0,107,9,0,114,71,0,116,5,0,106,6,0,124,4, - 0,124,3,0,131,2,0,1,124,4,0,83,116,7,0,100, - 3,0,106,8,0,124,2,0,131,1,0,100,4,0,124,1, - 0,100,5,0,124,2,0,131,1,2,130,1,0,100,2,0, - 83,41,6,122,60,67,111,109,112,105,108,101,32,98,121,116, - 101,99,111,100,101,32,97,115,32,114,101,116,117,114,110,101, - 100,32,98,121,32,95,118,97,108,105,100,97,116,101,95,98, - 121,116,101,99,111,100,101,95,104,101,97,100,101,114,40,41, - 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,114,108,0,0,0,114,37,0,0,0,41,9,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,107,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,109,0,0,0,114,49,0,0,0,41,5,114, - 55,0,0,0,114,108,0,0,0,114,91,0,0,0,114,92, - 0,0,0,218,4,99,111,100,101,114,4,0,0,0,114,4, - 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,226,1,0,0,115, - 16,0,0,0,0,2,15,1,15,1,13,1,12,1,16,1, - 4,2,18,1,114,149,0,0,0,114,61,0,0,0,99,3, - 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, - 0,0,0,115,76,0,0,0,116,0,0,116,1,0,131,1, - 0,125,3,0,124,3,0,106,2,0,116,3,0,124,1,0, - 131,1,0,131,1,0,1,124,3,0,106,2,0,116,3,0, - 124,2,0,131,1,0,131,1,0,1,124,3,0,106,2,0, - 116,4,0,106,5,0,124,0,0,131,1,0,131,1,0,1, - 124,3,0,83,41,1,122,80,67,111,109,112,105,108,101,32, - 97,32,99,111,100,101,32,111,98,106,101,99,116,32,105,110, - 116,111,32,98,121,116,101,99,111,100,101,32,102,111,114,32, - 119,114,105,116,105,110,103,32,111,117,116,32,116,111,32,97, - 32,98,121,116,101,45,99,111,109,112,105,108,101,100,10,32, - 32,32,32,102,105,108,101,46,41,6,218,9,98,121,116,101, - 97,114,114,97,121,114,137,0,0,0,218,6,101,120,116,101, - 110,100,114,19,0,0,0,114,144,0,0,0,90,5,100,117, - 109,112,115,41,4,114,148,0,0,0,114,135,0,0,0,114, - 142,0,0,0,114,55,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,17,95,99,111,100,101,95, - 116,111,95,98,121,116,101,99,111,100,101,238,1,0,0,115, - 10,0,0,0,0,3,12,1,19,1,19,1,22,1,114,152, - 0,0,0,99,1,0,0,0,0,0,0,0,5,0,0,0, - 4,0,0,0,67,0,0,0,115,89,0,0,0,100,1,0, - 100,2,0,108,0,0,125,1,0,116,1,0,106,2,0,124, - 0,0,131,1,0,106,3,0,125,2,0,124,1,0,106,4, - 0,124,2,0,131,1,0,125,3,0,116,1,0,106,5,0, - 100,2,0,100,3,0,131,2,0,125,4,0,124,4,0,106, - 6,0,124,0,0,106,6,0,124,3,0,100,1,0,25,131, - 1,0,131,1,0,83,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,61,0,0,0,78,84,41,7,218,8,116,111, - 107,101,110,105,122,101,114,51,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,153,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,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,13,100,101,99,111,100,101, - 95,115,111,117,114,99,101,248,1,0,0,115,10,0,0,0, - 0,5,12,1,18,1,15,1,18,1,114,157,0,0,0,114, - 129,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,2,0,0,0,9,0,0,0,19,0,0, - 0,67,0,0,0,115,89,1,0,0,124,1,0,100,1,0, - 107,8,0,114,73,0,100,2,0,125,1,0,116,0,0,124, - 2,0,100,3,0,131,2,0,114,73,0,121,19,0,124,2, - 0,106,1,0,124,0,0,131,1,0,125,1,0,87,110,18, - 0,4,116,2,0,107,10,0,114,72,0,1,1,1,89,110, - 1,0,88,116,3,0,106,4,0,124,0,0,124,2,0,100, - 4,0,124,1,0,131,2,1,125,4,0,100,5,0,124,4, - 0,95,5,0,124,2,0,100,1,0,107,8,0,114,194,0, - 120,73,0,116,6,0,131,0,0,68,93,58,0,92,2,0, - 125,5,0,125,6,0,124,1,0,106,7,0,116,8,0,124, - 6,0,131,1,0,131,1,0,114,128,0,124,5,0,124,0, - 0,124,1,0,131,2,0,125,2,0,124,2,0,124,4,0, - 95,9,0,80,113,128,0,87,100,1,0,83,124,3,0,116, - 10,0,107,8,0,114,23,1,116,0,0,124,2,0,100,6, - 0,131,2,0,114,32,1,121,19,0,124,2,0,106,11,0, - 124,0,0,131,1,0,125,7,0,87,110,18,0,4,116,2, - 0,107,10,0,114,4,1,1,1,1,89,113,32,1,88,124, - 7,0,114,32,1,103,0,0,124,4,0,95,12,0,110,9, - 0,124,3,0,124,4,0,95,12,0,124,4,0,106,12,0, - 103,0,0,107,2,0,114,85,1,124,1,0,114,85,1,116, - 13,0,124,1,0,131,1,0,100,7,0,25,125,8,0,124, - 4,0,106,12,0,106,14,0,124,8,0,131,1,0,1,124, - 4,0,83,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,218,6,111,114,105,103,105,110,84,218,10,105,115,95,112, - 97,99,107,97,103,101,114,61,0,0,0,41,15,114,117,0, - 0,0,114,159,0,0,0,114,109,0,0,0,114,123,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,94,0,0,0,114,95, - 0,0,0,114,129,0,0,0,218,9,95,80,79,80,85,76, - 65,84,69,114,161,0,0,0,114,158,0,0,0,114,40,0, - 0,0,218,6,97,112,112,101,110,100,41,9,114,108,0,0, - 0,90,8,108,111,99,97,116,105,111,110,114,129,0,0,0, - 114,158,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,161,0,0,0,90,7,100,105,114,110,97,109, - 101,114,4,0,0,0,114,4,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,9,2,0,0,115,60,0, - 0,0,0,12,12,4,6,1,15,2,3,1,19,1,13,1, - 5,8,24,1,9,3,12,1,22,1,21,1,15,1,9,1, - 5,2,4,3,12,2,15,1,3,1,19,1,13,1,5,2, - 6,1,12,2,9,1,15,1,6,1,16,1,16,2,114,169, + 114,171,0,0,0,99,2,0,0,115,20,0,0,0,12,2, + 6,3,6,3,6,2,6,2,18,7,18,15,3,1,21,15, + 3,1,114,171,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,70,0,0, + 0,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0, + 90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,100, + 4,0,100,5,0,132,0,0,90,5,0,100,6,0,100,7, + 0,132,0,0,90,6,0,100,8,0,100,9,0,132,0,0, + 90,7,0,100,10,0,83,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,5,0,0,0,3,0,0,0,67,0, + 0,0,115,88,0,0,0,116,0,0,124,0,0,106,1,0, + 124,1,0,131,1,0,131,1,0,100,1,0,25,125,2,0, + 124,2,0,106,2,0,100,2,0,100,1,0,131,2,0,100, + 3,0,25,125,3,0,124,1,0,106,3,0,100,2,0,131, + 1,0,100,4,0,25,125,4,0,124,3,0,100,5,0,107, + 2,0,111,87,0,124,4,0,100,5,0,107,3,0,83,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,31,0,0,0,114,60,0,0,0,114,61,0,0,0,114, + 58,0,0,0,218,8,95,95,105,110,105,116,95,95,41,4, + 114,40,0,0,0,114,160,0,0,0,114,36,0,0,0,114, + 34,0,0,0,41,5,114,110,0,0,0,114,128,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, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,162, + 0,0,0,168,2,0,0,115,8,0,0,0,0,3,25,1, + 22,1,19,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,2,0,0,0,1,0,0,0,67, + 0,0,0,115,4,0,0,0,100,1,0,83,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,4,0,0,0, + 41,2,114,110,0,0,0,114,167,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,218,13,99,114,101, + 97,116,101,95,109,111,100,117,108,101,176,2,0,0,115,0, + 0,0,0,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,3,0,0,0,4,0,0, + 0,67,0,0,0,115,80,0,0,0,124,0,0,106,0,0, + 124,1,0,106,1,0,131,1,0,125,2,0,124,2,0,100, + 1,0,107,8,0,114,54,0,116,2,0,100,2,0,106,3, + 0,124,1,0,106,1,0,131,1,0,131,1,0,130,1,0, + 116,4,0,106,5,0,116,6,0,124,2,0,124,1,0,106, + 7,0,131,3,0,1,100,1,0,83,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,114,0,0,0,114,109,0,0,0,114,49, + 0,0,0,114,123,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,120,0,0,0,41,3, + 114,110,0,0,0,218,6,109,111,100,117,108,101,114,149,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,11,101,120,101,99,95,109,111,100,117,108,101,179,2, + 0,0,115,10,0,0,0,0,2,18,1,12,1,9,1,15, + 1,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,2,0,0,0,3,0,0,0,67,0,0, + 0,115,16,0,0,0,116,0,0,106,1,0,124,0,0,124, + 1,0,131,2,0,83,41,1,78,41,2,114,123,0,0,0, + 218,17,95,108,111,97,100,95,109,111,100,117,108,101,95,115, + 104,105,109,41,2,114,110,0,0,0,114,128,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,218,11, + 108,111,97,100,95,109,111,100,117,108,101,187,2,0,0,115, + 2,0,0,0,0,1,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,114,0,0,0,114,113,0,0,0,114,115, + 0,0,0,114,116,0,0,0,114,162,0,0,0,114,188,0, + 0,0,114,193,0,0,0,114,195,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, + 114,186,0,0,0,163,2,0,0,115,10,0,0,0,12,3, + 6,2,12,8,12,3,12,8,114,186,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, + 0,0,115,106,0,0,0,101,0,0,90,1,0,100,0,0, + 90,2,0,100,1,0,100,2,0,132,0,0,90,3,0,100, + 3,0,100,4,0,132,0,0,90,4,0,100,5,0,100,6, + 0,132,0,0,90,5,0,100,7,0,100,8,0,132,0,0, + 90,6,0,100,9,0,100,10,0,132,0,0,90,7,0,100, + 11,0,100,18,0,100,13,0,100,14,0,132,0,1,90,8, + 0,100,15,0,100,16,0,132,0,0,90,9,0,100,17,0, + 83,41,19,218,12,83,111,117,114,99,101,76,111,97,100,101, + 114,99,2,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,10,0,0,0,116,0,0,130,1, + 0,100,1,0,83,41,2,122,178,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,44,32,119,104,101,114,101,32,112,97,116,104,32, + 105,115,32,97,32,115,116,114,46,10,10,32,32,32,32,32, + 32,32,32,82,97,105,115,101,115,32,73,79,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,218,7, + 73,79,69,114,114,111,114,41,2,114,110,0,0,0,114,37, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, + 0,0,218,10,112,97,116,104,95,109,116,105,109,101,193,2, + 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,2,0,0,0,3, + 0,0,0,67,0,0,0,115,19,0,0,0,100,1,0,124, + 0,0,106,0,0,124,1,0,131,1,0,105,1,0,83,41, + 2,97,170,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,32,112,97,116,104,10,32,32,32,32,32,32,32,32,116, + 111,32,98,121,32,116,104,101,32,112,97,116,104,32,40,115, + 116,114,41,46,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,73, + 79,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,135,0,0,0,41,1,114,198,0,0,0,41,2,114,110, + 0,0,0,114,37,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,6,0,0,0,218,10,112,97,116,104,95,115,116, + 97,116,115,201,2,0,0,115,2,0,0,0,0,11,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, + 4,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, + 0,124,0,0,106,0,0,124,2,0,124,3,0,131,2,0, + 83,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,110,0,0,0,114,92,0,0, + 0,90,10,99,97,99,104,101,95,112,97,116,104,114,55,0, + 0,0,114,4,0,0,0,114,4,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,214,2,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,3,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,0,83,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,4,0,0,0,41,3,114,110,0,0,0, + 114,37,0,0,0,114,55,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,114,200,0,0,0,224,2, + 0,0,115,0,0,0,0,122,21,83,111,117,114,99,101,76, + 111,97,100,101,114,46,115,101,116,95,100,97,116,97,99,2, + 0,0,0,0,0,0,0,5,0,0,0,16,0,0,0,67, + 0,0,0,115,105,0,0,0,124,0,0,106,0,0,124,1, + 0,131,1,0,125,2,0,121,19,0,124,0,0,106,1,0, + 124,2,0,131,1,0,125,3,0,87,110,58,0,4,116,2, + 0,107,10,0,114,94,0,1,125,4,0,1,122,26,0,116, + 3,0,100,1,0,100,2,0,124,1,0,131,1,1,124,4, + 0,130,2,0,87,89,100,3,0,100,3,0,125,4,0,126, + 4,0,88,110,1,0,88,116,4,0,124,3,0,131,1,0, + 83,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,108,0,0,0,78,41,5,114,160,0,0,0,218, + 8,103,101,116,95,100,97,116,97,114,42,0,0,0,114,109, + 0,0,0,114,158,0,0,0,41,5,114,110,0,0,0,114, + 128,0,0,0,114,37,0,0,0,114,156,0,0,0,218,3, + 101,120,99,114,4,0,0,0,114,4,0,0,0,114,6,0, + 0,0,218,10,103,101,116,95,115,111,117,114,99,101,231,2, + 0,0,115,14,0,0,0,0,2,15,1,3,1,19,1,18, + 1,9,1,31,1,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,218,9, + 95,111,112,116,105,109,105,122,101,114,31,0,0,0,99,3, + 0,0,0,1,0,0,0,4,0,0,0,9,0,0,0,67, + 0,0,0,115,34,0,0,0,116,0,0,106,1,0,116,2, + 0,124,1,0,124,2,0,100,1,0,100,2,0,100,3,0, + 100,4,0,124,3,0,131,4,2,83,41,5,122,130,82,101, + 116,117,114,110,32,116,104,101,32,99,111,100,101,32,111,98, + 106,101,99,116,32,99,111,109,112,105,108,101,100,32,102,114, + 111,109,32,115,111,117,114,99,101,46,10,10,32,32,32,32, + 32,32,32,32,84,104,101,32,39,100,97,116,97,39,32,97, + 114,103,117,109,101,110,116,32,99,97,110,32,98,101,32,97, + 110,121,32,111,98,106,101,99,116,32,116,121,112,101,32,116, + 104,97,116,32,99,111,109,112,105,108,101,40,41,32,115,117, + 112,112,111,114,116,115,46,10,32,32,32,32,32,32,32,32, + 114,191,0,0,0,218,12,100,111,110,116,95,105,110,104,101, + 114,105,116,84,114,70,0,0,0,41,3,114,123,0,0,0, + 114,190,0,0,0,218,7,99,111,109,112,105,108,101,41,4, + 114,110,0,0,0,114,55,0,0,0,114,37,0,0,0,114, + 205,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,218,14,115,111,117,114,99,101,95,116,111,95,99, + 111,100,101,241,2,0,0,115,4,0,0,0,0,5,21,1, + 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,10,0,0,0,43,0,0,0,67,0, + 0,0,115,174,1,0,0,124,0,0,106,0,0,124,1,0, + 131,1,0,125,2,0,100,1,0,125,3,0,121,16,0,116, + 1,0,124,2,0,131,1,0,125,4,0,87,110,24,0,4, + 116,2,0,107,10,0,114,63,0,1,1,1,100,1,0,125, + 4,0,89,110,202,0,88,121,19,0,124,0,0,106,3,0, + 124,2,0,131,1,0,125,5,0,87,110,18,0,4,116,4, + 0,107,10,0,114,103,0,1,1,1,89,110,162,0,88,116, + 5,0,124,5,0,100,2,0,25,131,1,0,125,3,0,121, + 19,0,124,0,0,106,6,0,124,4,0,131,1,0,125,6, + 0,87,110,18,0,4,116,7,0,107,10,0,114,159,0,1, + 1,1,89,110,106,0,88,121,34,0,116,8,0,124,6,0, + 100,3,0,124,5,0,100,4,0,124,1,0,100,5,0,124, + 4,0,131,1,3,125,7,0,87,110,24,0,4,116,9,0, + 116,10,0,102,2,0,107,10,0,114,220,0,1,1,1,89, + 110,45,0,88,116,11,0,100,6,0,124,4,0,124,2,0, + 131,3,0,1,116,12,0,124,7,0,100,4,0,124,1,0, + 100,7,0,124,4,0,100,8,0,124,2,0,131,1,3,83, + 124,0,0,106,6,0,124,2,0,131,1,0,125,8,0,124, + 0,0,106,13,0,124,8,0,124,2,0,131,2,0,125,9, + 0,116,11,0,100,9,0,124,2,0,131,2,0,1,116,14, + 0,106,15,0,12,114,170,1,124,4,0,100,1,0,107,9, + 0,114,170,1,124,3,0,100,1,0,107,9,0,114,170,1, + 116,16,0,124,9,0,124,3,0,116,17,0,124,8,0,131, + 1,0,131,3,0,125,6,0,121,36,0,124,0,0,106,18, + 0,124,2,0,124,4,0,124,6,0,131,3,0,1,116,11, + 0,100,10,0,124,4,0,131,2,0,1,87,110,18,0,4, + 116,2,0,107,10,0,114,169,1,1,1,1,89,110,1,0, + 88,124,9,0,83,41,11,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,114,135,0,0,0,114,141,0, + 0,0,114,108,0,0,0,114,37,0,0,0,122,13,123,125, + 32,109,97,116,99,104,101,115,32,123,125,114,91,0,0,0, + 114,92,0,0,0,122,19,99,111,100,101,32,111,98,106,101, + 99,116,32,102,114,111,109,32,123,125,122,10,119,114,111,116, + 101,32,123,33,114,125,41,19,114,160,0,0,0,114,81,0, + 0,0,114,68,0,0,0,114,199,0,0,0,114,197,0,0, + 0,114,16,0,0,0,114,202,0,0,0,114,42,0,0,0, + 114,144,0,0,0,114,109,0,0,0,114,139,0,0,0,114, + 107,0,0,0,114,150,0,0,0,114,208,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,153,0,0,0,114,33,0, + 0,0,114,201,0,0,0,41,10,114,110,0,0,0,114,128, + 0,0,0,114,92,0,0,0,114,142,0,0,0,114,91,0, + 0,0,218,2,115,116,114,55,0,0,0,218,10,98,121,116, + 101,115,95,100,97,116,97,114,156,0,0,0,90,11,99,111, + 100,101,95,111,98,106,101,99,116,114,4,0,0,0,114,4, + 0,0,0,114,6,0,0,0,114,189,0,0,0,249,2,0, + 0,115,78,0,0,0,0,7,15,1,6,1,3,1,16,1, + 13,1,11,2,3,1,19,1,13,1,5,2,16,1,3,1, + 19,1,13,1,5,2,3,1,9,1,12,1,13,1,19,1, + 5,2,9,1,7,1,15,1,6,1,7,1,15,1,18,1, + 13,1,22,1,12,1,9,1,15,1,3,1,19,1,17,1, + 13,1,5,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,114,89,0,0, + 0,41,10,114,114,0,0,0,114,113,0,0,0,114,115,0, + 0,0,114,198,0,0,0,114,199,0,0,0,114,201,0,0, + 0,114,200,0,0,0,114,204,0,0,0,114,208,0,0,0, + 114,189,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,114,196,0,0,0,191,2, + 0,0,115,14,0,0,0,12,2,12,8,12,13,12,10,12, + 7,12,10,18,8,114,196,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,115, + 112,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, + 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90, + 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6, + 0,100,7,0,132,0,0,90,6,0,101,7,0,135,0,0, + 102,1,0,100,8,0,100,9,0,134,0,0,131,1,0,90, + 8,0,101,7,0,100,10,0,100,11,0,132,0,0,131,1, + 0,90,9,0,100,12,0,100,13,0,132,0,0,90,10,0, + 135,0,0,83,41,14,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,3,0,0,0,2,0,0,0,67,0,0,0, + 115,22,0,0,0,124,1,0,124,0,0,95,0,0,124,2, + 0,124,0,0,95,1,0,100,1,0,83,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,41,2,114,108,0, + 0,0,114,37,0,0,0,41,3,114,110,0,0,0,114,128, + 0,0,0,114,37,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,6,0,0,0,114,187,0,0,0,50,3,0,0, + 115,4,0,0,0,0,3,9,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,2,0,0,0,2,0,0,0,67, + 0,0,0,115,34,0,0,0,124,0,0,106,0,0,124,1, + 0,106,0,0,107,2,0,111,33,0,124,0,0,106,1,0, + 124,1,0,106,1,0,107,2,0,83,41,1,78,41,2,218, + 9,95,95,99,108,97,115,115,95,95,114,120,0,0,0,41, + 2,114,110,0,0,0,218,5,111,116,104,101,114,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,218,6,95,95, + 101,113,95,95,56,3,0,0,115,4,0,0,0,0,1,18, + 1,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,1,0,0, + 0,3,0,0,0,67,0,0,0,115,26,0,0,0,116,0, + 0,124,0,0,106,1,0,131,1,0,116,0,0,124,0,0, + 106,2,0,131,1,0,65,83,41,1,78,41,3,218,4,104, + 97,115,104,114,108,0,0,0,114,37,0,0,0,41,1,114, + 110,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,218,8,95,95,104,97,115,104,95,95,60,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,2,0,0,0,3,0,0,0,3,0, + 0,0,115,22,0,0,0,116,0,0,116,1,0,124,0,0, + 131,2,0,106,2,0,124,1,0,131,1,0,83,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,212, + 0,0,0,114,195,0,0,0,41,2,114,110,0,0,0,114, + 128,0,0,0,41,1,114,213,0,0,0,114,4,0,0,0, + 114,6,0,0,0,114,195,0,0,0,63,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,2,0,0,0,1,0,0,0,67,0, + 0,0,115,7,0,0,0,124,0,0,106,0,0,83,41,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,41,1,114,37, + 0,0,0,41,2,114,110,0,0,0,114,128,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,160, + 0,0,0,75,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, + 3,0,0,0,9,0,0,0,67,0,0,0,115,42,0,0, + 0,116,0,0,106,1,0,124,1,0,100,1,0,131,2,0, + 143,17,0,125,2,0,124,2,0,106,2,0,131,0,0,83, + 87,100,2,0,81,82,88,100,2,0,83,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,218,1,114,78,41,3,114,51,0,0, + 0,114,52,0,0,0,90,4,114,101,97,100,41,3,114,110, + 0,0,0,114,37,0,0,0,114,56,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,114,202,0,0, + 0,80,3,0,0,115,4,0,0,0,0,2,21,1,122,19, + 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,100, + 97,116,97,41,11,114,114,0,0,0,114,113,0,0,0,114, + 115,0,0,0,114,116,0,0,0,114,187,0,0,0,114,215, + 0,0,0,114,217,0,0,0,114,125,0,0,0,114,195,0, + 0,0,114,160,0,0,0,114,202,0,0,0,114,4,0,0, + 0,114,4,0,0,0,41,1,114,213,0,0,0,114,6,0, + 0,0,114,212,0,0,0,45,3,0,0,115,14,0,0,0, + 12,3,6,2,12,6,12,4,12,3,24,12,18,5,114,212, 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,64,0,0,0,115,121,0,0,0,101,0,0, + 4,0,0,0,64,0,0,0,115,64,0,0,0,101,0,0, 90,1,0,100,0,0,90,2,0,100,1,0,90,3,0,100, - 2,0,90,4,0,100,3,0,90,5,0,100,4,0,90,6, - 0,101,7,0,100,5,0,100,6,0,132,0,0,131,1,0, - 90,8,0,101,7,0,100,7,0,100,8,0,132,0,0,131, - 1,0,90,9,0,101,7,0,100,9,0,100,9,0,100,10, - 0,100,11,0,132,2,0,131,1,0,90,10,0,101,7,0, - 100,9,0,100,12,0,100,13,0,132,1,0,131,1,0,90, - 11,0,100,9,0,83,41,14,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,2,0,0,0,11,0,0, - 0,67,0,0,0,115,67,0,0,0,121,23,0,116,0,0, - 106,1,0,116,0,0,106,2,0,124,1,0,131,2,0,83, - 87,110,37,0,4,116,3,0,107,10,0,114,62,0,1,1, - 1,116,0,0,106,1,0,116,0,0,106,4,0,124,1,0, - 131,2,0,83,89,110,1,0,88,100,0,0,83,41,1,78, - 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,42,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,4,0,0, - 0,114,4,0,0,0,114,6,0,0,0,218,14,95,111,112, - 101,110,95,114,101,103,105,115,116,114,121,87,2,0,0,115, - 8,0,0,0,0,2,3,1,23,1,13,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,6,0,0,0,16, - 0,0,0,67,0,0,0,115,143,0,0,0,124,0,0,106, - 0,0,114,21,0,124,0,0,106,1,0,125,2,0,110,9, - 0,124,0,0,106,2,0,125,2,0,124,2,0,106,3,0, - 100,1,0,124,1,0,100,2,0,116,4,0,106,5,0,100, - 0,0,100,3,0,133,2,0,25,131,0,2,125,3,0,121, - 47,0,124,0,0,106,6,0,124,3,0,131,1,0,143,25, - 0,125,4,0,116,7,0,106,8,0,124,4,0,100,4,0, - 131,2,0,125,5,0,87,100,0,0,81,82,88,87,110,22, - 0,4,116,9,0,107,10,0,114,138,0,1,1,1,100,0, - 0,83,89,110,1,0,88,124,5,0,83,41,5,78,114,128, - 0,0,0,90,11,115,121,115,95,118,101,114,115,105,111,110, - 114,82,0,0,0,114,32,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,49,0,0,0, - 114,8,0,0,0,218,7,118,101,114,115,105,111,110,114,173, - 0,0,0,114,171,0,0,0,90,10,81,117,101,114,121,86, - 97,108,117,101,114,42,0,0,0,41,6,114,172,0,0,0, - 114,128,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,4,0,0,0,114,4,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,94,2,0,0,115,22,0, - 0,0,0,2,9,1,12,2,9,1,15,1,22,1,3,1, - 18,1,29,1,13,1,9,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,8,0,0,0,14,0, - 0,0,67,0,0,0,115,158,0,0,0,124,0,0,106,0, - 0,124,1,0,131,1,0,125,4,0,124,4,0,100,0,0, - 107,8,0,114,31,0,100,0,0,83,121,14,0,116,1,0, - 124,4,0,131,1,0,1,87,110,22,0,4,116,2,0,107, - 10,0,114,69,0,1,1,1,100,0,0,83,89,110,1,0, - 88,120,81,0,116,3,0,131,0,0,68,93,70,0,92,2, - 0,125,5,0,125,6,0,124,4,0,106,4,0,116,5,0, - 124,6,0,131,1,0,131,1,0,114,80,0,116,6,0,106, - 7,0,124,1,0,124,5,0,124,1,0,124,4,0,131,2, - 0,100,1,0,124,4,0,131,2,1,125,7,0,124,7,0, - 83,113,80,0,87,100,0,0,83,41,2,78,114,160,0,0, - 0,41,8,114,179,0,0,0,114,41,0,0,0,114,42,0, - 0,0,114,163,0,0,0,114,94,0,0,0,114,95,0,0, - 0,114,123,0,0,0,218,16,115,112,101,99,95,102,114,111, - 109,95,108,111,97,100,101,114,41,8,114,172,0,0,0,114, - 128,0,0,0,114,37,0,0,0,218,6,116,97,114,103,101, - 116,114,178,0,0,0,114,129,0,0,0,114,168,0,0,0, - 114,166,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 6,0,0,0,218,9,102,105,110,100,95,115,112,101,99,109, - 2,0,0,115,26,0,0,0,0,2,15,1,12,1,4,1, - 3,1,14,1,13,1,9,1,22,1,21,1,9,1,15,1, - 9,1,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,4,0,0,0, - 3,0,0,0,67,0,0,0,115,45,0,0,0,124,0,0, - 106,0,0,124,1,0,124,2,0,131,2,0,125,3,0,124, - 3,0,100,1,0,107,9,0,114,37,0,124,3,0,106,1, - 0,83,100,1,0,83,100,1,0,83,41,2,122,108,70,105, - 110,100,32,109,111,100,117,108,101,32,110,97,109,101,100,32, - 105,110,32,116,104,101,32,114,101,103,105,115,116,114,121,46, - 10,10,32,32,32,32,32,32,32,32,84,104,105,115,32,109, - 101,116,104,111,100,32,105,115,32,100,101,112,114,101,99,97, - 116,101,100,46,32,32,85,115,101,32,101,120,101,99,95,109, - 111,100,117,108,101,40,41,32,105,110,115,116,101,97,100,46, - 10,10,32,32,32,32,32,32,32,32,78,41,2,114,182,0, - 0,0,114,129,0,0,0,41,4,114,172,0,0,0,114,128, - 0,0,0,114,37,0,0,0,114,166,0,0,0,114,4,0, - 0,0,114,4,0,0,0,114,6,0,0,0,218,11,102,105, - 110,100,95,109,111,100,117,108,101,125,2,0,0,115,8,0, - 0,0,0,7,18,1,12,1,7,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,12,114, + 2,0,100,3,0,132,0,0,90,4,0,100,4,0,100,5, + 0,132,0,0,90,5,0,100,6,0,100,7,0,100,8,0, + 100,9,0,132,0,1,90,6,0,100,10,0,83,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,3,0,0,0,4,0, + 0,0,67,0,0,0,115,34,0,0,0,116,0,0,124,1, + 0,131,1,0,125,2,0,100,1,0,124,2,0,106,1,0, + 100,2,0,124,2,0,106,2,0,105,2,0,83,41,3,122, + 33,82,101,116,117,114,110,32,116,104,101,32,109,101,116,97, + 100,97,116,97,32,102,111,114,32,116,104,101,32,112,97,116, + 104,46,114,135,0,0,0,114,136,0,0,0,41,3,114,41, + 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,110,0,0,0,114,37,0, + 0,0,114,210,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,6,0,0,0,114,199,0,0,0,90,3,0,0,115, + 4,0,0,0,0,2,12,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,5,0, + 0,0,5,0,0,0,67,0,0,0,115,34,0,0,0,116, + 0,0,124,1,0,131,1,0,125,4,0,124,0,0,106,1, + 0,124,2,0,124,3,0,100,1,0,124,4,0,131,2,1, + 83,41,2,78,218,5,95,109,111,100,101,41,2,114,99,0, + 0,0,114,200,0,0,0,41,5,114,110,0,0,0,114,92, + 0,0,0,114,91,0,0,0,114,55,0,0,0,114,44,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,114,201,0,0,0,95,3,0,0,115,4,0,0,0,0, + 2,12,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,222,0,0,0,105,182,1,0,0,99, + 3,0,0,0,1,0,0,0,9,0,0,0,17,0,0,0, + 67,0,0,0,115,53,1,0,0,116,0,0,124,1,0,131, + 1,0,92,2,0,125,4,0,125,5,0,103,0,0,125,6, + 0,120,54,0,124,4,0,114,80,0,116,1,0,124,4,0, + 131,1,0,12,114,80,0,116,0,0,124,4,0,131,1,0, + 92,2,0,125,4,0,125,7,0,124,6,0,106,2,0,124, + 7,0,131,1,0,1,113,27,0,87,120,132,0,116,3,0, + 124,6,0,131,1,0,68,93,118,0,125,7,0,116,4,0, + 124,4,0,124,7,0,131,2,0,125,4,0,121,17,0,116, + 5,0,106,6,0,124,4,0,131,1,0,1,87,113,94,0, + 4,116,7,0,107,10,0,114,155,0,1,1,1,119,94,0, + 89,113,94,0,4,116,8,0,107,10,0,114,211,0,1,125, + 8,0,1,122,25,0,116,9,0,100,1,0,124,4,0,124, + 8,0,131,3,0,1,100,2,0,83,87,89,100,2,0,100, + 2,0,125,8,0,126,8,0,88,113,94,0,88,113,94,0, + 87,121,33,0,116,10,0,124,1,0,124,2,0,124,3,0, + 131,3,0,1,116,9,0,100,3,0,124,1,0,131,2,0, + 1,87,110,53,0,4,116,8,0,107,10,0,114,48,1,1, + 125,8,0,1,122,21,0,116,9,0,100,1,0,124,1,0, + 124,8,0,131,3,0,1,87,89,100,2,0,100,2,0,125, + 8,0,126,8,0,88,110,1,0,88,100,2,0,83,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,11,114,40,0,0,0, + 114,48,0,0,0,114,166,0,0,0,114,35,0,0,0,114, + 30,0,0,0,114,3,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,42,0,0,0,114,107,0,0,0,114,57,0,0,0, + 41,9,114,110,0,0,0,114,37,0,0,0,114,55,0,0, + 0,114,222,0,0,0,218,6,112,97,114,101,110,116,114,96, + 0,0,0,114,29,0,0,0,114,25,0,0,0,114,203,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,114,200,0,0,0,100,3,0,0,115,38,0,0,0,0, + 2,18,1,6,2,22,1,18,1,17,2,19,1,15,1,3, + 1,17,1,13,2,7,1,18,3,16,1,27,1,3,1,16, + 1,17,1,18,2,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,114,0,0,0,114,113,0,0,0,114,115,0, + 0,0,114,116,0,0,0,114,199,0,0,0,114,201,0,0, + 0,114,200,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,6,0,0,0,114,220,0,0,0,86, + 3,0,0,115,8,0,0,0,12,2,6,2,12,5,12,5, + 114,220,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,64,0,0,0,115,46,0,0,0,101, + 0,0,90,1,0,100,0,0,90,2,0,100,1,0,90,3, + 0,100,2,0,100,3,0,132,0,0,90,4,0,100,4,0, + 100,5,0,132,0,0,90,5,0,100,6,0,83,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,5,0,0, + 0,6,0,0,0,67,0,0,0,115,76,0,0,0,124,0, + 0,106,0,0,124,1,0,131,1,0,125,2,0,124,0,0, + 106,1,0,124,2,0,131,1,0,125,3,0,116,2,0,124, + 3,0,100,1,0,124,1,0,100,2,0,124,2,0,131,1, + 2,125,4,0,116,3,0,124,4,0,100,1,0,124,1,0, + 100,3,0,124,2,0,131,1,2,83,41,4,78,114,108,0, + 0,0,114,37,0,0,0,114,91,0,0,0,41,4,114,160, + 0,0,0,114,202,0,0,0,114,144,0,0,0,114,150,0, + 0,0,41,5,114,110,0,0,0,114,128,0,0,0,114,37, + 0,0,0,114,55,0,0,0,114,211,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,114,189,0,0, + 0,133,3,0,0,115,8,0,0,0,0,1,15,1,15,1, + 24,1,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,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,0,83,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,4,0,0,0, + 41,2,114,110,0,0,0,114,128,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,114,204,0,0,0, + 139,3,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, 114,0,0,0,114,113,0,0,0,114,115,0,0,0,114,116, - 0,0,0,114,176,0,0,0,114,175,0,0,0,114,174,0, - 0,0,218,11,99,108,97,115,115,109,101,116,104,111,100,114, - 173,0,0,0,114,179,0,0,0,114,182,0,0,0,114,183, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,6,0,0,0,114,170,0,0,0,75,2,0,0, - 115,20,0,0,0,12,2,6,3,6,3,6,2,6,2,18, - 7,18,15,3,1,21,15,3,1,114,170,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,70,0,0,0,101,0,0,90,1,0,100,0, - 0,90,2,0,100,1,0,90,3,0,100,2,0,100,3,0, - 132,0,0,90,4,0,100,4,0,100,5,0,132,0,0,90, - 5,0,100,6,0,100,7,0,132,0,0,90,6,0,100,8, - 0,100,9,0,132,0,0,90,7,0,100,10,0,83,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,5,0,0, - 0,3,0,0,0,67,0,0,0,115,88,0,0,0,116,0, - 0,124,0,0,106,1,0,124,1,0,131,1,0,131,1,0, - 100,1,0,25,125,2,0,124,2,0,106,2,0,100,2,0, - 100,1,0,131,2,0,100,3,0,25,125,3,0,124,1,0, - 106,3,0,100,2,0,131,1,0,100,4,0,25,125,4,0, - 124,3,0,100,5,0,107,2,0,111,87,0,124,4,0,100, - 5,0,107,3,0,83,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,31,0,0,0,114,60,0,0, - 0,114,61,0,0,0,114,58,0,0,0,218,8,95,95,105, - 110,105,116,95,95,41,4,114,40,0,0,0,114,159,0,0, - 0,114,36,0,0,0,114,34,0,0,0,41,5,114,110,0, - 0,0,114,128,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,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,114,161,0,0,0,144,2,0,0,115,8, - 0,0,0,0,3,25,1,22,1,19,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,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,0,83,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,4,0,0,0,41,2,114,110,0,0,0,114,166, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,218,13,99,114,101,97,116,101,95,109,111,100,117,108, - 101,152,2,0,0,115,0,0,0,0,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, - 3,0,0,0,4,0,0,0,67,0,0,0,115,80,0,0, - 0,124,0,0,106,0,0,124,1,0,106,1,0,131,1,0, - 125,2,0,124,2,0,100,1,0,107,8,0,114,54,0,116, - 2,0,100,2,0,106,3,0,124,1,0,106,1,0,131,1, - 0,131,1,0,130,1,0,116,4,0,106,5,0,116,6,0, - 124,2,0,124,1,0,106,7,0,131,3,0,1,100,1,0, - 83,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,114,0,0,0, - 114,109,0,0,0,114,49,0,0,0,114,123,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,120,0,0,0,41,3,114,110,0,0,0,218,6,109,111, - 100,117,108,101,114,148,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,11,101,120,101,99,95,109, - 111,100,117,108,101,155,2,0,0,115,10,0,0,0,0,2, - 18,1,12,1,9,1,15,1,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,2,0,0,0, - 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,0, - 106,1,0,124,0,0,124,1,0,131,2,0,83,41,1,78, - 41,2,114,123,0,0,0,218,17,95,108,111,97,100,95,109, - 111,100,117,108,101,95,115,104,105,109,41,2,114,110,0,0, - 0,114,128,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,218,11,108,111,97,100,95,109,111,100,117, - 108,101,163,2,0,0,115,2,0,0,0,0,1,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,114,0,0,0, - 114,113,0,0,0,114,115,0,0,0,114,116,0,0,0,114, - 161,0,0,0,114,187,0,0,0,114,192,0,0,0,114,194, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,6,0,0,0,114,185,0,0,0,139,2,0,0, - 115,10,0,0,0,12,3,6,2,12,8,12,3,12,8,114, - 185,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,64,0,0,0,115,106,0,0,0,101,0, - 0,90,1,0,100,0,0,90,2,0,100,1,0,100,2,0, - 132,0,0,90,3,0,100,3,0,100,4,0,132,0,0,90, - 4,0,100,5,0,100,6,0,132,0,0,90,5,0,100,7, - 0,100,8,0,132,0,0,90,6,0,100,9,0,100,10,0, - 132,0,0,90,7,0,100,11,0,100,18,0,100,13,0,100, - 14,0,132,0,1,90,8,0,100,15,0,100,16,0,132,0, - 0,90,9,0,100,17,0,83,41,19,218,12,83,111,117,114, - 99,101,76,111,97,100,101,114,99,2,0,0,0,0,0,0, - 0,2,0,0,0,1,0,0,0,67,0,0,0,115,10,0, - 0,0,116,0,0,130,1,0,100,1,0,83,41,2,122,178, - 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,44,32,119,104,101,114, - 101,32,112,97,116,104,32,105,115,32,97,32,115,116,114,46, - 10,10,32,32,32,32,32,32,32,32,82,97,105,115,101,115, - 32,73,79,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,218,7,73,79,69,114,114,111,114,41,2, - 114,110,0,0,0,114,37,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,6,0,0,0,218,10,112,97,116,104,95, - 109,116,105,109,101,169,2,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,2,0,0,0,3,0,0,0,67,0,0,0,115,19, - 0,0,0,100,1,0,124,0,0,106,0,0,124,1,0,131, - 1,0,105,1,0,83,41,2,97,170,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,32,112,97,116,104,10,32,32, - 32,32,32,32,32,32,116,111,32,98,121,32,116,104,101,32, - 112,97,116,104,32,40,115,116,114,41,46,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,73,79,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,135,0,0,0,41,1,114,197, - 0,0,0,41,2,114,110,0,0,0,114,37,0,0,0,114, - 4,0,0,0,114,4,0,0,0,114,6,0,0,0,218,10, - 112,97,116,104,95,115,116,97,116,115,177,2,0,0,115,2, - 0,0,0,0,11,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,4,0,0,0,3,0,0,0,67, - 0,0,0,115,16,0,0,0,124,0,0,106,0,0,124,2, - 0,124,3,0,131,2,0,83,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,110, - 0,0,0,114,92,0,0,0,90,10,99,97,99,104,101,95, - 112,97,116,104,114,55,0,0,0,114,4,0,0,0,114,4, - 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,190,2,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,3,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,1,0,83, - 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,4,0,0,0, - 41,3,114,110,0,0,0,114,37,0,0,0,114,55,0,0, - 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 114,199,0,0,0,200,2,0,0,115,0,0,0,0,122,21, - 83,111,117,114,99,101,76,111,97,100,101,114,46,115,101,116, - 95,100,97,116,97,99,2,0,0,0,0,0,0,0,5,0, - 0,0,16,0,0,0,67,0,0,0,115,105,0,0,0,124, - 0,0,106,0,0,124,1,0,131,1,0,125,2,0,121,19, - 0,124,0,0,106,1,0,124,2,0,131,1,0,125,3,0, - 87,110,58,0,4,116,2,0,107,10,0,114,94,0,1,125, - 4,0,1,122,26,0,116,3,0,100,1,0,100,2,0,124, - 1,0,131,1,1,124,4,0,130,2,0,87,89,100,3,0, - 100,3,0,125,4,0,126,4,0,88,110,1,0,88,116,4, - 0,124,3,0,131,1,0,83,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,108,0,0,0,78,41, - 5,114,159,0,0,0,218,8,103,101,116,95,100,97,116,97, - 114,42,0,0,0,114,109,0,0,0,114,157,0,0,0,41, - 5,114,110,0,0,0,114,128,0,0,0,114,37,0,0,0, - 114,155,0,0,0,218,3,101,120,99,114,4,0,0,0,114, - 4,0,0,0,114,6,0,0,0,218,10,103,101,116,95,115, - 111,117,114,99,101,207,2,0,0,115,14,0,0,0,0,2, - 15,1,3,1,19,1,18,1,9,1,31,1,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,218,9,95,111,112,116,105,109,105,122,101, - 114,31,0,0,0,99,3,0,0,0,1,0,0,0,4,0, - 0,0,9,0,0,0,67,0,0,0,115,34,0,0,0,116, - 0,0,106,1,0,116,2,0,124,1,0,124,2,0,100,1, - 0,100,2,0,100,3,0,100,4,0,124,3,0,131,4,2, - 83,41,5,122,130,82,101,116,117,114,110,32,116,104,101,32, - 99,111,100,101,32,111,98,106,101,99,116,32,99,111,109,112, - 105,108,101,100,32,102,114,111,109,32,115,111,117,114,99,101, - 46,10,10,32,32,32,32,32,32,32,32,84,104,101,32,39, - 100,97,116,97,39,32,97,114,103,117,109,101,110,116,32,99, - 97,110,32,98,101,32,97,110,121,32,111,98,106,101,99,116, - 32,116,121,112,101,32,116,104,97,116,32,99,111,109,112,105, - 108,101,40,41,32,115,117,112,112,111,114,116,115,46,10,32, - 32,32,32,32,32,32,32,114,190,0,0,0,218,12,100,111, - 110,116,95,105,110,104,101,114,105,116,84,114,70,0,0,0, - 41,3,114,123,0,0,0,114,189,0,0,0,218,7,99,111, - 109,112,105,108,101,41,4,114,110,0,0,0,114,55,0,0, - 0,114,37,0,0,0,114,204,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,218,14,115,111,117,114, - 99,101,95,116,111,95,99,111,100,101,217,2,0,0,115,4, - 0,0,0,0,5,21,1,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,10,0,0, - 0,43,0,0,0,67,0,0,0,115,174,1,0,0,124,0, - 0,106,0,0,124,1,0,131,1,0,125,2,0,100,1,0, - 125,3,0,121,16,0,116,1,0,124,2,0,131,1,0,125, - 4,0,87,110,24,0,4,116,2,0,107,10,0,114,63,0, - 1,1,1,100,1,0,125,4,0,89,110,202,0,88,121,19, - 0,124,0,0,106,3,0,124,2,0,131,1,0,125,5,0, - 87,110,18,0,4,116,4,0,107,10,0,114,103,0,1,1, - 1,89,110,162,0,88,116,5,0,124,5,0,100,2,0,25, - 131,1,0,125,3,0,121,19,0,124,0,0,106,6,0,124, - 4,0,131,1,0,125,6,0,87,110,18,0,4,116,7,0, - 107,10,0,114,159,0,1,1,1,89,110,106,0,88,121,34, - 0,116,8,0,124,6,0,100,3,0,124,5,0,100,4,0, - 124,1,0,100,5,0,124,4,0,131,1,3,125,7,0,87, - 110,24,0,4,116,9,0,116,10,0,102,2,0,107,10,0, - 114,220,0,1,1,1,89,110,45,0,88,116,11,0,100,6, - 0,124,4,0,124,2,0,131,3,0,1,116,12,0,124,7, - 0,100,4,0,124,1,0,100,7,0,124,4,0,100,8,0, - 124,2,0,131,1,3,83,124,0,0,106,6,0,124,2,0, - 131,1,0,125,8,0,124,0,0,106,13,0,124,8,0,124, - 2,0,131,2,0,125,9,0,116,11,0,100,9,0,124,2, - 0,131,2,0,1,116,14,0,106,15,0,12,114,170,1,124, - 4,0,100,1,0,107,9,0,114,170,1,124,3,0,100,1, - 0,107,9,0,114,170,1,116,16,0,124,9,0,124,3,0, - 116,17,0,124,8,0,131,1,0,131,3,0,125,6,0,121, - 36,0,124,0,0,106,18,0,124,2,0,124,4,0,124,6, - 0,131,3,0,1,116,11,0,100,10,0,124,4,0,131,2, - 0,1,87,110,18,0,4,116,2,0,107,10,0,114,169,1, - 1,1,1,89,110,1,0,88,124,9,0,83,41,11,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,114, - 135,0,0,0,114,140,0,0,0,114,108,0,0,0,114,37, - 0,0,0,122,13,123,125,32,109,97,116,99,104,101,115,32, - 123,125,114,91,0,0,0,114,92,0,0,0,122,19,99,111, - 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, - 125,122,10,119,114,111,116,101,32,123,33,114,125,41,19,114, - 159,0,0,0,114,81,0,0,0,114,68,0,0,0,114,198, - 0,0,0,114,196,0,0,0,114,16,0,0,0,114,201,0, - 0,0,114,42,0,0,0,114,143,0,0,0,114,109,0,0, - 0,114,138,0,0,0,114,107,0,0,0,114,149,0,0,0, - 114,207,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, - 152,0,0,0,114,33,0,0,0,114,200,0,0,0,41,10, - 114,110,0,0,0,114,128,0,0,0,114,92,0,0,0,114, - 141,0,0,0,114,91,0,0,0,218,2,115,116,114,55,0, - 0,0,218,10,98,121,116,101,115,95,100,97,116,97,114,155, - 0,0,0,90,11,99,111,100,101,95,111,98,106,101,99,116, - 114,4,0,0,0,114,4,0,0,0,114,6,0,0,0,114, - 188,0,0,0,225,2,0,0,115,78,0,0,0,0,7,15, - 1,6,1,3,1,16,1,13,1,11,2,3,1,19,1,13, - 1,5,2,16,1,3,1,19,1,13,1,5,2,3,1,9, - 1,12,1,13,1,19,1,5,2,9,1,7,1,15,1,6, - 1,7,1,15,1,18,1,13,1,22,1,12,1,9,1,15, - 1,3,1,19,1,17,1,13,1,5,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,114,89,0,0,0,41,10,114,114,0,0,0,114, - 113,0,0,0,114,115,0,0,0,114,197,0,0,0,114,198, - 0,0,0,114,200,0,0,0,114,199,0,0,0,114,203,0, - 0,0,114,207,0,0,0,114,188,0,0,0,114,4,0,0, - 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 114,195,0,0,0,167,2,0,0,115,14,0,0,0,12,2, - 12,8,12,13,12,10,12,7,12,10,18,8,114,195,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0, - 0,0,0,0,0,0,115,112,0,0,0,101,0,0,90,1, - 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0, - 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132, - 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6, - 0,101,7,0,135,0,0,102,1,0,100,8,0,100,9,0, - 134,0,0,131,1,0,90,8,0,101,7,0,100,10,0,100, - 11,0,132,0,0,131,1,0,90,9,0,100,12,0,100,13, - 0,132,0,0,90,10,0,135,0,0,83,41,14,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,3,0,0,0,2, - 0,0,0,67,0,0,0,115,22,0,0,0,124,1,0,124, - 0,0,95,0,0,124,2,0,124,0,0,95,1,0,100,1, - 0,83,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,41,2,114,108,0,0,0,114,37,0,0,0,41,3, - 114,110,0,0,0,114,128,0,0,0,114,37,0,0,0,114, - 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,186, - 0,0,0,26,3,0,0,115,4,0,0,0,0,3,9,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,2,0, - 0,0,2,0,0,0,67,0,0,0,115,34,0,0,0,124, - 0,0,106,0,0,124,1,0,106,0,0,107,2,0,111,33, - 0,124,0,0,106,1,0,124,1,0,106,1,0,107,2,0, - 83,41,1,78,41,2,218,9,95,95,99,108,97,115,115,95, - 95,114,120,0,0,0,41,2,114,110,0,0,0,218,5,111, - 116,104,101,114,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,218,6,95,95,101,113,95,95,32,3,0,0,115, - 4,0,0,0,0,1,18,1,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,1,0,0,0,3,0,0,0,67,0,0,0, - 115,26,0,0,0,116,0,0,124,0,0,106,1,0,131,1, - 0,116,0,0,124,0,0,106,2,0,131,1,0,65,83,41, - 1,78,41,3,218,4,104,97,115,104,114,108,0,0,0,114, - 37,0,0,0,41,1,114,110,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,218,8,95,95,104,97, - 115,104,95,95,36,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,2,0,0, - 0,3,0,0,0,3,0,0,0,115,22,0,0,0,116,0, - 0,116,1,0,124,0,0,131,2,0,106,2,0,124,1,0, - 131,1,0,83,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,211,0,0,0,114,194,0,0,0,41, - 2,114,110,0,0,0,114,128,0,0,0,41,1,114,212,0, - 0,0,114,4,0,0,0,114,6,0,0,0,114,194,0,0, - 0,39,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,2,0,0, - 0,1,0,0,0,67,0,0,0,115,7,0,0,0,124,0, - 0,106,0,0,83,41,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,41,1,114,37,0,0,0,41,2,114,110,0,0, - 0,114,128,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,114,159,0,0,0,51,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,3,0,0,0,9,0,0,0,67, - 0,0,0,115,42,0,0,0,116,0,0,106,1,0,124,1, - 0,100,1,0,131,2,0,143,17,0,125,2,0,124,2,0, - 106,2,0,131,0,0,83,87,100,2,0,81,82,88,100,2, - 0,83,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,218,1,114, - 78,41,3,114,51,0,0,0,114,52,0,0,0,90,4,114, - 101,97,100,41,3,114,110,0,0,0,114,37,0,0,0,114, - 56,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,114,201,0,0,0,56,3,0,0,115,4,0,0, - 0,0,2,21,1,122,19,70,105,108,101,76,111,97,100,101, - 114,46,103,101,116,95,100,97,116,97,41,11,114,114,0,0, - 0,114,113,0,0,0,114,115,0,0,0,114,116,0,0,0, - 114,186,0,0,0,114,214,0,0,0,114,216,0,0,0,114, - 125,0,0,0,114,194,0,0,0,114,159,0,0,0,114,201, - 0,0,0,114,4,0,0,0,114,4,0,0,0,41,1,114, - 212,0,0,0,114,6,0,0,0,114,211,0,0,0,21,3, - 0,0,115,14,0,0,0,12,3,6,2,12,6,12,4,12, - 3,24,12,18,5,114,211,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115, - 64,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, + 0,0,0,114,189,0,0,0,114,204,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,114,225,0,0,0,129,3,0,0,115,6,0,0,0,12, + 2,6,2,12,6,114,225,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, + 136,0,0,0,101,0,0,90,1,0,100,0,0,90,2,0, 100,1,0,90,3,0,100,2,0,100,3,0,132,0,0,90, 4,0,100,4,0,100,5,0,132,0,0,90,5,0,100,6, - 0,100,7,0,100,8,0,100,9,0,132,0,1,90,6,0, - 100,10,0,83,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,3,0,0,0,4,0,0,0,67,0,0,0,115,34,0, - 0,0,116,0,0,124,1,0,131,1,0,125,2,0,100,1, - 0,124,2,0,106,1,0,100,2,0,124,2,0,106,2,0, - 105,2,0,83,41,3,122,33,82,101,116,117,114,110,32,116, - 104,101,32,109,101,116,97,100,97,116,97,32,102,111,114,32, - 116,104,101,32,112,97,116,104,46,114,135,0,0,0,114,136, - 0,0,0,41,3,114,41,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, - 110,0,0,0,114,37,0,0,0,114,209,0,0,0,114,4, - 0,0,0,114,4,0,0,0,114,6,0,0,0,114,198,0, - 0,0,66,3,0,0,115,4,0,0,0,0,2,12,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,5,0,0,0,5,0,0,0,67,0,0, - 0,115,34,0,0,0,116,0,0,124,1,0,131,1,0,125, - 4,0,124,0,0,106,1,0,124,2,0,124,3,0,100,1, - 0,124,4,0,131,2,1,83,41,2,78,218,5,95,109,111, - 100,101,41,2,114,99,0,0,0,114,199,0,0,0,41,5, - 114,110,0,0,0,114,92,0,0,0,114,91,0,0,0,114, - 55,0,0,0,114,44,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,114,200,0,0,0,71,3,0, - 0,115,4,0,0,0,0,2,12,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,221,0,0, - 0,105,182,1,0,0,99,3,0,0,0,1,0,0,0,9, - 0,0,0,17,0,0,0,67,0,0,0,115,53,1,0,0, - 116,0,0,124,1,0,131,1,0,92,2,0,125,4,0,125, - 5,0,103,0,0,125,6,0,120,54,0,124,4,0,114,80, - 0,116,1,0,124,4,0,131,1,0,12,114,80,0,116,0, - 0,124,4,0,131,1,0,92,2,0,125,4,0,125,7,0, - 124,6,0,106,2,0,124,7,0,131,1,0,1,113,27,0, - 87,120,132,0,116,3,0,124,6,0,131,1,0,68,93,118, - 0,125,7,0,116,4,0,124,4,0,124,7,0,131,2,0, - 125,4,0,121,17,0,116,5,0,106,6,0,124,4,0,131, - 1,0,1,87,113,94,0,4,116,7,0,107,10,0,114,155, - 0,1,1,1,119,94,0,89,113,94,0,4,116,8,0,107, - 10,0,114,211,0,1,125,8,0,1,122,25,0,116,9,0, - 100,1,0,124,4,0,124,8,0,131,3,0,1,100,2,0, - 83,87,89,100,2,0,100,2,0,125,8,0,126,8,0,88, - 113,94,0,88,113,94,0,87,121,33,0,116,10,0,124,1, - 0,124,2,0,124,3,0,131,3,0,1,116,9,0,100,3, - 0,124,1,0,131,2,0,1,87,110,53,0,4,116,8,0, - 107,10,0,114,48,1,1,125,8,0,1,122,21,0,116,9, - 0,100,1,0,124,1,0,124,8,0,131,3,0,1,87,89, - 100,2,0,100,2,0,125,8,0,126,8,0,88,110,1,0, - 88,100,2,0,83,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,11,114,40,0,0,0,114,48,0,0,0,114,165,0,0, - 0,114,35,0,0,0,114,30,0,0,0,114,3,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,42,0,0,0,114,107,0, - 0,0,114,57,0,0,0,41,9,114,110,0,0,0,114,37, - 0,0,0,114,55,0,0,0,114,221,0,0,0,218,6,112, - 97,114,101,110,116,114,96,0,0,0,114,29,0,0,0,114, - 25,0,0,0,114,202,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,114,199,0,0,0,76,3,0, - 0,115,38,0,0,0,0,2,18,1,6,2,22,1,18,1, - 17,2,19,1,15,1,3,1,17,1,13,2,7,1,18,3, - 16,1,27,1,3,1,16,1,17,1,18,2,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,114,0,0,0,114, - 113,0,0,0,114,115,0,0,0,114,116,0,0,0,114,198, - 0,0,0,114,200,0,0,0,114,199,0,0,0,114,4,0, + 0,100,7,0,132,0,0,90,6,0,100,8,0,100,9,0, + 132,0,0,90,7,0,100,10,0,100,11,0,132,0,0,90, + 8,0,100,12,0,100,13,0,132,0,0,90,9,0,100,14, + 0,100,15,0,132,0,0,90,10,0,100,16,0,100,17,0, + 132,0,0,90,11,0,101,12,0,100,18,0,100,19,0,132, + 0,0,131,1,0,90,13,0,100,20,0,83,41,21,218,19, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,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,3,0,0,0,2, + 0,0,0,67,0,0,0,115,22,0,0,0,124,1,0,124, + 0,0,95,0,0,124,2,0,124,0,0,95,1,0,100,0, + 0,83,41,1,78,41,2,114,108,0,0,0,114,37,0,0, + 0,41,3,114,110,0,0,0,114,108,0,0,0,114,37,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, - 0,114,219,0,0,0,62,3,0,0,115,8,0,0,0,12, - 2,6,2,12,5,12,5,114,219,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,46,0,0,0,101,0,0,90,1,0,100,0,0,90, - 2,0,100,1,0,90,3,0,100,2,0,100,3,0,132,0, - 0,90,4,0,100,4,0,100,5,0,132,0,0,90,5,0, - 100,6,0,83,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,5,0,0,0,6,0,0,0,67,0,0,0, - 115,76,0,0,0,124,0,0,106,0,0,124,1,0,131,1, - 0,125,2,0,124,0,0,106,1,0,124,2,0,131,1,0, - 125,3,0,116,2,0,124,3,0,100,1,0,124,1,0,100, - 2,0,124,2,0,131,1,2,125,4,0,116,3,0,124,4, - 0,100,1,0,124,1,0,100,3,0,124,2,0,131,1,2, - 83,41,4,78,114,108,0,0,0,114,37,0,0,0,114,91, - 0,0,0,41,4,114,159,0,0,0,114,201,0,0,0,114, - 143,0,0,0,114,149,0,0,0,41,5,114,110,0,0,0, - 114,128,0,0,0,114,37,0,0,0,114,55,0,0,0,114, - 210,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,114,188,0,0,0,109,3,0,0,115,8,0,0, - 0,0,1,15,1,15,1,24,1,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,114,187,0,0,0,156,3,0,0,115,4,0,0,0,0, + 1,9,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,2,0,0,0,2,0, + 0,0,67,0,0,0,115,34,0,0,0,124,0,0,106,0, + 0,124,1,0,106,0,0,107,2,0,111,33,0,124,0,0, + 106,1,0,124,1,0,106,1,0,107,2,0,83,41,1,78, + 41,2,114,213,0,0,0,114,120,0,0,0,41,2,114,110, + 0,0,0,114,214,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,6,0,0,0,114,215,0,0,0,160,3,0,0, + 115,4,0,0,0,0,1,18,1,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,1,0, + 0,0,3,0,0,0,67,0,0,0,115,26,0,0,0,116, + 0,0,124,0,0,106,1,0,131,1,0,116,0,0,124,0, + 0,106,2,0,131,1,0,65,83,41,1,78,41,3,114,216, + 0,0,0,114,108,0,0,0,114,37,0,0,0,41,1,114, + 110,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,114,217,0,0,0,164,3,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,3,0,0,0,4,0, + 0,0,67,0,0,0,115,47,0,0,0,116,0,0,106,1, + 0,116,2,0,106,3,0,124,1,0,131,2,0,125,2,0, + 116,4,0,100,1,0,124,1,0,106,5,0,124,0,0,106, + 6,0,131,3,0,1,124,2,0,83,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,123, + 0,0,0,114,190,0,0,0,114,148,0,0,0,90,14,99, + 114,101,97,116,101,95,100,121,110,97,109,105,99,114,107,0, + 0,0,114,108,0,0,0,114,37,0,0,0,41,3,114,110, + 0,0,0,114,167,0,0,0,114,192,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,114,188,0,0, + 0,167,3,0,0,115,10,0,0,0,0,2,6,1,15,1, + 6,1,16,1,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, + 2,0,0,0,4,0,0,0,67,0,0,0,115,45,0,0, + 0,116,0,0,106,1,0,116,2,0,106,3,0,124,1,0, + 131,2,0,1,116,4,0,100,1,0,124,0,0,106,5,0, + 124,0,0,106,6,0,131,3,0,1,100,2,0,83,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,123,0, + 0,0,114,190,0,0,0,114,148,0,0,0,90,12,101,120, + 101,99,95,100,121,110,97,109,105,99,114,107,0,0,0,114, + 108,0,0,0,114,37,0,0,0,41,2,114,110,0,0,0, + 114,192,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,114,193,0,0,0,175,3,0,0,115,6,0, + 0,0,0,2,19,1,6,1,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,2,0,0,0,4,0,0,0,3,0,0,0,115,48, + 0,0,0,116,0,0,124,0,0,106,1,0,131,1,0,100, + 1,0,25,137,0,0,116,2,0,135,0,0,102,1,0,100, + 2,0,100,3,0,134,0,0,116,3,0,68,131,1,0,131, + 1,0,83,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,31,0,0,0,99,1,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,51,0, + 0,0,115,31,0,0,0,124,0,0,93,21,0,125,1,0, + 136,0,0,100,0,0,124,1,0,23,107,2,0,86,1,113, + 3,0,100,1,0,83,41,2,114,187,0,0,0,78,114,4, + 0,0,0,41,2,114,24,0,0,0,218,6,115,117,102,102, + 105,120,41,1,218,9,102,105,108,101,95,110,97,109,101,114, + 4,0,0,0,114,6,0,0,0,250,9,60,103,101,110,101, + 120,112,114,62,184,3,0,0,115,2,0,0,0,6,1,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,40,0,0,0,114,37,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,41,2,114,110,0,0,0,114,128, + 0,0,0,114,4,0,0,0,41,1,114,228,0,0,0,114, + 6,0,0,0,114,162,0,0,0,181,3,0,0,115,6,0, + 0,0,0,2,19,1,18,1,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,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, - 0,0,100,1,0,83,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,4,0,0,0,41,2,114,110,0,0,0,114,128, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,203,0,0,0,115,3,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,114,0,0,0,114,113,0,0,0, - 114,115,0,0,0,114,116,0,0,0,114,188,0,0,0,114, - 203,0,0,0,114,4,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,114,224,0,0,0,105,3,0, - 0,115,6,0,0,0,12,2,6,2,12,6,114,224,0,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,64,0,0,0,115,136,0,0,0,101,0,0,90,1, - 0,100,0,0,90,2,0,100,1,0,90,3,0,100,2,0, - 100,3,0,132,0,0,90,4,0,100,4,0,100,5,0,132, - 0,0,90,5,0,100,6,0,100,7,0,132,0,0,90,6, - 0,100,8,0,100,9,0,132,0,0,90,7,0,100,10,0, - 100,11,0,132,0,0,90,8,0,100,12,0,100,13,0,132, - 0,0,90,9,0,100,14,0,100,15,0,132,0,0,90,10, - 0,100,16,0,100,17,0,132,0,0,90,11,0,101,12,0, - 100,18,0,100,19,0,132,0,0,131,1,0,90,13,0,100, - 20,0,83,41,21,218,19,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,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,3,0,0,0,2,0,0,0,67,0,0,0,115,22, - 0,0,0,124,1,0,124,0,0,95,0,0,124,2,0,124, - 0,0,95,1,0,100,0,0,83,41,1,78,41,2,114,108, - 0,0,0,114,37,0,0,0,41,3,114,110,0,0,0,114, - 108,0,0,0,114,37,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,114,186,0,0,0,132,3,0, - 0,115,4,0,0,0,0,1,9,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,2,0,0,0,2,0,0,0,67,0,0,0,115,34,0, - 0,0,124,0,0,106,0,0,124,1,0,106,0,0,107,2, - 0,111,33,0,124,0,0,106,1,0,124,1,0,106,1,0, - 107,2,0,83,41,1,78,41,2,114,212,0,0,0,114,120, - 0,0,0,41,2,114,110,0,0,0,114,213,0,0,0,114, - 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,214, - 0,0,0,136,3,0,0,115,4,0,0,0,0,1,18,1, - 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,1,0,0,0,3,0,0,0,67,0,0, - 0,115,26,0,0,0,116,0,0,124,0,0,106,1,0,131, - 1,0,116,0,0,124,0,0,106,2,0,131,1,0,65,83, - 41,1,78,41,3,114,215,0,0,0,114,108,0,0,0,114, - 37,0,0,0,41,1,114,110,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,114,216,0,0,0,140, - 3,0,0,115,2,0,0,0,0,1,122,28,69,120,116,101, + 0,0,100,1,0,83,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,4,0,0,0,41, + 2,114,110,0,0,0,114,128,0,0,0,114,4,0,0,0, + 114,4,0,0,0,114,6,0,0,0,114,189,0,0,0,187, + 3,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, - 95,95,104,97,115,104,95,95,99,2,0,0,0,0,0,0, - 0,3,0,0,0,4,0,0,0,67,0,0,0,115,47,0, - 0,0,116,0,0,106,1,0,116,2,0,106,3,0,124,1, - 0,131,2,0,125,2,0,116,4,0,100,1,0,124,1,0, - 106,5,0,124,0,0,106,6,0,131,3,0,1,124,2,0, - 83,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,123,0,0,0,114,189,0,0,0,114, - 147,0,0,0,90,14,99,114,101,97,116,101,95,100,121,110, - 97,109,105,99,114,107,0,0,0,114,108,0,0,0,114,37, - 0,0,0,41,3,114,110,0,0,0,114,166,0,0,0,114, - 191,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,114,187,0,0,0,143,3,0,0,115,10,0,0, - 0,0,2,6,1,15,1,6,1,16,1,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,2,0,0,0,4,0,0,0,67, - 0,0,0,115,45,0,0,0,116,0,0,106,1,0,116,2, - 0,106,3,0,124,1,0,131,2,0,1,116,4,0,100,1, - 0,124,0,0,106,5,0,124,0,0,106,6,0,131,3,0, - 1,100,2,0,83,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,123,0,0,0,114,189,0,0,0,114,147, - 0,0,0,90,12,101,120,101,99,95,100,121,110,97,109,105, - 99,114,107,0,0,0,114,108,0,0,0,114,37,0,0,0, - 41,2,114,110,0,0,0,114,191,0,0,0,114,4,0,0, - 0,114,4,0,0,0,114,6,0,0,0,114,192,0,0,0, - 151,3,0,0,115,6,0,0,0,0,2,19,1,6,1,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,2,0,0,0,4,0,0, - 0,3,0,0,0,115,48,0,0,0,116,0,0,124,0,0, - 106,1,0,131,1,0,100,1,0,25,137,0,0,116,2,0, - 135,0,0,102,1,0,100,2,0,100,3,0,134,0,0,116, - 3,0,68,131,1,0,131,1,0,83,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, - 31,0,0,0,99,1,0,0,0,0,0,0,0,2,0,0, - 0,4,0,0,0,51,0,0,0,115,31,0,0,0,124,0, - 0,93,21,0,125,1,0,136,0,0,100,0,0,124,1,0, - 23,107,2,0,86,1,113,3,0,100,1,0,83,41,2,114, - 186,0,0,0,78,114,4,0,0,0,41,2,114,24,0,0, - 0,218,6,115,117,102,102,105,120,41,1,218,9,102,105,108, - 101,95,110,97,109,101,114,4,0,0,0,114,6,0,0,0, - 250,9,60,103,101,110,101,120,112,114,62,160,3,0,0,115, - 2,0,0,0,6,1,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,40,0,0,0, - 114,37,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,41,2, - 114,110,0,0,0,114,128,0,0,0,114,4,0,0,0,41, - 1,114,227,0,0,0,114,6,0,0,0,114,161,0,0,0, - 157,3,0,0,115,6,0,0,0,0,2,19,1,18,1,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,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,0,83,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,4,0,0,0,41,2,114,110,0,0,0,114,128,0, + 103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,0,83,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,4,0,0,0,41,2,114,110,0,0,0,114,128,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, + 114,204,0,0,0,191,3,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,2,0,0,0,1,0,0, + 0,67,0,0,0,115,7,0,0,0,124,0,0,106,0,0, + 83,41,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,41, + 1,114,37,0,0,0,41,2,114,110,0,0,0,114,128,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, - 0,114,188,0,0,0,163,3,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,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,0,83,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,4,0,0,0,41,2,114,110, - 0,0,0,114,128,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,6,0,0,0,114,203,0,0,0,167,3,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, - 2,0,0,0,1,0,0,0,67,0,0,0,115,7,0,0, - 0,124,0,0,106,0,0,83,41,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,41,1,114,37,0,0,0,41,2,114, - 110,0,0,0,114,128,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,114,159,0,0,0,171,3,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,114,0, - 0,0,114,113,0,0,0,114,115,0,0,0,114,116,0,0, - 0,114,186,0,0,0,114,214,0,0,0,114,216,0,0,0, - 114,187,0,0,0,114,192,0,0,0,114,161,0,0,0,114, - 188,0,0,0,114,203,0,0,0,114,125,0,0,0,114,159, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,6,0,0,0,114,225,0,0,0,124,3,0,0, - 115,20,0,0,0,12,6,6,2,12,4,12,4,12,3,12, - 8,12,6,12,6,12,4,12,4,114,225,0,0,0,99,0, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64, - 0,0,0,115,130,0,0,0,101,0,0,90,1,0,100,0, - 0,90,2,0,100,1,0,90,3,0,100,2,0,100,3,0, - 132,0,0,90,4,0,100,4,0,100,5,0,132,0,0,90, - 5,0,100,6,0,100,7,0,132,0,0,90,6,0,100,8, - 0,100,9,0,132,0,0,90,7,0,100,10,0,100,11,0, - 132,0,0,90,8,0,100,12,0,100,13,0,132,0,0,90, - 9,0,100,14,0,100,15,0,132,0,0,90,10,0,100,16, - 0,100,17,0,132,0,0,90,11,0,100,18,0,100,19,0, - 132,0,0,90,12,0,100,20,0,83,41,21,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, - 4,0,0,0,2,0,0,0,67,0,0,0,115,52,0,0, - 0,124,1,0,124,0,0,95,0,0,124,2,0,124,0,0, - 95,1,0,116,2,0,124,0,0,106,3,0,131,0,0,131, - 1,0,124,0,0,95,4,0,124,3,0,124,0,0,95,5, - 0,100,0,0,83,41,1,78,41,6,218,5,95,110,97,109, - 101,218,5,95,112,97,116,104,114,95,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, - 41,4,114,110,0,0,0,114,108,0,0,0,114,37,0,0, - 0,218,11,112,97,116,104,95,102,105,110,100,101,114,114,4, - 0,0,0,114,4,0,0,0,114,6,0,0,0,114,186,0, - 0,0,184,3,0,0,115,8,0,0,0,0,1,9,1,9, - 1,21,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,4,0,0,0,3,0,0,0,67,0,0, - 0,115,53,0,0,0,124,0,0,106,0,0,106,1,0,100, - 1,0,131,1,0,92,3,0,125,1,0,125,2,0,125,3, - 0,124,2,0,100,2,0,107,2,0,114,43,0,100,6,0, - 83,124,1,0,100,5,0,102,2,0,83,41,7,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,60,0, - 0,0,114,32,0,0,0,114,8,0,0,0,114,37,0,0, - 0,90,8,95,95,112,97,116,104,95,95,41,2,114,8,0, - 0,0,114,37,0,0,0,41,2,114,232,0,0,0,114,34, - 0,0,0,41,4,114,110,0,0,0,114,223,0,0,0,218, - 3,100,111,116,90,2,109,101,114,4,0,0,0,114,4,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, - 190,3,0,0,115,8,0,0,0,0,2,27,1,12,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,3,0,0,0,3,0,0,0,67,0,0,0,115,38, - 0,0,0,124,0,0,106,0,0,131,0,0,92,2,0,125, - 1,0,125,2,0,116,1,0,116,2,0,106,3,0,124,1, - 0,25,124,2,0,131,2,0,83,41,1,78,41,4,114,239, - 0,0,0,114,119,0,0,0,114,8,0,0,0,218,7,109, - 111,100,117,108,101,115,41,3,114,110,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, + 0,114,160,0,0,0,195,3,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,114,0,0,0,114,113,0,0,0, + 114,115,0,0,0,114,116,0,0,0,114,187,0,0,0,114, + 215,0,0,0,114,217,0,0,0,114,188,0,0,0,114,193, + 0,0,0,114,162,0,0,0,114,189,0,0,0,114,204,0, + 0,0,114,125,0,0,0,114,160,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, + 114,226,0,0,0,148,3,0,0,115,20,0,0,0,12,6, + 6,2,12,4,12,4,12,3,12,8,12,6,12,6,12,4, + 12,4,114,226,0,0,0,99,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,130,0,0, + 0,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0, + 90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,100, + 4,0,100,5,0,132,0,0,90,5,0,100,6,0,100,7, + 0,132,0,0,90,6,0,100,8,0,100,9,0,132,0,0, + 90,7,0,100,10,0,100,11,0,132,0,0,90,8,0,100, + 12,0,100,13,0,132,0,0,90,9,0,100,14,0,100,15, + 0,132,0,0,90,10,0,100,16,0,100,17,0,132,0,0, + 90,11,0,100,18,0,100,19,0,132,0,0,90,12,0,100, + 20,0,83,41,21,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,4,0,0,0,2,0,0, + 0,67,0,0,0,115,52,0,0,0,124,1,0,124,0,0, + 95,0,0,124,2,0,124,0,0,95,1,0,116,2,0,124, + 0,0,106,3,0,131,0,0,131,1,0,124,0,0,95,4, + 0,124,3,0,124,0,0,95,5,0,100,0,0,83,41,1, + 78,41,6,218,5,95,110,97,109,101,218,5,95,112,97,116, + 104,114,95,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,41,4,114,110,0,0,0, + 114,108,0,0,0,114,37,0,0,0,218,11,112,97,116,104, + 95,102,105,110,100,101,114,114,4,0,0,0,114,4,0,0, + 0,114,6,0,0,0,114,187,0,0,0,208,3,0,0,115, + 8,0,0,0,0,1,9,1,9,1,21,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,4,0, + 0,0,3,0,0,0,67,0,0,0,115,53,0,0,0,124, + 0,0,106,0,0,106,1,0,100,1,0,131,1,0,92,3, + 0,125,1,0,125,2,0,125,3,0,124,2,0,100,2,0, + 107,2,0,114,43,0,100,6,0,83,124,1,0,100,5,0, + 102,2,0,83,41,7,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,60,0,0,0,114,32,0,0,0, + 114,8,0,0,0,114,37,0,0,0,90,8,95,95,112,97, + 116,104,95,95,41,2,114,8,0,0,0,114,37,0,0,0, + 41,2,114,233,0,0,0,114,34,0,0,0,41,4,114,110, + 0,0,0,114,224,0,0,0,218,3,100,111,116,90,2,109, 101,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 114,234,0,0,0,200,3,0,0,115,4,0,0,0,0,1, - 18,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,3,0,0,0, - 3,0,0,0,67,0,0,0,115,118,0,0,0,116,0,0, - 124,0,0,106,1,0,131,0,0,131,1,0,125,1,0,124, - 1,0,124,0,0,106,2,0,107,3,0,114,111,0,124,0, - 0,106,3,0,124,0,0,106,4,0,124,1,0,131,2,0, - 125,2,0,124,2,0,100,0,0,107,9,0,114,102,0,124, - 2,0,106,5,0,100,0,0,107,8,0,114,102,0,124,2, - 0,106,6,0,114,102,0,124,2,0,106,6,0,124,0,0, - 95,7,0,124,1,0,124,0,0,95,2,0,124,0,0,106, - 7,0,83,41,1,78,41,8,114,95,0,0,0,114,234,0, - 0,0,114,235,0,0,0,114,236,0,0,0,114,232,0,0, - 0,114,129,0,0,0,114,158,0,0,0,114,233,0,0,0, - 41,3,114,110,0,0,0,90,11,112,97,114,101,110,116,95, - 112,97,116,104,114,166,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,204,3,0,0,115,16,0,0,0,0, - 2,18,1,15,1,21,3,27,1,9,1,12,1,9,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,1,0,0,0,2,0,0,0,67,0,0, - 0,115,16,0,0,0,116,0,0,124,0,0,106,1,0,131, - 0,0,131,1,0,83,41,1,78,41,2,218,4,105,116,101, - 114,114,241,0,0,0,41,1,114,110,0,0,0,114,4,0, - 0,0,114,4,0,0,0,114,6,0,0,0,218,8,95,95, - 105,116,101,114,95,95,217,3,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,1,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,0,124,0,0,106,1,0,131,0,0, - 131,1,0,83,41,1,78,41,2,114,33,0,0,0,114,241, - 0,0,0,41,1,114,110,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,6,0,0,0,218,7,95,95,108,101,110, - 95,95,220,3,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,1,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,100, - 1,0,106,0,0,124,0,0,106,1,0,131,1,0,83,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,49,0,0,0,114, - 233,0,0,0,41,1,114,110,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,218,8,95,95,114,101, - 112,114,95,95,223,3,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,2,0,0,0,2,0,0,0,67,0,0,0,115,16,0, - 0,0,124,1,0,124,0,0,106,0,0,131,0,0,107,6, - 0,83,41,1,78,41,1,114,241,0,0,0,41,2,114,110, - 0,0,0,218,4,105,116,101,109,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,12,95,95,99,111,110,116, - 97,105,110,115,95,95,226,3,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,2,0,0,0,2,0,0,0,67, - 0,0,0,115,20,0,0,0,124,0,0,106,0,0,106,1, - 0,124,1,0,131,1,0,1,100,0,0,83,41,1,78,41, - 2,114,233,0,0,0,114,165,0,0,0,41,2,114,110,0, - 0,0,114,246,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,6,0,0,0,114,165,0,0,0,229,3,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,13, - 114,114,0,0,0,114,113,0,0,0,114,115,0,0,0,114, - 116,0,0,0,114,186,0,0,0,114,239,0,0,0,114,234, - 0,0,0,114,241,0,0,0,114,243,0,0,0,114,244,0, - 0,0,114,245,0,0,0,114,247,0,0,0,114,165,0,0, - 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,114,231,0,0,0,177,3,0,0,115,20, - 0,0,0,12,5,6,2,12,6,12,10,12,4,12,13,12, - 3,12,3,12,3,12,3,114,231,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, - 0,115,118,0,0,0,101,0,0,90,1,0,100,0,0,90, - 2,0,100,1,0,100,2,0,132,0,0,90,3,0,101,4, - 0,100,3,0,100,4,0,132,0,0,131,1,0,90,5,0, - 100,5,0,100,6,0,132,0,0,90,6,0,100,7,0,100, - 8,0,132,0,0,90,7,0,100,9,0,100,10,0,132,0, - 0,90,8,0,100,11,0,100,12,0,132,0,0,90,9,0, - 100,13,0,100,14,0,132,0,0,90,10,0,100,15,0,100, - 16,0,132,0,0,90,11,0,100,17,0,83,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,4,0,0,0,4,0,0, - 0,67,0,0,0,115,25,0,0,0,116,0,0,124,1,0, - 124,2,0,124,3,0,131,3,0,124,0,0,95,1,0,100, - 0,0,83,41,1,78,41,2,114,231,0,0,0,114,233,0, - 0,0,41,4,114,110,0,0,0,114,108,0,0,0,114,37, - 0,0,0,114,237,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,6,0,0,0,114,186,0,0,0,235,3,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,2,0,0,0,2, - 0,0,0,67,0,0,0,115,16,0,0,0,100,1,0,106, - 0,0,124,1,0,106,1,0,131,1,0,83,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,49,0,0,0,114,114,0,0,0,41,2,114,172,0,0, - 0,114,191,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, - 112,114,238,3,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,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,0,83,41,2,78,84,114,4,0, - 0,0,41,2,114,110,0,0,0,114,128,0,0,0,114,4, - 0,0,0,114,4,0,0,0,114,6,0,0,0,114,161,0, - 0,0,247,3,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,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,0,83,41,2,78,114,32,0,0,0, - 114,4,0,0,0,41,2,114,110,0,0,0,114,128,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,214,3,0,0,115,8,0, + 0,0,0,2,27,1,12,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,3,0,0,0,3, + 0,0,0,67,0,0,0,115,38,0,0,0,124,0,0,106, + 0,0,131,0,0,92,2,0,125,1,0,125,2,0,116,1, + 0,116,2,0,106,3,0,124,1,0,25,124,2,0,131,2, + 0,83,41,1,78,41,4,114,240,0,0,0,114,119,0,0, + 0,114,8,0,0,0,218,7,109,111,100,117,108,101,115,41, + 3,114,110,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,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,114,235,0,0,0,224,3, + 0,0,115,4,0,0,0,0,1,18,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,3,0,0,0,3,0,0,0,67,0,0, + 0,115,118,0,0,0,116,0,0,124,0,0,106,1,0,131, + 0,0,131,1,0,125,1,0,124,1,0,124,0,0,106,2, + 0,107,3,0,114,111,0,124,0,0,106,3,0,124,0,0, + 106,4,0,124,1,0,131,2,0,125,2,0,124,2,0,100, + 0,0,107,9,0,114,102,0,124,2,0,106,5,0,100,0, + 0,107,8,0,114,102,0,124,2,0,106,6,0,114,102,0, + 124,2,0,106,6,0,124,0,0,95,7,0,124,1,0,124, + 0,0,95,2,0,124,0,0,106,7,0,83,41,1,78,41, + 8,114,95,0,0,0,114,235,0,0,0,114,236,0,0,0, + 114,237,0,0,0,114,233,0,0,0,114,129,0,0,0,114, + 159,0,0,0,114,234,0,0,0,41,3,114,110,0,0,0, + 90,11,112,97,114,101,110,116,95,112,97,116,104,114,167,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,12,95,114,101,99,97,108,99,117,108,97,116,101,228, + 3,0,0,115,16,0,0,0,0,2,18,1,15,1,21,3, + 27,1,9,1,12,1,9,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,1,0, + 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,0,124,0,0,106,1,0,131,0,0,131,1,0,83,41, + 1,78,41,2,218,4,105,116,101,114,114,242,0,0,0,41, + 1,114,110,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,6,0,0,0,218,8,95,95,105,116,101,114,95,95,241, + 3,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,1,0,0,0,0,0,0,0,1,0,0,0, + 2,0,0,0,67,0,0,0,115,16,0,0,0,116,0,0, + 124,0,0,106,1,0,131,0,0,131,1,0,83,41,1,78, + 41,2,114,33,0,0,0,114,242,0,0,0,41,1,114,110, + 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, + 0,0,218,7,95,95,108,101,110,95,95,244,3,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,1,0,0,0,2,0,0,0,67, + 0,0,0,115,16,0,0,0,100,1,0,106,0,0,124,0, + 0,106,1,0,131,1,0,83,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,49,0,0,0,114,234,0,0,0,41,1,114, + 110,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,218,8,95,95,114,101,112,114,95,95,247,3,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,2,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,124,1,0,124,0, + 0,106,0,0,131,0,0,107,6,0,83,41,1,78,41,1, + 114,242,0,0,0,41,2,114,110,0,0,0,218,4,105,116, + 101,109,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,12,95,95,99,111,110,116,97,105,110,115,95,95,250, + 3,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, + 2,0,0,0,2,0,0,0,67,0,0,0,115,20,0,0, + 0,124,0,0,106,0,0,106,1,0,124,1,0,131,1,0, + 1,100,0,0,83,41,1,78,41,2,114,234,0,0,0,114, + 166,0,0,0,41,2,114,110,0,0,0,114,247,0,0,0, + 114,4,0,0,0,114,4,0,0,0,114,6,0,0,0,114, + 166,0,0,0,253,3,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,13,114,114,0,0,0,114,113, + 0,0,0,114,115,0,0,0,114,116,0,0,0,114,187,0, + 0,0,114,240,0,0,0,114,235,0,0,0,114,242,0,0, + 0,114,244,0,0,0,114,245,0,0,0,114,246,0,0,0, + 114,248,0,0,0,114,166,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,232, + 0,0,0,201,3,0,0,115,20,0,0,0,12,5,6,2, + 12,6,12,10,12,4,12,13,12,3,12,3,12,3,12,3, + 114,232,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,64,0,0,0,115,118,0,0,0,101, + 0,0,90,1,0,100,0,0,90,2,0,100,1,0,100,2, + 0,132,0,0,90,3,0,101,4,0,100,3,0,100,4,0, + 132,0,0,131,1,0,90,5,0,100,5,0,100,6,0,132, + 0,0,90,6,0,100,7,0,100,8,0,132,0,0,90,7, + 0,100,9,0,100,10,0,132,0,0,90,8,0,100,11,0, + 100,12,0,132,0,0,90,9,0,100,13,0,100,14,0,132, + 0,0,90,10,0,100,15,0,100,16,0,132,0,0,90,11, + 0,100,17,0,83,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,4,0,0,0,4,0,0,0,67,0,0,0,115,25, + 0,0,0,116,0,0,124,1,0,124,2,0,124,3,0,131, + 3,0,124,0,0,95,1,0,100,0,0,83,41,1,78,41, + 2,114,232,0,0,0,114,234,0,0,0,41,4,114,110,0, + 0,0,114,108,0,0,0,114,37,0,0,0,114,238,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 114,203,0,0,0,250,3,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,2,0,0,0,6,0,0,0,67,0, - 0,0,115,22,0,0,0,116,0,0,100,1,0,100,2,0, - 100,3,0,100,4,0,100,5,0,131,3,1,83,41,6,78, - 114,32,0,0,0,122,8,60,115,116,114,105,110,103,62,114, - 190,0,0,0,114,205,0,0,0,84,41,1,114,206,0,0, - 0,41,2,114,110,0,0,0,114,128,0,0,0,114,4,0, - 0,0,114,4,0,0,0,114,6,0,0,0,114,188,0,0, - 0,253,3,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, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,0,83,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,4,0,0,0,41,2,114,110,0,0,0, - 114,166,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 6,0,0,0,114,187,0,0,0,0,4,0,0,115,0,0, - 0,0,122,30,95,78,97,109,101,115,112,97,99,101,76,111, - 97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117, - 108,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1, - 0,0,0,67,0,0,0,115,4,0,0,0,100,0,0,83, - 41,1,78,114,4,0,0,0,41,2,114,110,0,0,0,114, - 191,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,114,192,0,0,0,3,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,2,0,0,0,3,0, - 0,0,67,0,0,0,115,32,0,0,0,116,0,0,100,1, - 0,124,0,0,106,1,0,131,2,0,1,116,2,0,106,3, - 0,124,0,0,124,1,0,131,2,0,83,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,107,0,0,0, - 114,233,0,0,0,114,123,0,0,0,114,193,0,0,0,41, - 2,114,110,0,0,0,114,128,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,114,194,0,0,0,6, - 4,0,0,115,4,0,0,0,0,7,16,1,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,114,0, - 0,0,114,113,0,0,0,114,115,0,0,0,114,186,0,0, - 0,114,184,0,0,0,114,249,0,0,0,114,161,0,0,0, - 114,203,0,0,0,114,188,0,0,0,114,187,0,0,0,114, - 192,0,0,0,114,194,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,4,0,0,0,114,6,0,0,0,114,248,0, - 0,0,234,3,0,0,115,16,0,0,0,12,1,12,3,18, - 9,12,3,12,3,12,3,12,3,12,3,114,248,0,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0, - 0,64,0,0,0,115,160,0,0,0,101,0,0,90,1,0, - 100,0,0,90,2,0,100,1,0,90,3,0,101,4,0,100, - 2,0,100,3,0,132,0,0,131,1,0,90,5,0,101,4, - 0,100,4,0,100,5,0,132,0,0,131,1,0,90,6,0, - 101,4,0,100,6,0,100,7,0,132,0,0,131,1,0,90, - 7,0,101,4,0,100,8,0,100,9,0,132,0,0,131,1, - 0,90,8,0,101,4,0,100,10,0,100,11,0,100,12,0, - 132,1,0,131,1,0,90,9,0,101,4,0,100,10,0,100, - 10,0,100,13,0,100,14,0,132,2,0,131,1,0,90,10, - 0,101,4,0,100,10,0,100,15,0,100,16,0,132,1,0, - 131,1,0,90,11,0,100,10,0,83,41,17,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,2,0,0,0,4,0,0,0,67,0,0,0,115,55,0, - 0,0,120,48,0,116,0,0,106,1,0,106,2,0,131,0, - 0,68,93,31,0,125,1,0,116,3,0,124,1,0,100,1, - 0,131,2,0,114,16,0,124,1,0,106,4,0,131,0,0, - 1,113,16,0,87,100,2,0,83,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,218,17,105,110,118,97, - 108,105,100,97,116,101,95,99,97,99,104,101,115,78,41,5, - 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,6,118,97,108,117, - 101,115,114,117,0,0,0,114,251,0,0,0,41,2,114,172, - 0,0,0,218,6,102,105,110,100,101,114,114,4,0,0,0, - 114,4,0,0,0,114,6,0,0,0,114,251,0,0,0,23, - 4,0,0,115,6,0,0,0,0,4,22,1,15,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,3,0,0,0,12,0,0,0,67,0,0, - 0,115,107,0,0,0,116,0,0,106,1,0,100,1,0,107, - 9,0,114,41,0,116,0,0,106,1,0,12,114,41,0,116, - 2,0,106,3,0,100,2,0,116,4,0,131,2,0,1,120, - 59,0,116,0,0,106,1,0,68,93,44,0,125,2,0,121, - 14,0,124,2,0,124,1,0,131,1,0,83,87,113,51,0, - 4,116,5,0,107,10,0,114,94,0,1,1,1,119,51,0, - 89,113,51,0,88,113,51,0,87,100,1,0,83,100,1,0, - 83,41,3,122,113,83,101,97,114,99,104,32,115,101,113,117, - 101,110,99,101,32,111,102,32,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,10,10,32,32,32,32,32,32,32,32, - 73,102,32,39,104,111,111,107,115,39,32,105,115,32,102,97, - 108,115,101,32,116,104,101,110,32,117,115,101,32,115,121,115, - 46,112,97,116,104,95,104,111,111,107,115,46,10,10,32,32, - 32,32,32,32,32,32,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,62,0,0,0,114,63,0,0,0,114,127,0, - 0,0,114,109,0,0,0,41,3,114,172,0,0,0,114,37, - 0,0,0,90,4,104,111,111,107,114,4,0,0,0,114,4, - 0,0,0,114,6,0,0,0,218,11,95,112,97,116,104,95, - 104,111,111,107,115,31,4,0,0,115,16,0,0,0,0,7, - 25,1,16,1,16,1,3,1,14,1,13,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,3, - 0,0,0,19,0,0,0,67,0,0,0,115,123,0,0,0, - 124,1,0,100,1,0,107,2,0,114,53,0,121,16,0,116, - 0,0,106,1,0,131,0,0,125,1,0,87,110,22,0,4, - 116,2,0,107,10,0,114,52,0,1,1,1,100,2,0,83, - 89,110,1,0,88,121,17,0,116,3,0,106,4,0,124,1, - 0,25,125,2,0,87,110,46,0,4,116,5,0,107,10,0, - 114,118,0,1,1,1,124,0,0,106,6,0,124,1,0,131, - 1,0,125,2,0,124,2,0,116,3,0,106,4,0,124,1, - 0,60,89,110,1,0,88,124,2,0,83,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,32,0,0,0,78,41,7,114,3,0,0,0,114,47, - 0,0,0,218,17,70,105,108,101,78,111,116,70,111,117,110, - 100,69,114,114,111,114,114,8,0,0,0,114,252,0,0,0, - 114,139,0,0,0,114,0,1,0,0,41,3,114,172,0,0, - 0,114,37,0,0,0,114,254,0,0,0,114,4,0,0,0, - 114,4,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, - 48,4,0,0,115,22,0,0,0,0,8,12,1,3,1,16, - 1,13,3,9,1,3,1,17,1,13,1,15,1,18,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,6,0,0,0,3,0,0, - 0,67,0,0,0,115,119,0,0,0,116,0,0,124,2,0, - 100,1,0,131,2,0,114,39,0,124,2,0,106,1,0,124, - 1,0,131,1,0,92,2,0,125,3,0,125,4,0,110,21, - 0,124,2,0,106,2,0,124,1,0,131,1,0,125,3,0, - 103,0,0,125,4,0,124,3,0,100,0,0,107,9,0,114, - 88,0,116,3,0,106,4,0,124,1,0,124,3,0,131,2, - 0,83,116,3,0,106,5,0,124,1,0,100,0,0,131,2, - 0,125,5,0,124,4,0,124,5,0,95,6,0,124,5,0, - 83,41,2,78,114,126,0,0,0,41,7,114,117,0,0,0, - 114,126,0,0,0,114,183,0,0,0,114,123,0,0,0,114, - 180,0,0,0,114,162,0,0,0,114,158,0,0,0,41,6, - 114,172,0,0,0,114,128,0,0,0,114,254,0,0,0,114, - 129,0,0,0,114,130,0,0,0,114,166,0,0,0,114,4, - 0,0,0,114,4,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,70, - 4,0,0,115,18,0,0,0,0,4,15,1,24,2,15,1, - 6,1,12,1,16,1,18,1,9,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,9,0,0,0,5,0,0,0,67,0,0,0,115,243,0, - 0,0,103,0,0,125,4,0,120,230,0,124,2,0,68,93, - 191,0,125,5,0,116,0,0,124,5,0,116,1,0,116,2, - 0,102,2,0,131,2,0,115,43,0,113,13,0,124,0,0, - 106,3,0,124,5,0,131,1,0,125,6,0,124,6,0,100, - 1,0,107,9,0,114,13,0,116,4,0,124,6,0,100,2, - 0,131,2,0,114,106,0,124,6,0,106,5,0,124,1,0, - 124,3,0,131,2,0,125,7,0,110,18,0,124,0,0,106, - 6,0,124,1,0,124,6,0,131,2,0,125,7,0,124,7, - 0,100,1,0,107,8,0,114,139,0,113,13,0,124,7,0, - 106,7,0,100,1,0,107,9,0,114,158,0,124,7,0,83, - 124,7,0,106,8,0,125,8,0,124,8,0,100,1,0,107, - 8,0,114,191,0,116,9,0,100,3,0,131,1,0,130,1, - 0,124,4,0,106,10,0,124,8,0,131,1,0,1,113,13, - 0,87,116,11,0,106,12,0,124,1,0,100,1,0,131,2, - 0,125,7,0,124,4,0,124,7,0,95,8,0,124,7,0, - 83,100,1,0,83,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,182,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,145,0,0,0,114,71,0,0,0,218, - 5,98,121,116,101,115,114,2,1,0,0,114,117,0,0,0, - 114,182,0,0,0,114,3,1,0,0,114,129,0,0,0,114, - 158,0,0,0,114,109,0,0,0,114,151,0,0,0,114,123, - 0,0,0,114,162,0,0,0,41,9,114,172,0,0,0,114, - 128,0,0,0,114,37,0,0,0,114,181,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,254,0,0,0,114,166,0,0,0,114, - 130,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,218,9,95,103,101,116,95,115,112,101,99,85,4, - 0,0,115,40,0,0,0,0,5,6,1,13,1,21,1,3, - 1,15,1,12,1,15,1,21,2,18,1,12,1,3,1,15, - 1,4,1,9,1,12,1,12,5,17,2,18,1,9,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,6,0, - 0,0,4,0,0,0,67,0,0,0,115,140,0,0,0,124, - 2,0,100,1,0,107,8,0,114,21,0,116,0,0,106,1, - 0,125,2,0,124,0,0,106,2,0,124,1,0,124,2,0, - 124,3,0,131,3,0,125,4,0,124,4,0,100,1,0,107, - 8,0,114,58,0,100,1,0,83,124,4,0,106,3,0,100, - 1,0,107,8,0,114,132,0,124,4,0,106,4,0,125,5, - 0,124,5,0,114,125,0,100,2,0,124,4,0,95,5,0, - 116,6,0,124,1,0,124,5,0,124,0,0,106,2,0,131, - 3,0,124,4,0,95,4,0,124,4,0,83,100,1,0,83, - 110,4,0,124,4,0,83,100,1,0,83,41,3,122,98,102, + 114,187,0,0,0,3,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,2,0,0,0,2,0,0,0,67,0,0,0, + 115,16,0,0,0,100,1,0,106,0,0,124,1,0,106,1, + 0,131,1,0,83,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,49,0,0,0,114,114, + 0,0,0,41,2,114,173,0,0,0,114,192,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,218,11, + 109,111,100,117,108,101,95,114,101,112,114,6,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,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 0,83,41,2,78,84,114,4,0,0,0,41,2,114,110,0, + 0,0,114,128,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,6,0,0,0,114,162,0,0,0,15,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,2,0,0,0, + 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,0, + 83,41,2,78,114,32,0,0,0,114,4,0,0,0,41,2, + 114,110,0,0,0,114,128,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,114,204,0,0,0,18,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,2, + 0,0,0,6,0,0,0,67,0,0,0,115,22,0,0,0, + 116,0,0,100,1,0,100,2,0,100,3,0,100,4,0,100, + 5,0,131,3,1,83,41,6,78,114,32,0,0,0,122,8, + 60,115,116,114,105,110,103,62,114,191,0,0,0,114,206,0, + 0,0,84,41,1,114,207,0,0,0,41,2,114,110,0,0, + 0,114,128,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,6,0,0,0,114,189,0,0,0,21,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,2,0,0,0,1,0,0, + 0,67,0,0,0,115,4,0,0,0,100,1,0,83,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,4,0, + 0,0,41,2,114,110,0,0,0,114,167,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,6,0,0,0,114,188,0, + 0,0,24,4,0,0,115,0,0,0,0,122,30,95,78,97, + 109,101,115,112,97,99,101,76,111,97,100,101,114,46,99,114, + 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,0,0,83,41,1,78,114,4,0,0, + 0,41,2,114,110,0,0,0,114,192,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,114,193,0,0, + 0,27,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,2,0,0,0,3,0,0,0,67,0,0,0,115, + 32,0,0,0,116,0,0,100,1,0,124,0,0,106,1,0, + 131,2,0,1,116,2,0,106,3,0,124,0,0,124,1,0, + 131,2,0,83,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,107,0,0,0,114,234,0,0,0,114,123, + 0,0,0,114,194,0,0,0,41,2,114,110,0,0,0,114, + 128,0,0,0,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,114,195,0,0,0,30,4,0,0,115,4,0,0, + 0,0,7,16,1,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,114,0,0,0,114,113,0,0,0, + 114,115,0,0,0,114,187,0,0,0,114,185,0,0,0,114, + 250,0,0,0,114,162,0,0,0,114,204,0,0,0,114,189, + 0,0,0,114,188,0,0,0,114,193,0,0,0,114,195,0, + 0,0,114,4,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,6,0,0,0,114,249,0,0,0,2,4,0,0,115, + 16,0,0,0,12,1,12,3,18,9,12,3,12,3,12,3, + 12,3,12,3,114,249,0,0,0,99,0,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,64,0,0,0,115,160, + 0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100, + 1,0,90,3,0,101,4,0,100,2,0,100,3,0,132,0, + 0,131,1,0,90,5,0,101,4,0,100,4,0,100,5,0, + 132,0,0,131,1,0,90,6,0,101,4,0,100,6,0,100, + 7,0,132,0,0,131,1,0,90,7,0,101,4,0,100,8, + 0,100,9,0,132,0,0,131,1,0,90,8,0,101,4,0, + 100,10,0,100,11,0,100,12,0,132,1,0,131,1,0,90, + 9,0,101,4,0,100,10,0,100,10,0,100,13,0,100,14, + 0,132,2,0,131,1,0,90,10,0,101,4,0,100,10,0, + 100,15,0,100,16,0,132,1,0,131,1,0,90,11,0,100, + 10,0,83,41,17,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,2,0,0,0,4,0, + 0,0,67,0,0,0,115,55,0,0,0,120,48,0,116,0, + 0,106,1,0,106,2,0,131,0,0,68,93,31,0,125,1, + 0,116,3,0,124,1,0,100,1,0,131,2,0,114,16,0, + 124,1,0,106,4,0,131,0,0,1,113,16,0,87,100,2, + 0,83,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,218,17,105,110,118,97,108,105,100,97,116,101,95, + 99,97,99,104,101,115,78,41,5,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,6,118,97,108,117,101,115,114,117,0,0,0, + 114,252,0,0,0,41,2,114,173,0,0,0,218,6,102,105, + 110,100,101,114,114,4,0,0,0,114,4,0,0,0,114,6, + 0,0,0,114,252,0,0,0,47,4,0,0,115,6,0,0, + 0,0,4,22,1,15,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,3,0, + 0,0,12,0,0,0,67,0,0,0,115,107,0,0,0,116, + 0,0,106,1,0,100,1,0,107,9,0,114,41,0,116,0, + 0,106,1,0,12,114,41,0,116,2,0,106,3,0,100,2, + 0,116,4,0,131,2,0,1,120,59,0,116,0,0,106,1, + 0,68,93,44,0,125,2,0,121,14,0,124,2,0,124,1, + 0,131,1,0,83,87,113,51,0,4,116,5,0,107,10,0, + 114,94,0,1,1,1,119,51,0,89,113,51,0,88,113,51, + 0,87,100,1,0,83,100,1,0,83,41,3,122,113,83,101, + 97,114,99,104,32,115,101,113,117,101,110,99,101,32,111,102, + 32,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,10, + 10,32,32,32,32,32,32,32,32,73,102,32,39,104,111,111, + 107,115,39,32,105,115,32,102,97,108,115,101,32,116,104,101, + 110,32,117,115,101,32,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,46,10,10,32,32,32,32,32,32,32,32,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,62,0,0, + 0,114,63,0,0,0,114,127,0,0,0,114,109,0,0,0, + 41,3,114,173,0,0,0,114,37,0,0,0,90,4,104,111, + 111,107,114,4,0,0,0,114,4,0,0,0,114,6,0,0, + 0,218,11,95,112,97,116,104,95,104,111,111,107,115,55,4, + 0,0,115,16,0,0,0,0,7,25,1,16,1,16,1,3, + 1,14,1,13,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,3,0,0,0,19,0,0,0, + 67,0,0,0,115,123,0,0,0,124,1,0,100,1,0,107, + 2,0,114,53,0,121,16,0,116,0,0,106,1,0,131,0, + 0,125,1,0,87,110,22,0,4,116,2,0,107,10,0,114, + 52,0,1,1,1,100,2,0,83,89,110,1,0,88,121,17, + 0,116,3,0,106,4,0,124,1,0,25,125,2,0,87,110, + 46,0,4,116,5,0,107,10,0,114,118,0,1,1,1,124, + 0,0,106,6,0,124,1,0,131,1,0,125,2,0,124,2, + 0,116,3,0,106,4,0,124,1,0,60,89,110,1,0,88, + 124,2,0,83,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,32,0,0,0,78, + 41,7,114,3,0,0,0,114,47,0,0,0,218,17,70,105, + 108,101,78,111,116,70,111,117,110,100,69,114,114,111,114,114, + 8,0,0,0,114,253,0,0,0,114,140,0,0,0,114,1, + 1,0,0,41,3,114,173,0,0,0,114,37,0,0,0,114, + 255,0,0,0,114,4,0,0,0,114,4,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,72,4,0,0,115,22,0, + 0,0,0,8,12,1,3,1,16,1,13,3,9,1,3,1, + 17,1,13,1,15,1,18,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,6,0,0,0,3,0,0,0,67,0,0,0,115,119, + 0,0,0,116,0,0,124,2,0,100,1,0,131,2,0,114, + 39,0,124,2,0,106,1,0,124,1,0,131,1,0,92,2, + 0,125,3,0,125,4,0,110,21,0,124,2,0,106,2,0, + 124,1,0,131,1,0,125,3,0,103,0,0,125,4,0,124, + 3,0,100,0,0,107,9,0,114,88,0,116,3,0,106,4, + 0,124,1,0,124,3,0,131,2,0,83,116,3,0,106,5, + 0,124,1,0,100,0,0,131,2,0,125,5,0,124,4,0, + 124,5,0,95,6,0,124,5,0,83,41,2,78,114,126,0, + 0,0,41,7,114,117,0,0,0,114,126,0,0,0,114,184, + 0,0,0,114,123,0,0,0,114,181,0,0,0,114,163,0, + 0,0,114,159,0,0,0,41,6,114,173,0,0,0,114,128, + 0,0,0,114,255,0,0,0,114,129,0,0,0,114,130,0, + 0,0,114,167,0,0,0,114,4,0,0,0,114,4,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,94,4,0,0,115,18,0,0, + 0,0,4,15,1,24,2,15,1,6,1,12,1,16,1,18, + 1,9,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,9,0,0,0,5,0, + 0,0,67,0,0,0,115,243,0,0,0,103,0,0,125,4, + 0,120,230,0,124,2,0,68,93,191,0,125,5,0,116,0, + 0,124,5,0,116,1,0,116,2,0,102,2,0,131,2,0, + 115,43,0,113,13,0,124,0,0,106,3,0,124,5,0,131, + 1,0,125,6,0,124,6,0,100,1,0,107,9,0,114,13, + 0,116,4,0,124,6,0,100,2,0,131,2,0,114,106,0, + 124,6,0,106,5,0,124,1,0,124,3,0,131,2,0,125, + 7,0,110,18,0,124,0,0,106,6,0,124,1,0,124,6, + 0,131,2,0,125,7,0,124,7,0,100,1,0,107,8,0, + 114,139,0,113,13,0,124,7,0,106,7,0,100,1,0,107, + 9,0,114,158,0,124,7,0,83,124,7,0,106,8,0,125, + 8,0,124,8,0,100,1,0,107,8,0,114,191,0,116,9, + 0,100,3,0,131,1,0,130,1,0,124,4,0,106,10,0, + 124,8,0,131,1,0,1,113,13,0,87,116,11,0,106,12, + 0,124,1,0,100,1,0,131,2,0,125,7,0,124,4,0, + 124,7,0,95,8,0,124,7,0,83,100,1,0,83,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,183,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,146, + 0,0,0,114,71,0,0,0,218,5,98,121,116,101,115,114, + 3,1,0,0,114,117,0,0,0,114,183,0,0,0,114,4, + 1,0,0,114,129,0,0,0,114,159,0,0,0,114,109,0, + 0,0,114,152,0,0,0,114,123,0,0,0,114,163,0,0, + 0,41,9,114,173,0,0,0,114,128,0,0,0,114,37,0, + 0,0,114,182,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,255, + 0,0,0,114,167,0,0,0,114,130,0,0,0,114,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,218,9,95,103, + 101,116,95,115,112,101,99,109,4,0,0,115,40,0,0,0, + 0,5,6,1,13,1,21,1,3,1,15,1,12,1,15,1, + 21,2,18,1,12,1,3,1,15,1,4,1,9,1,12,1, + 12,5,17,2,18,1,9,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,6,0,0,0,4,0,0,0,67, + 0,0,0,115,140,0,0,0,124,2,0,100,1,0,107,8, + 0,114,21,0,116,0,0,106,1,0,125,2,0,124,0,0, + 106,2,0,124,1,0,124,2,0,124,3,0,131,3,0,125, + 4,0,124,4,0,100,1,0,107,8,0,114,58,0,100,1, + 0,83,124,4,0,106,3,0,100,1,0,107,8,0,114,132, + 0,124,4,0,106,4,0,125,5,0,124,5,0,114,125,0, + 100,2,0,124,4,0,95,5,0,116,6,0,124,1,0,124, + 5,0,124,0,0,106,2,0,131,3,0,124,4,0,95,4, + 0,124,4,0,83,100,1,0,83,110,4,0,124,4,0,83, + 100,1,0,83,41,3,122,98,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,78,90,9,110,97,109, + 101,115,112,97,99,101,41,7,114,8,0,0,0,114,37,0, + 0,0,114,7,1,0,0,114,129,0,0,0,114,159,0,0, + 0,114,161,0,0,0,114,232,0,0,0,41,6,114,173,0, + 0,0,114,128,0,0,0,114,37,0,0,0,114,182,0,0, + 0,114,167,0,0,0,114,6,1,0,0,114,4,0,0,0, + 114,4,0,0,0,114,6,0,0,0,114,183,0,0,0,141, + 4,0,0,115,26,0,0,0,0,4,12,1,9,1,21,1, + 12,1,4,1,15,1,9,1,6,3,9,1,24,1,4,2, + 7,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,4,0,0,0,3,0,0,0,67,0,0,0,115,41,0, + 0,0,124,0,0,106,0,0,124,1,0,124,2,0,131,2, + 0,125,3,0,124,3,0,100,1,0,107,8,0,114,34,0, + 100,1,0,83,124,3,0,106,1,0,83,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,78,90,9,110,97,109,101,115,112,97,99,101,41,7,114, - 8,0,0,0,114,37,0,0,0,114,6,1,0,0,114,129, - 0,0,0,114,158,0,0,0,114,160,0,0,0,114,231,0, - 0,0,41,6,114,172,0,0,0,114,128,0,0,0,114,37, - 0,0,0,114,181,0,0,0,114,166,0,0,0,114,5,1, - 0,0,114,4,0,0,0,114,4,0,0,0,114,6,0,0, - 0,114,182,0,0,0,117,4,0,0,115,26,0,0,0,0, - 4,12,1,9,1,21,1,12,1,4,1,15,1,9,1,6, - 3,9,1,24,1,4,2,7,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,4,0,0,0,3,0,0,0, - 67,0,0,0,115,41,0,0,0,124,0,0,106,0,0,124, - 1,0,124,2,0,131,2,0,125,3,0,124,3,0,100,1, - 0,107,8,0,114,34,0,100,1,0,83,124,3,0,106,1, - 0,83,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,41,2,114,182,0,0,0,114,129,0,0,0,41,4,114, - 172,0,0,0,114,128,0,0,0,114,37,0,0,0,114,166, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,183,0,0,0,139,4,0,0,115,8,0,0,0, - 0,8,18,1,12,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, - 41,12,114,114,0,0,0,114,113,0,0,0,114,115,0,0, - 0,114,116,0,0,0,114,184,0,0,0,114,251,0,0,0, - 114,0,1,0,0,114,2,1,0,0,114,3,1,0,0,114, - 6,1,0,0,114,182,0,0,0,114,183,0,0,0,114,4, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,250,0,0,0,19,4,0,0,115,22,0,0,0, - 12,2,6,2,18,8,18,17,18,22,18,15,3,1,18,31, - 3,1,21,21,3,1,114,250,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, - 115,133,0,0,0,101,0,0,90,1,0,100,0,0,90,2, - 0,100,1,0,90,3,0,100,2,0,100,3,0,132,0,0, - 90,4,0,100,4,0,100,5,0,132,0,0,90,5,0,101, - 6,0,90,7,0,100,6,0,100,7,0,132,0,0,90,8, - 0,100,8,0,100,9,0,132,0,0,90,9,0,100,10,0, - 100,11,0,100,12,0,132,1,0,90,10,0,100,13,0,100, - 14,0,132,0,0,90,11,0,101,12,0,100,15,0,100,16, - 0,132,0,0,131,1,0,90,13,0,100,17,0,100,18,0, - 132,0,0,90,14,0,100,10,0,83,41,19,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,5, - 0,0,0,5,0,0,0,7,0,0,0,115,122,0,0,0, - 103,0,0,125,3,0,120,52,0,124,2,0,68,93,44,0, - 92,2,0,137,0,0,125,4,0,124,3,0,106,0,0,135, - 0,0,102,1,0,100,1,0,100,2,0,134,0,0,124,4, - 0,68,131,1,0,131,1,0,1,113,13,0,87,124,3,0, - 124,0,0,95,1,0,124,1,0,112,79,0,100,3,0,124, - 0,0,95,2,0,100,6,0,124,0,0,95,3,0,116,4, - 0,131,0,0,124,0,0,95,5,0,116,4,0,131,0,0, - 124,0,0,95,6,0,100,5,0,83,41,7,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,2,0,0,0,3,0,0,0,51,0,0,0,115,27,0, - 0,0,124,0,0,93,17,0,125,1,0,124,1,0,136,0, - 0,102,2,0,86,1,113,3,0,100,0,0,83,41,1,78, - 114,4,0,0,0,41,2,114,24,0,0,0,114,226,0,0, - 0,41,1,114,129,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,228,0,0,0,168,4,0,0,115,2,0,0,0, - 6,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,60,0,0,0,114, - 31,0,0,0,78,114,89,0,0,0,41,7,114,151,0,0, - 0,218,8,95,108,111,97,100,101,114,115,114,37,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,110,0,0,0,114,37,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,168,0,0,0,114,4, - 0,0,0,41,1,114,129,0,0,0,114,6,0,0,0,114, - 186,0,0,0,162,4,0,0,115,16,0,0,0,0,4,6, - 1,19,1,36,1,9,2,15,1,9,1,12,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,1,0,0,0,2, - 0,0,0,67,0,0,0,115,13,0,0,0,100,3,0,124, - 0,0,95,0,0,100,2,0,83,41,4,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,31,0,0, - 0,78,114,89,0,0,0,41,1,114,9,1,0,0,41,1, - 114,110,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 6,0,0,0,114,251,0,0,0,176,4,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,3,0,0,0,2, - 0,0,0,67,0,0,0,115,59,0,0,0,124,0,0,106, - 0,0,124,1,0,131,1,0,125,2,0,124,2,0,100,1, - 0,107,8,0,114,37,0,100,1,0,103,0,0,102,2,0, - 83,124,2,0,106,1,0,124,2,0,106,2,0,112,55,0, - 103,0,0,102,2,0,83,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,182,0,0,0,114,129,0,0,0,114,158,0, - 0,0,41,3,114,110,0,0,0,114,128,0,0,0,114,166, - 0,0,0,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,114,126,0,0,0,182,4,0,0,115,8,0,0,0, - 0,7,15,1,12,1,10,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,7,0,0,0,7,0,0, - 0,67,0,0,0,115,40,0,0,0,124,1,0,124,2,0, - 124,3,0,131,2,0,125,6,0,116,0,0,124,2,0,124, - 3,0,100,1,0,124,6,0,100,2,0,124,4,0,131,2, - 2,83,41,3,78,114,129,0,0,0,114,158,0,0,0,41, - 1,114,169,0,0,0,41,7,114,110,0,0,0,114,167,0, - 0,0,114,128,0,0,0,114,37,0,0,0,90,4,115,109, - 115,108,114,181,0,0,0,114,129,0,0,0,114,4,0,0, - 0,114,4,0,0,0,114,6,0,0,0,114,6,1,0,0, - 194,4,0,0,115,6,0,0,0,0,1,15,1,18,1,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,14, - 0,0,0,15,0,0,0,67,0,0,0,115,234,1,0,0, - 100,1,0,125,3,0,124,1,0,106,0,0,100,2,0,131, - 1,0,100,3,0,25,125,4,0,121,34,0,116,1,0,124, - 0,0,106,2,0,112,49,0,116,3,0,106,4,0,131,0, - 0,131,1,0,106,5,0,125,5,0,87,110,24,0,4,116, - 6,0,107,10,0,114,85,0,1,1,1,100,10,0,125,5, - 0,89,110,1,0,88,124,5,0,124,0,0,106,7,0,107, - 3,0,114,120,0,124,0,0,106,8,0,131,0,0,1,124, - 5,0,124,0,0,95,7,0,116,9,0,131,0,0,114,153, - 0,124,0,0,106,10,0,125,6,0,124,4,0,106,11,0, - 131,0,0,125,7,0,110,15,0,124,0,0,106,12,0,125, - 6,0,124,4,0,125,7,0,124,7,0,124,6,0,107,6, - 0,114,45,1,116,13,0,124,0,0,106,2,0,124,4,0, - 131,2,0,125,8,0,120,100,0,124,0,0,106,14,0,68, - 93,77,0,92,2,0,125,9,0,125,10,0,100,5,0,124, - 9,0,23,125,11,0,116,13,0,124,8,0,124,11,0,131, - 2,0,125,12,0,116,15,0,124,12,0,131,1,0,114,208, - 0,124,0,0,106,16,0,124,10,0,124,1,0,124,12,0, - 124,8,0,103,1,0,124,2,0,131,5,0,83,113,208,0, - 87,116,17,0,124,8,0,131,1,0,125,3,0,120,123,0, - 124,0,0,106,14,0,68,93,112,0,92,2,0,125,9,0, - 125,10,0,116,13,0,124,0,0,106,2,0,124,4,0,124, - 9,0,23,131,2,0,125,12,0,116,18,0,100,6,0,106, - 19,0,124,12,0,131,1,0,100,7,0,100,3,0,131,1, - 1,1,124,7,0,124,9,0,23,124,6,0,107,6,0,114, - 55,1,116,15,0,124,12,0,131,1,0,114,55,1,124,0, - 0,106,16,0,124,10,0,124,1,0,124,12,0,100,8,0, - 124,2,0,131,5,0,83,113,55,1,87,124,3,0,114,230, - 1,116,18,0,100,9,0,106,19,0,124,8,0,131,1,0, - 131,1,0,1,116,20,0,106,21,0,124,1,0,100,8,0, - 131,2,0,125,13,0,124,8,0,103,1,0,124,13,0,95, - 22,0,124,13,0,83,100,8,0,83,41,11,122,102,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,32,32,82,101,116,117, - 114,110,115,32,116,104,101,10,32,32,32,32,32,32,32,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,70,114,60,0,0,0,114,58,0,0,0,114, - 31,0,0,0,114,186,0,0,0,122,9,116,114,121,105,110, - 103,32,123,125,114,100,0,0,0,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,114,89,0,0,0,41,23,114,34,0,0, - 0,114,41,0,0,0,114,37,0,0,0,114,3,0,0,0, - 114,47,0,0,0,114,220,0,0,0,114,42,0,0,0,114, - 9,1,0,0,218,11,95,102,105,108,108,95,99,97,99,104, - 101,114,7,0,0,0,114,12,1,0,0,114,90,0,0,0, - 114,11,1,0,0,114,30,0,0,0,114,8,1,0,0,114, - 46,0,0,0,114,6,1,0,0,114,48,0,0,0,114,107, - 0,0,0,114,49,0,0,0,114,123,0,0,0,114,162,0, - 0,0,114,158,0,0,0,41,14,114,110,0,0,0,114,128, - 0,0,0,114,181,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,135,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,226,0,0,0,114,167,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,166,0,0, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,2,114,183,0,0, + 0,114,129,0,0,0,41,4,114,173,0,0,0,114,128,0, + 0,0,114,37,0,0,0,114,167,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,114,184,0,0,0, + 163,4,0,0,115,8,0,0,0,0,8,18,1,12,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,41,12,114,114,0,0,0, + 114,113,0,0,0,114,115,0,0,0,114,116,0,0,0,114, + 185,0,0,0,114,252,0,0,0,114,1,1,0,0,114,3, + 1,0,0,114,4,1,0,0,114,7,1,0,0,114,183,0, + 0,0,114,184,0,0,0,114,4,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,114,251,0,0,0, + 43,4,0,0,115,22,0,0,0,12,2,6,2,18,8,18, + 17,18,22,18,15,3,1,18,31,3,1,21,21,3,1,114, + 251,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,133,0,0,0,101,0, + 0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,0, + 100,2,0,100,3,0,132,0,0,90,4,0,100,4,0,100, + 5,0,132,0,0,90,5,0,101,6,0,90,7,0,100,6, + 0,100,7,0,132,0,0,90,8,0,100,8,0,100,9,0, + 132,0,0,90,9,0,100,10,0,100,11,0,100,12,0,132, + 1,0,90,10,0,100,13,0,100,14,0,132,0,0,90,11, + 0,101,12,0,100,15,0,100,16,0,132,0,0,131,1,0, + 90,13,0,100,17,0,100,18,0,132,0,0,90,14,0,100, + 10,0,83,41,19,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,5,0,0,0,5,0,0,0, + 7,0,0,0,115,122,0,0,0,103,0,0,125,3,0,120, + 52,0,124,2,0,68,93,44,0,92,2,0,137,0,0,125, + 4,0,124,3,0,106,0,0,135,0,0,102,1,0,100,1, + 0,100,2,0,134,0,0,124,4,0,68,131,1,0,131,1, + 0,1,113,13,0,87,124,3,0,124,0,0,95,1,0,124, + 1,0,112,79,0,100,3,0,124,0,0,95,2,0,100,6, + 0,124,0,0,95,3,0,116,4,0,131,0,0,124,0,0, + 95,5,0,116,4,0,131,0,0,124,0,0,95,6,0,100, + 5,0,83,41,7,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,2,0,0,0,3,0, + 0,0,51,0,0,0,115,27,0,0,0,124,0,0,93,17, + 0,125,1,0,124,1,0,136,0,0,102,2,0,86,1,113, + 3,0,100,0,0,83,41,1,78,114,4,0,0,0,41,2, + 114,24,0,0,0,114,227,0,0,0,41,1,114,129,0,0, + 0,114,4,0,0,0,114,6,0,0,0,114,229,0,0,0, + 192,4,0,0,115,2,0,0,0,6,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,60,0,0,0,114,31,0,0,0,78,114,89, + 0,0,0,41,7,114,152,0,0,0,218,8,95,108,111,97, + 100,101,114,115,114,37,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, + 110,0,0,0,114,37,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,169,0,0,0,114,4,0,0,0,41,1,114,129, + 0,0,0,114,6,0,0,0,114,187,0,0,0,186,4,0, + 0,115,16,0,0,0,0,4,6,1,19,1,36,1,9,2, + 15,1,9,1,12,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,1,0,0,0,2,0,0,0,67,0,0,0, + 115,13,0,0,0,100,3,0,124,0,0,95,0,0,100,2, + 0,83,41,4,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,31,0,0,0,78,114,89,0,0,0, + 41,1,114,10,1,0,0,41,1,114,110,0,0,0,114,4, + 0,0,0,114,4,0,0,0,114,6,0,0,0,114,252,0, + 0,0,200,4,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,3,0,0,0,2,0,0,0,67,0,0,0, + 115,59,0,0,0,124,0,0,106,0,0,124,1,0,131,1, + 0,125,2,0,124,2,0,100,1,0,107,8,0,114,37,0, + 100,1,0,103,0,0,102,2,0,83,124,2,0,106,1,0, + 124,2,0,106,2,0,112,55,0,103,0,0,102,2,0,83, + 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,183,0,0, + 0,114,129,0,0,0,114,159,0,0,0,41,3,114,110,0, + 0,0,114,128,0,0,0,114,167,0,0,0,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,114,126,0,0,0, + 206,4,0,0,115,8,0,0,0,0,7,15,1,12,1,10, + 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,7,0,0,0,7,0,0,0,67,0,0,0,115,40, + 0,0,0,124,1,0,124,2,0,124,3,0,131,2,0,125, + 6,0,116,0,0,124,2,0,124,3,0,100,1,0,124,6, + 0,100,2,0,124,4,0,131,2,2,83,41,3,78,114,129, + 0,0,0,114,159,0,0,0,41,1,114,170,0,0,0,41, + 7,114,110,0,0,0,114,168,0,0,0,114,128,0,0,0, + 114,37,0,0,0,90,4,115,109,115,108,114,182,0,0,0, + 114,129,0,0,0,114,4,0,0,0,114,4,0,0,0,114, + 6,0,0,0,114,7,1,0,0,218,4,0,0,115,6,0, + 0,0,0,1,15,1,18,1,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,14,0,0,0,15,0,0,0, + 67,0,0,0,115,234,1,0,0,100,1,0,125,3,0,124, + 1,0,106,0,0,100,2,0,131,1,0,100,3,0,25,125, + 4,0,121,34,0,116,1,0,124,0,0,106,2,0,112,49, + 0,116,3,0,106,4,0,131,0,0,131,1,0,106,5,0, + 125,5,0,87,110,24,0,4,116,6,0,107,10,0,114,85, + 0,1,1,1,100,10,0,125,5,0,89,110,1,0,88,124, + 5,0,124,0,0,106,7,0,107,3,0,114,120,0,124,0, + 0,106,8,0,131,0,0,1,124,5,0,124,0,0,95,7, + 0,116,9,0,131,0,0,114,153,0,124,0,0,106,10,0, + 125,6,0,124,4,0,106,11,0,131,0,0,125,7,0,110, + 15,0,124,0,0,106,12,0,125,6,0,124,4,0,125,7, + 0,124,7,0,124,6,0,107,6,0,114,45,1,116,13,0, + 124,0,0,106,2,0,124,4,0,131,2,0,125,8,0,120, + 100,0,124,0,0,106,14,0,68,93,77,0,92,2,0,125, + 9,0,125,10,0,100,5,0,124,9,0,23,125,11,0,116, + 13,0,124,8,0,124,11,0,131,2,0,125,12,0,116,15, + 0,124,12,0,131,1,0,114,208,0,124,0,0,106,16,0, + 124,10,0,124,1,0,124,12,0,124,8,0,103,1,0,124, + 2,0,131,5,0,83,113,208,0,87,116,17,0,124,8,0, + 131,1,0,125,3,0,120,123,0,124,0,0,106,14,0,68, + 93,112,0,92,2,0,125,9,0,125,10,0,116,13,0,124, + 0,0,106,2,0,124,4,0,124,9,0,23,131,2,0,125, + 12,0,116,18,0,100,6,0,106,19,0,124,12,0,131,1, + 0,100,7,0,100,3,0,131,1,1,1,124,7,0,124,9, + 0,23,124,6,0,107,6,0,114,55,1,116,15,0,124,12, + 0,131,1,0,114,55,1,124,0,0,106,16,0,124,10,0, + 124,1,0,124,12,0,100,8,0,124,2,0,131,5,0,83, + 113,55,1,87,124,3,0,114,230,1,116,18,0,100,9,0, + 106,19,0,124,8,0,131,1,0,131,1,0,1,116,20,0, + 106,21,0,124,1,0,100,8,0,131,2,0,125,13,0,124, + 8,0,103,1,0,124,13,0,95,22,0,124,13,0,83,100, + 8,0,83,41,11,122,102,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,32,32,82,101,116,117,114,110,115,32,116,104,101, + 10,32,32,32,32,32,32,32,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,70,114,60, + 0,0,0,114,58,0,0,0,114,31,0,0,0,114,187,0, + 0,0,122,9,116,114,121,105,110,103,32,123,125,114,100,0, + 0,0,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,114,89, + 0,0,0,41,23,114,34,0,0,0,114,41,0,0,0,114, + 37,0,0,0,114,3,0,0,0,114,47,0,0,0,114,221, + 0,0,0,114,42,0,0,0,114,10,1,0,0,218,11,95, + 102,105,108,108,95,99,97,99,104,101,114,7,0,0,0,114, + 13,1,0,0,114,90,0,0,0,114,12,1,0,0,114,30, + 0,0,0,114,9,1,0,0,114,46,0,0,0,114,7,1, + 0,0,114,48,0,0,0,114,107,0,0,0,114,49,0,0, + 0,114,123,0,0,0,114,163,0,0,0,114,159,0,0,0, + 41,14,114,110,0,0,0,114,128,0,0,0,114,182,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,135,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,227,0,0,0,114,168,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,167,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,6,0,0,0,114,183,0,0,0,223,4, + 0,0,115,68,0,0,0,0,3,6,1,19,1,3,1,34, + 1,13,1,11,1,15,1,10,1,9,2,9,1,9,1,15, + 2,9,1,6,2,12,1,18,1,22,1,10,1,15,1,12, + 1,32,4,12,2,22,1,22,1,25,1,16,1,12,1,29, + 1,6,1,19,1,18,1,12,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,9,0,0,0,13,0, + 0,0,67,0,0,0,115,11,1,0,0,124,0,0,106,0, + 0,125,1,0,121,31,0,116,1,0,106,2,0,124,1,0, + 112,33,0,116,1,0,106,3,0,131,0,0,131,1,0,125, + 2,0,87,110,33,0,4,116,4,0,116,5,0,116,6,0, + 102,3,0,107,10,0,114,75,0,1,1,1,103,0,0,125, + 2,0,89,110,1,0,88,116,7,0,106,8,0,106,9,0, + 100,1,0,131,1,0,115,112,0,116,10,0,124,2,0,131, + 1,0,124,0,0,95,11,0,110,111,0,116,10,0,131,0, + 0,125,3,0,120,90,0,124,2,0,68,93,82,0,125,4, + 0,124,4,0,106,12,0,100,2,0,131,1,0,92,3,0, + 125,5,0,125,6,0,125,7,0,124,6,0,114,191,0,100, + 3,0,106,13,0,124,5,0,124,7,0,106,14,0,131,0, + 0,131,2,0,125,8,0,110,6,0,124,5,0,125,8,0, + 124,3,0,106,15,0,124,8,0,131,1,0,1,113,128,0, + 87,124,3,0,124,0,0,95,11,0,116,7,0,106,8,0, + 106,9,0,116,16,0,131,1,0,114,7,1,100,4,0,100, + 5,0,132,0,0,124,2,0,68,131,1,0,124,0,0,95, + 17,0,100,6,0,83,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,60,0,0,0,122,5,123,125,46,123,125,99, + 1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, + 83,0,0,0,115,28,0,0,0,104,0,0,124,0,0,93, + 18,0,125,1,0,124,1,0,106,0,0,131,0,0,146,2, + 0,113,6,0,83,114,4,0,0,0,41,1,114,90,0,0, + 0,41,2,114,24,0,0,0,90,2,102,110,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,250,9,60,115,101, + 116,99,111,109,112,62,41,5,0,0,115,2,0,0,0,9, + 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, + 37,0,0,0,114,3,0,0,0,90,7,108,105,115,116,100, + 105,114,114,47,0,0,0,114,2,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,11,1,0,0,114,12,1,0,0,114,85,0,0,0,114, + 49,0,0,0,114,90,0,0,0,218,3,97,100,100,114,11, + 0,0,0,114,13,1,0,0,41,9,114,110,0,0,0,114, + 37,0,0,0,90,8,99,111,110,116,101,110,116,115,90,21, + 108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110, + 116,101,110,116,115,114,247,0,0,0,114,108,0,0,0,114, + 239,0,0,0,114,227,0,0,0,90,8,110,101,119,95,110, + 97,109,101,114,4,0,0,0,114,4,0,0,0,114,6,0, + 0,0,114,15,1,0,0,12,5,0,0,115,34,0,0,0, + 0,2,9,1,3,1,31,1,22,3,11,3,18,1,18,7, + 9,1,13,1,24,1,6,1,27,2,6,1,17,1,9,1, + 18,1,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,3,0,0,0,3,0,0,0,7,0,0,0,115, + 25,0,0,0,135,0,0,135,1,0,102,2,0,100,1,0, + 100,2,0,134,0,0,125,2,0,124,2,0,83,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,1,0,0,0,4,0,0,0,19,0,0,0,115,43,0, + 0,0,116,0,0,124,0,0,131,1,0,115,30,0,116,1, + 0,100,1,0,100,2,0,124,0,0,131,1,1,130,1,0, + 136,0,0,124,0,0,136,1,0,140,1,0,83,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,37, + 0,0,0,41,2,114,48,0,0,0,114,109,0,0,0,41, + 1,114,37,0,0,0,41,2,114,173,0,0,0,114,14,1, + 0,0,114,4,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,53,5,0,0,115,6,0,0,0,0, + 2,12,1,18,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,4,0, + 0,0,41,3,114,173,0,0,0,114,14,1,0,0,114,20, + 1,0,0,114,4,0,0,0,41,2,114,173,0,0,0,114, + 14,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95, + 104,111,111,107,43,5,0,0,115,4,0,0,0,0,10,21, + 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, + 1,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, + 0,100,1,0,106,0,0,124,0,0,106,1,0,131,1,0, + 83,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114, + 40,123,33,114,125,41,41,2,114,49,0,0,0,114,37,0, + 0,0,41,1,114,110,0,0,0,114,4,0,0,0,114,4, + 0,0,0,114,6,0,0,0,114,246,0,0,0,61,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,15,114, + 114,0,0,0,114,113,0,0,0,114,115,0,0,0,114,116, + 0,0,0,114,187,0,0,0,114,252,0,0,0,114,132,0, + 0,0,114,184,0,0,0,114,126,0,0,0,114,7,1,0, + 0,114,183,0,0,0,114,15,1,0,0,114,185,0,0,0, + 114,21,1,0,0,114,246,0,0,0,114,4,0,0,0,114, + 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,8, + 1,0,0,177,4,0,0,115,20,0,0,0,12,7,6,2, + 12,14,12,4,6,2,12,12,12,5,15,45,12,31,18,18, + 114,8,1,0,0,99,4,0,0,0,0,0,0,0,6,0, + 0,0,11,0,0,0,67,0,0,0,115,195,0,0,0,124, + 0,0,106,0,0,100,1,0,131,1,0,125,4,0,124,0, + 0,106,0,0,100,2,0,131,1,0,125,5,0,124,4,0, + 115,99,0,124,5,0,114,54,0,124,5,0,106,1,0,125, + 4,0,110,45,0,124,2,0,124,3,0,107,2,0,114,84, + 0,116,2,0,124,1,0,124,2,0,131,2,0,125,4,0, + 110,15,0,116,3,0,124,1,0,124,2,0,131,2,0,125, + 4,0,124,5,0,115,126,0,116,4,0,124,1,0,124,2, + 0,100,3,0,124,4,0,131,2,1,125,5,0,121,44,0, + 124,5,0,124,0,0,100,2,0,60,124,4,0,124,0,0, + 100,1,0,60,124,2,0,124,0,0,100,4,0,60,124,3, + 0,124,0,0,100,5,0,60,87,110,18,0,4,116,5,0, + 107,10,0,114,190,0,1,1,1,89,110,1,0,88,100,0, + 0,83,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,129,0,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,129,0, + 0,0,114,225,0,0,0,114,220,0,0,0,114,170,0,0, + 0,218,9,69,120,99,101,112,116,105,111,110,41,6,90,2, + 110,115,114,108,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,129,0,0, + 0,114,167,0,0,0,114,4,0,0,0,114,4,0,0,0, + 114,6,0,0,0,218,14,95,102,105,120,95,117,112,95,109, + 111,100,117,108,101,67,5,0,0,115,34,0,0,0,0,2, + 15,1,15,1,6,1,6,1,12,1,12,1,18,2,15,1, + 6,1,21,1,3,1,10,1,10,1,10,1,14,1,13,2, + 114,26,1,0,0,99,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,55,0,0,0,116, + 0,0,116,1,0,106,2,0,131,0,0,102,2,0,125,0, + 0,116,3,0,116,4,0,102,2,0,125,1,0,116,5,0, + 116,6,0,102,2,0,125,2,0,124,0,0,124,1,0,124, + 2,0,103,3,0,83,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,226,0,0,0, + 114,148,0,0,0,218,18,101,120,116,101,110,115,105,111,110, + 95,115,117,102,102,105,120,101,115,114,220,0,0,0,114,86, + 0,0,0,114,225,0,0,0,114,76,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,4,0, + 0,0,114,4,0,0,0,114,6,0,0,0,114,164,0,0, + 0,90,5,0,0,115,8,0,0,0,0,5,18,1,12,1, + 12,1,114,164,0,0,0,99,1,0,0,0,0,0,0,0, + 12,0,0,0,12,0,0,0,67,0,0,0,115,70,2,0, + 0,124,0,0,97,0,0,116,0,0,106,1,0,97,1,0, + 116,0,0,106,2,0,97,2,0,116,1,0,106,3,0,116, + 4,0,25,125,1,0,120,76,0,100,26,0,68,93,68,0, + 125,2,0,124,2,0,116,1,0,106,3,0,107,7,0,114, + 83,0,116,0,0,106,5,0,124,2,0,131,1,0,125,3, + 0,110,13,0,116,1,0,106,3,0,124,2,0,25,125,3, + 0,116,6,0,124,1,0,124,2,0,124,3,0,131,3,0, + 1,113,44,0,87,100,5,0,100,6,0,103,1,0,102,2, + 0,100,7,0,100,8,0,100,6,0,103,2,0,102,2,0, + 102,2,0,125,4,0,120,149,0,124,4,0,68,93,129,0, + 92,2,0,125,5,0,125,6,0,116,7,0,100,9,0,100, + 10,0,132,0,0,124,6,0,68,131,1,0,131,1,0,115, + 199,0,116,8,0,130,1,0,124,6,0,100,11,0,25,125, + 7,0,124,5,0,116,1,0,106,3,0,107,6,0,114,241, + 0,116,1,0,106,3,0,124,5,0,25,125,8,0,80,113, + 156,0,121,20,0,116,0,0,106,5,0,124,5,0,131,1, + 0,125,8,0,80,87,113,156,0,4,116,9,0,107,10,0, + 114,28,1,1,1,1,119,156,0,89,113,156,0,88,113,156, + 0,87,116,9,0,100,12,0,131,1,0,130,1,0,116,6, + 0,124,1,0,100,13,0,124,8,0,131,3,0,1,116,6, + 0,124,1,0,100,14,0,124,7,0,131,3,0,1,116,6, + 0,124,1,0,100,15,0,100,16,0,106,10,0,124,6,0, + 131,1,0,131,3,0,1,121,19,0,116,0,0,106,5,0, + 100,17,0,131,1,0,125,9,0,87,110,24,0,4,116,9, + 0,107,10,0,114,147,1,1,1,1,100,18,0,125,9,0, + 89,110,1,0,88,116,6,0,124,1,0,100,17,0,124,9, + 0,131,3,0,1,116,0,0,106,5,0,100,19,0,131,1, + 0,125,10,0,116,6,0,124,1,0,100,19,0,124,10,0, + 131,3,0,1,124,5,0,100,7,0,107,2,0,114,238,1, + 116,0,0,106,5,0,100,20,0,131,1,0,125,11,0,116, + 6,0,124,1,0,100,21,0,124,11,0,131,3,0,1,116, + 6,0,124,1,0,100,22,0,116,11,0,131,0,0,131,3, + 0,1,116,12,0,106,13,0,116,2,0,106,14,0,131,0, + 0,131,1,0,1,124,5,0,100,7,0,107,2,0,114,66, + 2,116,15,0,106,16,0,100,23,0,131,1,0,1,100,24, + 0,116,12,0,107,6,0,114,66,2,100,25,0,116,17,0, + 95,18,0,100,18,0,83,41,27,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,114,51,0,0,0,114,62,0, + 0,0,218,8,98,117,105,108,116,105,110,115,114,145,0,0, + 0,90,5,112,111,115,105,120,250,1,47,218,2,110,116,250, + 1,92,99,1,0,0,0,0,0,0,0,2,0,0,0,3, + 0,0,0,115,0,0,0,115,33,0,0,0,124,0,0,93, + 23,0,125,1,0,116,0,0,124,1,0,131,1,0,100,0, + 0,107,2,0,86,1,113,3,0,100,1,0,83,41,2,114, + 31,0,0,0,78,41,1,114,33,0,0,0,41,2,114,24, + 0,0,0,114,79,0,0,0,114,4,0,0,0,114,4,0, + 0,0,114,6,0,0,0,114,229,0,0,0,126,5,0,0, + 115,2,0,0,0,6,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,61,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,3,0,0,0,114,27,0,0, + 0,114,23,0,0,0,114,32,0,0,0,90,7,95,116,104, + 114,101,97,100,78,90,8,95,119,101,97,107,114,101,102,90, + 6,119,105,110,114,101,103,114,172,0,0,0,114,7,0,0, + 0,122,4,46,112,121,119,122,6,95,100,46,112,121,100,84, + 41,4,114,51,0,0,0,114,62,0,0,0,114,28,1,0, + 0,114,145,0,0,0,41,19,114,123,0,0,0,114,8,0, + 0,0,114,148,0,0,0,114,241,0,0,0,114,114,0,0, + 0,90,18,95,98,117,105,108,116,105,110,95,102,114,111,109, + 95,110,97,109,101,114,118,0,0,0,218,3,97,108,108,218, + 14,65,115,115,101,114,116,105,111,110,69,114,114,111,114,114, + 109,0,0,0,114,28,0,0,0,114,13,0,0,0,114,231, + 0,0,0,114,152,0,0,0,114,27,1,0,0,114,86,0, + 0,0,114,166,0,0,0,114,171,0,0,0,114,175,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,23,0,0,0,114,27, + 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,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,218,6,95,115,101, + 116,117,112,101,5,0,0,115,82,0,0,0,0,8,6,1, + 9,1,9,3,13,1,13,1,15,1,18,2,13,1,20,3, + 33,1,19,2,31,1,10,1,15,1,13,1,4,2,3,1, + 15,1,5,1,13,1,12,2,12,1,16,1,16,1,25,3, + 3,1,19,1,13,2,11,1,16,3,15,1,16,3,12,1, + 15,1,16,3,19,1,19,1,12,1,13,1,12,1,114,35, + 1,0,0,99,1,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,67,0,0,0,115,116,0,0,0,116,0,0, + 124,0,0,131,1,0,1,116,1,0,131,0,0,125,1,0, + 116,2,0,106,3,0,106,4,0,116,5,0,106,6,0,124, + 1,0,140,0,0,103,1,0,131,1,0,1,116,7,0,106, + 8,0,100,1,0,107,2,0,114,78,0,116,2,0,106,9, + 0,106,10,0,116,11,0,131,1,0,1,116,2,0,106,9, + 0,106,10,0,116,12,0,131,1,0,1,116,5,0,124,0, + 0,95,5,0,116,13,0,124,0,0,95,13,0,100,2,0, + 83,41,3,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,114,30, + 1,0,0,78,41,14,114,35,1,0,0,114,164,0,0,0, + 114,8,0,0,0,114,0,1,0,0,114,152,0,0,0,114, + 8,1,0,0,114,21,1,0,0,114,3,0,0,0,114,114, + 0,0,0,218,9,109,101,116,97,95,112,97,116,104,114,166, + 0,0,0,114,171,0,0,0,114,251,0,0,0,114,220,0, + 0,0,41,2,114,34,1,0,0,90,17,115,117,112,112,111, + 114,116,101,100,95,108,111,97,100,101,114,115,114,4,0,0, + 0,114,4,0,0,0,114,6,0,0,0,218,8,95,105,110, + 115,116,97,108,108,169,5,0,0,115,16,0,0,0,0,2, + 10,1,9,1,28,1,15,1,16,1,16,4,9,1,114,37, + 1,0,0,41,1,114,0,0,0,0,41,2,114,1,0,0, + 0,114,2,0,0,0,41,62,114,116,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,19,0,0,0,114,21,0,0,0,114,30,0, + 0,0,114,40,0,0,0,114,41,0,0,0,114,45,0,0, + 0,114,46,0,0,0,114,48,0,0,0,114,57,0,0,0, + 218,4,116,121,112,101,218,8,95,95,99,111,100,101,95,95, + 114,147,0,0,0,114,17,0,0,0,114,137,0,0,0,114, + 16,0,0,0,114,20,0,0,0,90,17,95,82,65,87,95, + 77,65,71,73,67,95,78,85,77,66,69,82,90,4,95,109, + 115,103,218,11,83,121,115,116,101,109,69,114,114,111,114,114, + 138,0,0,0,114,75,0,0,0,114,74,0,0,0,114,86, + 0,0,0,114,76,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,81, + 0,0,0,114,87,0,0,0,114,93,0,0,0,114,97,0, + 0,0,114,99,0,0,0,114,107,0,0,0,114,125,0,0, + 0,114,132,0,0,0,114,144,0,0,0,114,150,0,0,0, + 114,153,0,0,0,114,158,0,0,0,218,6,111,98,106,101, + 99,116,114,165,0,0,0,114,170,0,0,0,114,171,0,0, + 0,114,186,0,0,0,114,196,0,0,0,114,212,0,0,0, + 114,220,0,0,0,114,225,0,0,0,114,231,0,0,0,114, + 226,0,0,0,114,232,0,0,0,114,249,0,0,0,114,251, + 0,0,0,114,8,1,0,0,114,26,1,0,0,114,164,0, + 0,0,114,35,1,0,0,114,37,1,0,0,114,4,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,6,0,0,0, - 114,182,0,0,0,199,4,0,0,115,68,0,0,0,0,3, - 6,1,19,1,3,1,34,1,13,1,11,1,15,1,10,1, - 9,2,9,1,9,1,15,2,9,1,6,2,12,1,18,1, - 22,1,10,1,15,1,12,1,32,4,12,2,22,1,22,1, - 25,1,16,1,12,1,29,1,6,1,19,1,18,1,12,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,9,0,0,0,13,0,0,0,67,0,0,0,115,11,1, - 0,0,124,0,0,106,0,0,125,1,0,121,31,0,116,1, - 0,106,2,0,124,1,0,112,33,0,116,1,0,106,3,0, - 131,0,0,131,1,0,125,2,0,87,110,33,0,4,116,4, - 0,116,5,0,116,6,0,102,3,0,107,10,0,114,75,0, - 1,1,1,103,0,0,125,2,0,89,110,1,0,88,116,7, - 0,106,8,0,106,9,0,100,1,0,131,1,0,115,112,0, - 116,10,0,124,2,0,131,1,0,124,0,0,95,11,0,110, - 111,0,116,10,0,131,0,0,125,3,0,120,90,0,124,2, - 0,68,93,82,0,125,4,0,124,4,0,106,12,0,100,2, - 0,131,1,0,92,3,0,125,5,0,125,6,0,125,7,0, - 124,6,0,114,191,0,100,3,0,106,13,0,124,5,0,124, - 7,0,106,14,0,131,0,0,131,2,0,125,8,0,110,6, - 0,124,5,0,125,8,0,124,3,0,106,15,0,124,8,0, - 131,1,0,1,113,128,0,87,124,3,0,124,0,0,95,11, - 0,116,7,0,106,8,0,106,9,0,116,16,0,131,1,0, - 114,7,1,100,4,0,100,5,0,132,0,0,124,2,0,68, - 131,1,0,124,0,0,95,17,0,100,6,0,83,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,60,0,0,0,122, - 5,123,125,46,123,125,99,1,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,83,0,0,0,115,28,0,0,0, - 104,0,0,124,0,0,93,18,0,125,1,0,124,1,0,106, - 0,0,131,0,0,146,2,0,113,6,0,83,114,4,0,0, - 0,41,1,114,90,0,0,0,41,2,114,24,0,0,0,90, - 2,102,110,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,250,9,60,115,101,116,99,111,109,112,62,17,5,0, - 0,115,2,0,0,0,9,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,37,0,0,0,114,3,0,0,0, - 90,7,108,105,115,116,100,105,114,114,47,0,0,0,114,1, - 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,10,1,0,0,114,11,1,0, - 0,114,85,0,0,0,114,49,0,0,0,114,90,0,0,0, - 218,3,97,100,100,114,11,0,0,0,114,12,1,0,0,41, - 9,114,110,0,0,0,114,37,0,0,0,90,8,99,111,110, - 116,101,110,116,115,90,21,108,111,119,101,114,95,115,117,102, - 102,105,120,95,99,111,110,116,101,110,116,115,114,246,0,0, - 0,114,108,0,0,0,114,238,0,0,0,114,226,0,0,0, - 90,8,110,101,119,95,110,97,109,101,114,4,0,0,0,114, - 4,0,0,0,114,6,0,0,0,114,14,1,0,0,244,4, - 0,0,115,34,0,0,0,0,2,9,1,3,1,31,1,22, - 3,11,3,18,1,18,7,9,1,13,1,24,1,6,1,27, - 2,6,1,17,1,9,1,18,1,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,3,0,0,0,3,0, - 0,0,7,0,0,0,115,25,0,0,0,135,0,0,135,1, - 0,102,2,0,100,1,0,100,2,0,134,0,0,125,2,0, - 124,2,0,83,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,1,0,0,0,4,0,0,0, - 19,0,0,0,115,43,0,0,0,116,0,0,124,0,0,131, - 1,0,115,30,0,116,1,0,100,1,0,100,2,0,124,0, - 0,131,1,1,130,1,0,136,0,0,124,0,0,136,1,0, - 140,1,0,83,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,37,0,0,0,41,2,114,48,0,0, - 0,114,109,0,0,0,41,1,114,37,0,0,0,41,2,114, - 172,0,0,0,114,13,1,0,0,114,4,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,29,5,0, - 0,115,6,0,0,0,0,2,12,1,18,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,4,0,0,0,41,3,114,172,0,0,0, - 114,13,1,0,0,114,19,1,0,0,114,4,0,0,0,41, - 2,114,172,0,0,0,114,13,1,0,0,114,6,0,0,0, - 218,9,112,97,116,104,95,104,111,111,107,19,5,0,0,115, - 4,0,0,0,0,10,21,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,1,0,0,0,2,0,0,0,67, - 0,0,0,115,16,0,0,0,100,1,0,106,0,0,124,0, - 0,106,1,0,131,1,0,83,41,2,78,122,16,70,105,108, - 101,70,105,110,100,101,114,40,123,33,114,125,41,41,2,114, - 49,0,0,0,114,37,0,0,0,41,1,114,110,0,0,0, - 114,4,0,0,0,114,4,0,0,0,114,6,0,0,0,114, - 245,0,0,0,37,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,15,114,114,0,0,0,114,113,0,0,0, - 114,115,0,0,0,114,116,0,0,0,114,186,0,0,0,114, - 251,0,0,0,114,132,0,0,0,114,183,0,0,0,114,126, - 0,0,0,114,6,1,0,0,114,182,0,0,0,114,14,1, - 0,0,114,184,0,0,0,114,20,1,0,0,114,245,0,0, - 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,6,0,0,0,114,7,1,0,0,153,4,0,0,115,20, - 0,0,0,12,7,6,2,12,14,12,4,6,2,12,12,12, - 5,15,45,12,31,18,18,114,7,1,0,0,99,4,0,0, - 0,0,0,0,0,6,0,0,0,11,0,0,0,67,0,0, - 0,115,195,0,0,0,124,0,0,106,0,0,100,1,0,131, - 1,0,125,4,0,124,0,0,106,0,0,100,2,0,131,1, - 0,125,5,0,124,4,0,115,99,0,124,5,0,114,54,0, - 124,5,0,106,1,0,125,4,0,110,45,0,124,2,0,124, - 3,0,107,2,0,114,84,0,116,2,0,124,1,0,124,2, - 0,131,2,0,125,4,0,110,15,0,116,3,0,124,1,0, - 124,2,0,131,2,0,125,4,0,124,5,0,115,126,0,116, - 4,0,124,1,0,124,2,0,100,3,0,124,4,0,131,2, - 1,125,5,0,121,44,0,124,5,0,124,0,0,100,2,0, - 60,124,4,0,124,0,0,100,1,0,60,124,2,0,124,0, - 0,100,4,0,60,124,3,0,124,0,0,100,5,0,60,87, - 110,18,0,4,116,5,0,107,10,0,114,190,0,1,1,1, - 89,110,1,0,88,100,0,0,83,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,129,0,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,129,0,0,0,114,224,0,0,0,114,219, - 0,0,0,114,169,0,0,0,218,9,69,120,99,101,112,116, - 105,111,110,41,6,90,2,110,115,114,108,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,129,0,0,0,114,166,0,0,0,114,4,0, - 0,0,114,4,0,0,0,114,6,0,0,0,218,14,95,102, - 105,120,95,117,112,95,109,111,100,117,108,101,43,5,0,0, - 115,34,0,0,0,0,2,15,1,15,1,6,1,6,1,12, - 1,12,1,18,2,15,1,6,1,21,1,3,1,10,1,10, - 1,10,1,14,1,13,2,114,25,1,0,0,99,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,55,0,0,0,116,0,0,116,1,0,106,2,0,131, - 0,0,102,2,0,125,0,0,116,3,0,116,4,0,102,2, - 0,125,1,0,116,5,0,116,6,0,102,2,0,125,2,0, - 124,0,0,124,1,0,124,2,0,103,3,0,83,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,225,0,0,0,114,147,0,0,0,218,18,101,120, - 116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,115, - 114,219,0,0,0,114,86,0,0,0,114,224,0,0,0,114, - 76,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,4,0,0,0,114,4,0,0,0,114,6, - 0,0,0,114,163,0,0,0,66,5,0,0,115,8,0,0, - 0,0,5,18,1,12,1,12,1,114,163,0,0,0,99,1, - 0,0,0,0,0,0,0,12,0,0,0,12,0,0,0,67, - 0,0,0,115,70,2,0,0,124,0,0,97,0,0,116,0, - 0,106,1,0,97,1,0,116,0,0,106,2,0,97,2,0, - 116,1,0,106,3,0,116,4,0,25,125,1,0,120,76,0, - 100,26,0,68,93,68,0,125,2,0,124,2,0,116,1,0, - 106,3,0,107,7,0,114,83,0,116,0,0,106,5,0,124, - 2,0,131,1,0,125,3,0,110,13,0,116,1,0,106,3, - 0,124,2,0,25,125,3,0,116,6,0,124,1,0,124,2, - 0,124,3,0,131,3,0,1,113,44,0,87,100,5,0,100, - 6,0,103,1,0,102,2,0,100,7,0,100,8,0,100,6, - 0,103,2,0,102,2,0,102,2,0,125,4,0,120,149,0, - 124,4,0,68,93,129,0,92,2,0,125,5,0,125,6,0, - 116,7,0,100,9,0,100,10,0,132,0,0,124,6,0,68, - 131,1,0,131,1,0,115,199,0,116,8,0,130,1,0,124, - 6,0,100,11,0,25,125,7,0,124,5,0,116,1,0,106, - 3,0,107,6,0,114,241,0,116,1,0,106,3,0,124,5, - 0,25,125,8,0,80,113,156,0,121,20,0,116,0,0,106, - 5,0,124,5,0,131,1,0,125,8,0,80,87,113,156,0, - 4,116,9,0,107,10,0,114,28,1,1,1,1,119,156,0, - 89,113,156,0,88,113,156,0,87,116,9,0,100,12,0,131, - 1,0,130,1,0,116,6,0,124,1,0,100,13,0,124,8, - 0,131,3,0,1,116,6,0,124,1,0,100,14,0,124,7, - 0,131,3,0,1,116,6,0,124,1,0,100,15,0,100,16, - 0,106,10,0,124,6,0,131,1,0,131,3,0,1,121,19, - 0,116,0,0,106,5,0,100,17,0,131,1,0,125,9,0, - 87,110,24,0,4,116,9,0,107,10,0,114,147,1,1,1, - 1,100,18,0,125,9,0,89,110,1,0,88,116,6,0,124, - 1,0,100,17,0,124,9,0,131,3,0,1,116,0,0,106, - 5,0,100,19,0,131,1,0,125,10,0,116,6,0,124,1, - 0,100,19,0,124,10,0,131,3,0,1,124,5,0,100,7, - 0,107,2,0,114,238,1,116,0,0,106,5,0,100,20,0, - 131,1,0,125,11,0,116,6,0,124,1,0,100,21,0,124, - 11,0,131,3,0,1,116,6,0,124,1,0,100,22,0,116, - 11,0,131,0,0,131,3,0,1,116,12,0,106,13,0,116, - 2,0,106,14,0,131,0,0,131,1,0,1,124,5,0,100, - 7,0,107,2,0,114,66,2,116,15,0,106,16,0,100,23, - 0,131,1,0,1,100,24,0,116,12,0,107,6,0,114,66, - 2,100,25,0,116,17,0,95,18,0,100,18,0,83,41,27, - 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,114, - 51,0,0,0,114,62,0,0,0,218,8,98,117,105,108,116, - 105,110,115,114,144,0,0,0,90,5,112,111,115,105,120,250, - 1,47,218,2,110,116,250,1,92,99,1,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,115,0,0,0,115,33, - 0,0,0,124,0,0,93,23,0,125,1,0,116,0,0,124, - 1,0,131,1,0,100,0,0,107,2,0,86,1,113,3,0, - 100,1,0,83,41,2,114,31,0,0,0,78,41,1,114,33, - 0,0,0,41,2,114,24,0,0,0,114,79,0,0,0,114, - 4,0,0,0,114,4,0,0,0,114,6,0,0,0,114,228, - 0,0,0,102,5,0,0,115,2,0,0,0,6,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,61,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,3, - 0,0,0,114,27,0,0,0,114,23,0,0,0,114,32,0, - 0,0,90,7,95,116,104,114,101,97,100,78,90,8,95,119, - 101,97,107,114,101,102,90,6,119,105,110,114,101,103,114,171, - 0,0,0,114,7,0,0,0,122,4,46,112,121,119,122,6, - 95,100,46,112,121,100,84,41,4,114,51,0,0,0,114,62, - 0,0,0,114,27,1,0,0,114,144,0,0,0,41,19,114, - 123,0,0,0,114,8,0,0,0,114,147,0,0,0,114,240, - 0,0,0,114,114,0,0,0,90,18,95,98,117,105,108,116, - 105,110,95,102,114,111,109,95,110,97,109,101,114,118,0,0, - 0,218,3,97,108,108,218,14,65,115,115,101,114,116,105,111, - 110,69,114,114,111,114,114,109,0,0,0,114,28,0,0,0, - 114,13,0,0,0,114,230,0,0,0,114,151,0,0,0,114, - 26,1,0,0,114,86,0,0,0,114,165,0,0,0,114,170, - 0,0,0,114,174,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,23,0,0,0,114,27,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,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,218,6,95,115,101,116,117,112,77,5,0,0,115,82, - 0,0,0,0,8,6,1,9,1,9,3,13,1,13,1,15, - 1,18,2,13,1,20,3,33,1,19,2,31,1,10,1,15, - 1,13,1,4,2,3,1,15,1,5,1,13,1,12,2,12, - 1,16,1,16,1,25,3,3,1,19,1,13,2,11,1,16, - 3,15,1,16,3,12,1,15,1,16,3,19,1,19,1,12, - 1,13,1,12,1,114,34,1,0,0,99,1,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 116,0,0,0,116,0,0,124,0,0,131,1,0,1,116,1, - 0,131,0,0,125,1,0,116,2,0,106,3,0,106,4,0, - 116,5,0,106,6,0,124,1,0,140,0,0,103,1,0,131, - 1,0,1,116,7,0,106,8,0,100,1,0,107,2,0,114, - 78,0,116,2,0,106,9,0,106,10,0,116,11,0,131,1, - 0,1,116,2,0,106,9,0,106,10,0,116,12,0,131,1, - 0,1,116,5,0,124,0,0,95,5,0,116,13,0,124,0, - 0,95,13,0,100,2,0,83,41,3,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,114,29,1,0,0,78,41,14,114,34,1, - 0,0,114,163,0,0,0,114,8,0,0,0,114,255,0,0, - 0,114,151,0,0,0,114,7,1,0,0,114,20,1,0,0, - 114,3,0,0,0,114,114,0,0,0,218,9,109,101,116,97, - 95,112,97,116,104,114,165,0,0,0,114,170,0,0,0,114, - 250,0,0,0,114,219,0,0,0,41,2,114,33,1,0,0, - 90,17,115,117,112,112,111,114,116,101,100,95,108,111,97,100, - 101,114,115,114,4,0,0,0,114,4,0,0,0,114,6,0, - 0,0,218,8,95,105,110,115,116,97,108,108,145,5,0,0, - 115,16,0,0,0,0,2,10,1,9,1,28,1,15,1,16, - 1,16,4,9,1,114,36,1,0,0,41,1,114,0,0,0, - 0,41,2,114,1,0,0,0,114,2,0,0,0,41,59,114, - 116,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,19,0,0,0,114, - 21,0,0,0,114,30,0,0,0,114,40,0,0,0,114,41, - 0,0,0,114,45,0,0,0,114,46,0,0,0,114,48,0, - 0,0,114,57,0,0,0,218,4,116,121,112,101,218,8,95, - 95,99,111,100,101,95,95,114,146,0,0,0,114,17,0,0, - 0,114,137,0,0,0,114,16,0,0,0,114,20,0,0,0, - 90,17,95,82,65,87,95,77,65,71,73,67,95,78,85,77, - 66,69,82,114,75,0,0,0,114,74,0,0,0,114,86,0, - 0,0,114,76,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,81,0, - 0,0,114,87,0,0,0,114,93,0,0,0,114,97,0,0, - 0,114,99,0,0,0,114,107,0,0,0,114,125,0,0,0, - 114,132,0,0,0,114,143,0,0,0,114,149,0,0,0,114, - 152,0,0,0,114,157,0,0,0,218,6,111,98,106,101,99, - 116,114,164,0,0,0,114,169,0,0,0,114,170,0,0,0, - 114,185,0,0,0,114,195,0,0,0,114,211,0,0,0,114, - 219,0,0,0,114,224,0,0,0,114,230,0,0,0,114,225, - 0,0,0,114,231,0,0,0,114,248,0,0,0,114,250,0, - 0,0,114,7,1,0,0,114,25,1,0,0,114,163,0,0, - 0,114,34,1,0,0,114,36,1,0,0,114,4,0,0,0, - 114,4,0,0,0,114,4,0,0,0,114,6,0,0,0,218, - 8,60,109,111,100,117,108,101,62,8,0,0,0,115,106,0, - 0,0,6,16,6,1,6,1,3,1,7,3,12,17,12,5, - 12,5,12,6,12,12,12,10,12,9,12,5,12,7,15,22, - 15,114,22,1,18,2,6,1,6,2,9,2,9,2,10,2, - 21,44,12,33,12,19,12,12,12,12,18,8,12,28,12,17, - 21,55,21,12,18,10,12,14,9,3,12,1,15,65,19,64, - 19,28,22,110,19,41,25,43,25,16,6,3,25,53,19,57, - 19,41,19,134,19,146,15,23,12,11,12,68, + 218,8,60,109,111,100,117,108,101,62,8,0,0,0,115,114, + 0,0,0,6,16,6,1,6,1,3,1,7,3,12,17,12, + 5,12,5,12,6,12,12,12,10,12,9,12,5,12,7,15, + 22,15,114,22,1,18,19,12,1,6,1,12,1,22,2,6, + 1,6,2,9,2,9,2,10,2,21,44,12,33,12,19,12, + 12,12,12,18,8,12,28,12,17,21,57,21,12,18,10,12, + 14,9,3,12,1,15,65,19,64,19,28,22,110,19,41,25, + 43,25,16,6,3,25,53,19,57,19,41,19,134,19,146,15, + 23,12,11,12,68, }; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 90cb2de27ca234..dd41a3a3def716 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -259,6 +259,21 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *f } +/* Issue #29537: handle issue27286 bytecode incompatibility + * See Lib/importlib/_bootstrap_external.py for general discussion + */ +extern PY_UINT32_T _Py_BACKCOMPAT_HALF_MAGIC; +static int +_check_half_magic(unsigned int read_value, unsigned int halfmagic) { + return (read_value == halfmagic || read_value == _Py_BACKCOMPAT_HALF_MAGIC); +} + +extern PY_UINT32_T _Py_BACKCOMPAT_MAGIC_NUMBER; +static int +_check_magic(long read_value, long magic) { + return (read_value == magic || read_value == _Py_BACKCOMPAT_MAGIC_NUMBER); +} + /* Check whether a file maybe a pyc file: Look at the extension, the file type, and, if we may close it, at the first few bytes. */ @@ -290,7 +305,7 @@ maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) int ispyc = 0; if (ftell(fp) == 0) { if (fread(buf, 1, 2, fp) == 2 && - ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) + _check_half_magic(((unsigned int)buf[1]<<8 | buf[0]), halfmagic)) ispyc = 1; rewind(fp); } @@ -988,7 +1003,7 @@ run_pyc_file(FILE *fp, const char *filename, PyObject *globals, long PyImport_GetMagicNumber(void); magic = PyMarshal_ReadLongFromFile(fp); - if (magic != PyImport_GetMagicNumber()) { + if (!_check_magic(magic, PyImport_GetMagicNumber())) { if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, "Bad magic number in .pyc file"); From 312f7dfb7c669fcfc43020951b7f8ff521200ad7 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 7 Mar 2017 23:56:52 -0800 Subject: [PATCH 064/220] Revert "bpo-29571: Use correct locale encoding in test_re (#149)" (#554) (#556) This reverts commit ace5c0fdd9b962e6e886c29dbcea72c53f051dc4. --- Lib/test/test_re.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 407f3468e86671..9acd5abbfd7776 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1334,7 +1334,7 @@ def test_ascii_and_unicode_flag(self): def test_locale_flag(self): import locale - enc = locale.getpreferredencoding(False) + _, enc = locale.getlocale(locale.LC_CTYPE) # Search non-ASCII letter for i in range(128, 256): try: From 0410bee6e6c87f37e91f6cae3627d8e3704075f1 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Wed, 8 Mar 2017 21:03:04 +1000 Subject: [PATCH 065/220] bpo-29537: Also cover 3.5.2 in NEWS entry --- Misc/NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index 82f9f9a1f58b07..42a3b026bb74c1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -11,7 +11,7 @@ Core and Builtins ----------------- - Issue #29537: Restore runtime compatibility with bytecode files generated by - CPython 3.5.0 and 3.5.1, and adjust the eval loop to avoid the problems that + CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems that could be caused by the malformed variant of the BUILD_MAP_UNPACK_WITH_CALL opcode that they may contain. Patch by Petr Viktorin, Serhiy Storchaka, and Nick Coghlan. From 952b7cb78046f4bc3bf28cb7de84d1c6bcec45d7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Mar 2017 10:52:19 +0200 Subject: [PATCH 066/220] bpo-29768: Fixed compile-time check for expat version. (#574) (#578) (cherry picked from commit 22e707fa04476710ba5cc7e2206e4ac66743931b) --- Modules/pyexpat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 00c96a16c7895a..3a6e590ef21ba6 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1190,7 +1190,7 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec Py_DECREF(self); return NULL; } -#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT) +#if XML_COMBINED_VERSION >= 20100 || defined(XML_HAS_SET_HASH_SALT) /* This feature was added upstream in libexpat 2.1.0. Our expat copy * has a backport of this feature where we also define XML_HAS_SET_HASH_SALT * to indicate that we can still use it. */ From 5fad493dc6634635bc6ba951b39b4d1bf552ef84 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Mar 2017 21:02:15 +0200 Subject: [PATCH 067/220] [3.5] bpo-29773: Add more cases for testing string to float conversion errors. (#587) (cherry picked from commit 9e6ac83acae31de2b072e665e177db9fcdf7c049) --- Lib/test/test_float.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index cb1f6db8fc7627..28b6954c4d5923 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -98,15 +98,27 @@ def test_float_memoryview(self): self.assertEqual(float(memoryview(b'12.34')[1:4]), 2.3) def test_error_message(self): - testlist = ('\xbd', '123\xbd', ' 123 456 ') - for s in testlist: - try: + def check(s): + with self.assertRaises(ValueError, msg='float(%r)' % (s,)) as cm: float(s) - except ValueError as e: - self.assertIn(s.strip(), e.args[0]) - else: - self.fail("Expected int(%r) to raise a ValueError", s) - + self.assertEqual(str(cm.exception), + 'could not convert string to float: %r' % (s,)) + + check('\xbd') + check('123\xbd') + check(' 123 456 ') + check(b' 123 456 ') + + # non-ascii digits (error came from non-digit '!') + check('\u0663\u0661\u0664!') + # embedded NUL + check('123\x00') + check('123\x00 245') + check('123\x00245') + # byte string with embedded NUL + check(b'123\x00') + # non-UTF-8 byte string + check(b'123\xa0') @support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') def test_float_with_comma(self): From e2c88bdd6bb3efbc81389958d62daf6dd0d6eda7 Mon Sep 17 00:00:00 2001 From: orenmn Date: Thu, 9 Mar 2017 21:29:22 +0200 Subject: [PATCH 068/220] bpo-28298: make array 'Q', 'L' and 'I' accept big intables as elements --- Lib/test/test_array.py | 25 +++++++++- Misc/NEWS | 3 ++ Modules/arraymodule.c | 108 +++++++++++++++++++++++------------------ 3 files changed, 88 insertions(+), 48 deletions(-) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 2a21e745b1bcd2..cbc6b6d686341c 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1225,7 +1225,26 @@ def test_frombytearray(self): b = array.array(self.typecode, a) self.assertEqual(a, b) -class SignedNumberTest(NumberTest): +class IntegerNumberTest(NumberTest): + def test_type_error(self): + a = array.array(self.typecode) + a.append(42) + with self.assertRaises(TypeError): + a.append(42.0) + with self.assertRaises(TypeError): + a[0] = 42.0 + +class Intable: + def __init__(self, num): + self._num = num + def __int__(self): + return self._num + def __sub__(self, other): + return Intable(int(self) - int(other)) + def __add__(self, other): + return Intable(int(self) + int(other)) + +class SignedNumberTest(IntegerNumberTest): example = [-1, 0, 1, 42, 0x7f] smallerexample = [-1, 0, 1, 42, 0x7e] biggerexample = [-1, 0, 1, 43, 0x7f] @@ -1236,8 +1255,9 @@ def test_overflow(self): lower = -1 * int(pow(2, a.itemsize * 8 - 1)) upper = int(pow(2, a.itemsize * 8 - 1)) - 1 self.check_overflow(lower, upper) + self.check_overflow(Intable(lower), Intable(upper)) -class UnsignedNumberTest(NumberTest): +class UnsignedNumberTest(IntegerNumberTest): example = [0, 1, 17, 23, 42, 0xff] smallerexample = [0, 1, 17, 23, 42, 0xfe] biggerexample = [0, 1, 17, 23, 43, 0xff] @@ -1248,6 +1268,7 @@ def test_overflow(self): lower = 0 upper = int(pow(2, a.itemsize * 8)) - 1 self.check_overflow(lower, upper) + self.check_overflow(Intable(lower), Intable(upper)) def test_bytes_extend(self): s = bytes(self.example) diff --git a/Misc/NEWS b/Misc/NEWS index 42a3b026bb74c1..df0975a4d5ea22 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -41,6 +41,9 @@ Extension Modules Library ------- +- bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big + intables (objects that have __int__) as elements. Patch by Oren Milman. + - bpo-29615: SimpleXMLRPCDispatcher no longer chains KeyError (or any other exception) to exception(s) raised in the dispatched methods. Patch by Petr Motejlek. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index a4966b4bddb53a..8612847fcafe81 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -331,35 +331,51 @@ II_getitem(arrayobject *ap, Py_ssize_t i) (unsigned long) ((unsigned int *)ap->ob_item)[i]); } +static PyObject * +get_int_unless_float(PyObject *v) +{ + if (PyFloat_Check(v)) { + PyErr_SetString(PyExc_TypeError, + "array item must be integer"); + return NULL; + } + return (PyObject *)_PyLong_FromNbInt(v); +} + static int II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLong(v); - if (x == (unsigned long) -1 && PyErr_Occurred()) + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; + } + do_decref = 1; } - else { - long y; - if (!PyArg_Parse(v, "l;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned int is less than minimum"); - return -1; + x = PyLong_AsUnsignedLong(v); + if (x == (unsigned long)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); } - x = (unsigned long)y; - + return -1; } if (x > UINT_MAX) { PyErr_SetString(PyExc_OverflowError, - "unsigned int is greater than maximum"); + "unsigned int is greater than maximum"); + if (do_decref) { + Py_DECREF(v); + } return -1; } - if (i >= 0) ((unsigned int *)ap->ob_item)[i] = (unsigned int)x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } @@ -390,31 +406,28 @@ static int LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned long x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLong(v); - if (x == (unsigned long) -1 && PyErr_Occurred()) - return -1; - } - else { - long y; - if (!PyArg_Parse(v, "l;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long is less than minimum"); + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; } - x = (unsigned long)y; - + do_decref = 1; } - if (x > ULONG_MAX) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long is greater than maximum"); + x = PyLong_AsUnsignedLong(v); + if (x == (unsigned long)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); + } return -1; } - if (i >= 0) ((unsigned long *)ap->ob_item)[i] = x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } @@ -448,25 +461,28 @@ static int QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v) { unsigned PY_LONG_LONG x; - if (PyLong_Check(v)) { - x = PyLong_AsUnsignedLongLong(v); - if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred()) + int do_decref = 0; /* if nb_int was called */ + + if (!PyLong_Check(v)) { + v = get_int_unless_float(v); + if (NULL == v) { return -1; + } + do_decref = 1; } - else { - PY_LONG_LONG y; - if (!PyArg_Parse(v, "L;array item must be integer", &y)) - return -1; - if (y < 0) { - PyErr_SetString(PyExc_OverflowError, - "unsigned long long is less than minimum"); - return -1; + x = PyLong_AsUnsignedLongLong(v); + if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) { + if (do_decref) { + Py_DECREF(v); } - x = (unsigned PY_LONG_LONG)y; + return -1; } - if (i >= 0) ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x; + + if (do_decref) { + Py_DECREF(v); + } return 0; } #endif From e73f9256a2dfb21a60f333f815f2c1fe4cdca0d0 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Fri, 10 Mar 2017 01:07:18 -0600 Subject: [PATCH 069/220] Add Appveyor (GH-324 backport) (GH-492) --- .github/appveyor.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/appveyor.yml diff --git a/.github/appveyor.yml b/.github/appveyor.yml new file mode 100644 index 00000000000000..e44b5b09e6ea17 --- /dev/null +++ b/.github/appveyor.yml @@ -0,0 +1,6 @@ +version: 3.5.3+.{build} +clone_depth: 5 +build_script: +- cmd: PCbuild\build.bat -e +test_script: +- cmd: PCbuild\rt.bat -q -uall -rwW --timeout=1200 -j0 From 518d8fcb89896dd30fbf11c667ee4e6b509e4dd9 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 10 Mar 2017 19:36:52 -0800 Subject: [PATCH 070/220] bpo-29784: Fix the reference to shutil.copy in the docs (GH-602) (GH-609) (cherry picked from commit 70ee0cd5c2a3dba82cb8e0c0742c012f9134c040) --- Doc/library/shutil.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index b020bb31c83b7b..358081137afd9c 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -153,7 +153,7 @@ Directory and files operations is true and *src* is a symbolic link, *dst* will be a copy of the file *src* refers to. - :func:`copy` copies the file data and the file's permission + :func:`~shutil.copy` copies the file data and the file's permission mode (see :func:`os.chmod`). Other metadata, like the file's creation and modification times, is not preserved. To preserve all file metadata from the original, use @@ -302,7 +302,7 @@ Directory and files operations *src* and *dst*, and will be used to copy *src* to *dest* if :func:`os.rename` cannot be used. If the source is a directory, :func:`copytree` is called, passing it the :func:`copy_function`. The - default *copy_function* is :func:`copy2`. Using :func:`copy` as the + default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the *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. From ce222c87706b1062f7fc03867d1867aa4848dd7b Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Sat, 11 Mar 2017 14:12:29 +0800 Subject: [PATCH 071/220] bpo-29770: remove outdated PYO related info (GH-590) (GH-613) --- Doc/glossary.rst | 2 +- Doc/library/zipfile.rst | 6 +++--- Doc/library/zipimport.rst | 2 +- Doc/using/cmdline.rst | 4 ++-- Modules/main.c | 2 +- Modules/zipimport.c | 8 ++++---- PC/getpathp.c | 4 ++-- PCbuild/rmpyc.py | 20 +++++++------------- PCbuild/rt.bat | 8 ++++---- Python/pylifecycle.c | 2 +- 10 files changed, 26 insertions(+), 32 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 45b794f48ef7c9..4a8bb8e633b3aa 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -127,7 +127,7 @@ Glossary bytecode Python source code is compiled into bytecode, the internal representation of a Python program in the CPython interpreter. The bytecode is also - cached in ``.pyc`` and ``.pyo`` files so that executing the same file is + cached in ``.pyc`` files so that executing the same file is faster the second time (recompilation from source to bytecode can be avoided). This "intermediate language" is said to run on a :term:`virtual machine` that executes the machine code corresponding to diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index d144ae36f1e7cb..629b7ed55a145a 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -418,12 +418,12 @@ The :class:`PyZipFile` constructor takes the same parameters as the added to the archive, compiling if necessary. If *pathname* is a file, the filename must end with :file:`.py`, and - just the (corresponding :file:`\*.py[co]`) file is added at the top level + just the (corresponding :file:`\*.pyc`) file is added at the top level (no path information). If *pathname* is a file that does not end with :file:`.py`, a :exc:`RuntimeError` will be raised. If it is a directory, and the directory is not a package directory, then all the files - :file:`\*.py[co]` are added at the top level. If the directory is a - package directory, then all :file:`\*.py[co]` are added under the package + :file:`\*.pyc` are added at the top level. If the directory is a + package directory, then all :file:`\*.pyc` are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 46b8c245f7b3fe..eaae2bb04b7482 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -9,7 +9,7 @@ -------------- This module adds the ability to import Python modules (:file:`\*.py`, -:file:`\*.py[co]`) and packages from ZIP-format archives. It is usually not +:file:`\*.pyc`) and packages from ZIP-format archives. It is usually not needed to use the :mod:`zipimport` module explicitly; it is automatically used by the built-in :keyword:`import` mechanism for :data:`sys.path` items that are paths to ZIP archives. diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 611779618e71d6..906d31f3859245 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -518,8 +518,8 @@ conflict. .. envvar:: PYTHONDONTWRITEBYTECODE - If this is set to a non-empty string, Python won't try to write ``.pyc`` or - ``.pyo`` files on the import of source modules. This is equivalent to + If this is set to a non-empty string, Python won't try to write ``.pyc`` + files on the import of source modules. This is equivalent to specifying the :option:`-B` option. diff --git a/Modules/main.c b/Modules/main.c index 75ee2f607ca83d..d36db6d8b511af 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -50,7 +50,7 @@ static char *usage_1 = "\ Options and arguments (and corresponding environment variables):\n\ -b : issue warnings about str(bytes_instance), str(bytearray_instance)\n\ and comparing bytes/bytearray with str. (-bb: issue errors)\n\ --B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\ +-B : don't write .pyc files on import; also PYTHONDONTWRITEBYTECODE=x\n\ -c cmd : program passed in as string (terminates option list)\n\ -d : debug output from parser; also PYTHONDEBUG=x\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ diff --git a/Modules/zipimport.c b/Modules/zipimport.c index a693fbbf6e280e..feef98f582b580 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -1104,7 +1104,7 @@ get_decompress_func(void) _Py_IDENTIFIER(decompress); if (importing_zlib != 0) - /* Someone has a zlib.py[co] in their Zip file; + /* Someone has a zlib.pyc in their Zip file; let's avoid a stack overflow. */ return NULL; importing_zlib = 1; @@ -1264,11 +1264,11 @@ eq_mtime(time_t t1, time_t t2) } /* Issue #29537: handle issue27286 bytecode incompatibility - * See Lib/importlib/_bootstrap_external.py for general discussion + * See Lib/importlib/_bootstrap_external.py for general discussion */ extern PY_UINT32_T _Py_BACKCOMPAT_MAGIC_NUMBER; -/* Given the contents of a .py[co] file in a buffer, unmarshal the data +/* Given the contents of a .pyc file in a buffer, unmarshal the data and return the code object. Return None if it the magic word doesn't match (we do this instead of raising an exception as we fall back to .py if available and we don't want to mask other errors). @@ -1414,7 +1414,7 @@ get_mtime_of_source(ZipImporter *self, PyObject *path) PyObject *toc_entry, *stripped; time_t mtime; - /* strip 'c' or 'o' from *.py[co] */ + /* strip 'c' from *.pyc */ if (PyUnicode_READY(path) == -1) return (time_t)-1; stripped = PyUnicode_FromKindAndData(PyUnicode_KIND(path), diff --git a/PC/getpathp.c b/PC/getpathp.c index c7ddf1ea6b33eb..47a571e272b00d 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -133,7 +133,7 @@ exists(wchar_t *filename) may extend 'filename' by one character. */ static int -ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc/.pyo too */ +ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc too */ { int n; @@ -144,7 +144,7 @@ ismodule(wchar_t *filename, int update_filename) /* Is module -- check for .pyc/ n = wcsnlen_s(filename, MAXPATHLEN+1); if (n < MAXPATHLEN) { int exist = 0; - filename[n] = Py_OptimizeFlag ? L'o' : L'c'; + filename[n] = L'c'; filename[n + 1] = L'\0'; exist = exists(filename); if (!update_filename) diff --git a/PCbuild/rmpyc.py b/PCbuild/rmpyc.py index a1e75bb7ae5b4b..0b58f687729f7e 100644 --- a/PCbuild/rmpyc.py +++ b/PCbuild/rmpyc.py @@ -1,25 +1,19 @@ -# Remove all the .pyc and .pyo files under ../Lib. +# Remove all the .pyc files under ../Lib. def deltree(root): import os from os.path import join - npyc = npyo = 0 + npyc = 0 for root, dirs, files in os.walk(root): for name in files: - delete = False - if name.endswith('.pyc'): - delete = True + # to be thorough + if name.endswith(('.pyc', '.pyo')): npyc += 1 - elif name.endswith('.pyo'): - delete = True - npyo += 1 - - if delete: os.remove(join(root, name)) - return npyc, npyo + return npyc -npyc, npyo = deltree("../Lib") -print(npyc, ".pyc deleted,", npyo, ".pyo deleted") +npyc = deltree("../Lib") +print(npyc, ".pyc deleted") diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 2d93b80a499fa5..20568549b1599d 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -4,8 +4,8 @@ rem Usage: rt [-d] [-O] [-q] [-x64] regrtest_args rem -d Run Debug build (python_d.exe). Else release build. rem -O Run python.exe or python_d.exe (see -d) with -O. rem -q "quick" -- normally the tests are run twice, the first time -rem after deleting all the .py[co] files reachable from Lib/. -rem -q runs the tests just once, and without deleting .py[co] files. +rem after deleting all the .pyc files reachable from Lib/. +rem -q runs the tests just once, and without deleting .pyc files. rem -x64 Run the 64-bit build of python (or python_d if -d was specified) rem from the 'amd64' dir instead of the 32-bit build in this dir. rem All leading instances of these switches are shifted off, and @@ -45,14 +45,14 @@ set exe=%prefix%python%suffix%.exe set cmd="%exe%" %dashO% -Wd -E -bb "%pcbuild%..\lib\test\regrtest.py" %regrtestargs% if defined qmode goto Qmode -echo Deleting .pyc/.pyo files ... +echo Deleting .pyc files ... "%exe%" "%pcbuild%rmpyc.py" echo on %cmd% @echo off -echo About to run again without deleting .pyc/.pyo first: +echo About to run again without deleting .pyc first: pause :Qmode diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ce52990496931c..87dadc164c2645 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -85,7 +85,7 @@ int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ int Py_FrozenFlag; /* Needed by getpath.c */ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ -int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */ +int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.pyc) */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ From 5f63884b724f416c62a81cf5b2ab6d761f50d365 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 11 Mar 2017 10:19:37 -0800 Subject: [PATCH 072/220] tempfile.rst: Fix some typos (GH-610) (GH-619) (cherry picked from commit d3b8f98696b905367da3975f73b482bac380b51c) --- Doc/library/tempfile.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index 665261ffb21f94..c59aca1e189086 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -245,12 +245,12 @@ The module uses a global variable to store the name of the directory used for temporary files returned by :func:`gettempdir`. It can be set directly to override the selection process, but this is discouraged. All functions in this module take a *dir* argument which can be used -to specify the directory and this is the recommend approach. +to specify the directory and this is the recommended approach. .. data:: tempdir When set to a value other than ``None``, this variable defines the - default value for the *dir* argument to all the functions defined in this + default value for the *dir* argument to the functions defined in this module. If ``tempdir`` is unset or ``None`` at any call to any of the above From a951c554ce4adcaa3af85b8e5fb56df9c46e9287 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sat, 11 Mar 2017 15:47:13 -0600 Subject: [PATCH 073/220] Only trigger AppVeyor on code or config changes (GH-611 backport) (GH-621) --- .github/appveyor.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/appveyor.yml b/.github/appveyor.yml index e44b5b09e6ea17..60c2dae444761e 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -4,3 +4,20 @@ build_script: - cmd: PCbuild\build.bat -e test_script: - cmd: PCbuild\rt.bat -q -uall -rwW --timeout=1200 -j0 + +# Only trigger AppVeyor if actual code or its configuration changes +only_commits: + files: + - .github/appveyor.yml + - .gitattributes + - Grammar/ + - Include/ + - Lib/ + - Modules/ + - Objects/ + - PC/ + - PCBuild/ + - Parser/ + - Programs/ + - Python/ + - Tools/ From be31a837304f81842b13dbabdaaa14bb9bbe64af Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 16:18:14 +1000 Subject: [PATCH 074/220] bpo-29656: Handle PR branches in 'make patchcheck' (#302) (#627) (cherry picked from commit 482f7a274fa52b7ba34ff308cd9acdcac9f41ba5) --- Tools/scripts/patchcheck.py | 58 +++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index 58b081a9c53ff5..7a04aafa82a8a1 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -12,7 +12,6 @@ SRCDIR = sysconfig.get_config_var('srcdir') - def n_files_str(count): """Return 'N file(s)' with the proper plurality on 'file'.""" return "{} file{}".format(count, "s" if count != 1 else "") @@ -46,27 +45,73 @@ def mq_patches_applied(): return st.returncode == 0 and bstdout +def get_git_branch(): + """Get the symbolic name for the current git branch""" + cmd = "git rev-parse --abbrev-ref HEAD".split() + try: + return subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessError: + return None + + +def get_git_upstream_remote(): + """Get the remote name to use for upstream branches + + Uses "upstream" if it exists, "origin" otherwise + """ + cmd = "git remote get-url upstream".split() + try: + subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except subprocess.CalledProcessError: + return "origin" + return "upstream" + + +@status("Getting base branch for PR", + info=lambda x: x if x is not None else "not a PR branch") +def get_base_branch(): + if not os.path.isdir(os.path.join(SRCDIR, '.git')): + # Not a git checkout, so there's no base branch + return None + version = sys.version_info + if version.releaselevel == 'alpha': + base_branch = "master" + else: + base_branch = "{0.major}.{0.minor}".format(version) + this_branch = get_git_branch() + if this_branch is None or this_branch == base_branch: + # Not on a git PR branch, so there's no base branch + return None + upstream_remote = get_git_upstream_remote() + return upstream_remote + "/" + base_branch + + @status("Getting the list of files that have been added/changed", info=lambda x: n_files_str(len(x))) -def changed_files(): +def changed_files(base_branch=None): """Get the list of changed or added files from Mercurial or git.""" if os.path.isdir(os.path.join(SRCDIR, '.hg')): + if base_branch is not None: + sys.exit('need a git checkout to check PR status') cmd = 'hg status --added --modified --no-status' if mq_patches_applied(): cmd += ' --rev qparent' with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: return [x.decode().rstrip() for x in st.stdout] elif os.path.isdir(os.path.join(SRCDIR, '.git')): - cmd = 'git status --porcelain' + if base_branch: + cmd = 'git diff --name-status ' + base_branch + else: + cmd = 'git status --porcelain' filenames = [] with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: for line in st.stdout: line = line.decode().rstrip() - status = set(line[:2]) + status_text, filename = line.split(maxsplit=1) + status = set(status_text) # modified, added or unmerged files if not status.intersection('MAU'): continue - filename = line[3:] if ' -> ' in filename: # file is renamed filename = filename.split(' -> ', 2)[1].strip() @@ -165,7 +210,8 @@ def regenerated_pyconfig_h_in(file_paths): return "not needed" def main(): - file_paths = changed_files() + base_branch = get_base_branch() + file_paths = changed_files(base_branch) python_files = [fn for fn in file_paths if fn.endswith('.py')] c_files = [fn for fn in file_paths if fn.endswith(('.c', '.h'))] doc_files = [fn for fn in file_paths if fn.startswith('Doc') and From f12f820ef887b009ce70e67e71b8690f30c605ee Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 12 Mar 2017 10:05:27 +0200 Subject: [PATCH 075/220] bpo-29746: Update marshal docs to Python 3. (#547) (#630) (cherry picked from commit c611a5b1d4fab0123bf622f06c3bfa510221dc32) --- Doc/c-api/marshal.rst | 8 ++++---- Doc/glossary.rst | 7 +++++++ Doc/library/marshal.rst | 19 ++++++++----------- Python/marshal.c | 26 ++++++++++++-------------- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst index a6d0f4688d1b78..c6d1d02a2fa510 100644 --- a/Doc/c-api/marshal.rst +++ b/Doc/c-api/marshal.rst @@ -34,7 +34,7 @@ unmarshalling. Version 2 uses a binary format for floating point numbers. .. c:function:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version) - Return a string object containing the marshalled representation of *value*. + Return a bytes object containing the marshalled representation of *value*. *version* indicates the file format. @@ -88,10 +88,10 @@ written using these routines? :exc:`TypeError`) and returns *NULL*. -.. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *string, Py_ssize_t len) +.. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *data, Py_ssize_t len) - Return a Python object from the data stream in a character buffer - containing *len* bytes pointed to by *string*. + Return a Python object from the data stream in a byte buffer + containing *len* bytes pointed to by *data*. On error, sets the appropriate exception (:exc:`EOFError` or :exc:`TypeError`) and returns *NULL*. diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 4a8bb8e633b3aa..07b26a64b89c13 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -103,6 +103,10 @@ Glossary binary file A :term:`file object` able to read and write :term:`bytes-like objects `. + Examples of binary files are files opened in binary mode (``'rb'``, + ``'wb'`` or ``'rb+'``), :data:`sys.stdin.buffer`, + :data:`sys.stdout.buffer`, and instances of :class:`io.BytesIO` and + :class:`gzip.GzipFile`. .. seealso:: A :term:`text file` reads and writes :class:`str` objects. @@ -926,6 +930,9 @@ Glossary A :term:`file object` able to read and write :class:`str` objects. Often, a text file actually accesses a byte-oriented datastream and handles the :term:`text encoding` automatically. + Examples of text files are files opened in text mode (``'r'`` or ``'w'``), + :data:`sys.stdin`, :data:`sys.stdout`, and instances of + :class:`io.StringIO`. .. seealso:: A :term:`binary file` reads and write :class:`bytes` objects. diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst index 1ffc6effc7142d..d65afc20041133 100644 --- a/Doc/library/marshal.rst +++ b/Doc/library/marshal.rst @@ -49,7 +49,7 @@ For format *version* lower than 3, recursive lists, sets and dictionaries cannot be written (see below). There are functions that read/write files as well as functions operating on -strings. +bytes-like objects. The module defines these functions: @@ -57,9 +57,7 @@ The module defines these functions: .. function:: dump(value, file[, version]) Write the value on the open file. The value must be a supported type. The - file must be an open file object such as ``sys.stdout`` or returned by - :func:`open` or :func:`os.popen`. It must be opened in binary mode (``'wb'`` - or ``'w+b'``). + file must be a writeable :term:`binary file`. If the value has (or contains an object that has) an unsupported type, a :exc:`ValueError` exception is raised --- but garbage data will also be written @@ -74,8 +72,7 @@ The module defines these functions: Read one value from the open file and return it. If no valid value is read (e.g. because the data has a different Python version's incompatible marshal format), raise :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. The - file must be an open file object opened in binary mode (``'rb'`` or - ``'r+b'``). + file must be a readable :term:`binary file`. .. note:: @@ -85,7 +82,7 @@ The module defines these functions: .. function:: dumps(value[, version]) - Return the string that would be written to a file by ``dump(value, file)``. The + Return the bytes object that would be written to a file by ``dump(value, file)``. The value must be a supported type. Raise a :exc:`ValueError` exception if value has (or contains an object that has) an unsupported type. @@ -93,11 +90,11 @@ The module defines these functions: (see below). -.. function:: loads(string) +.. function:: loads(bytes) - Convert the string to a value. If no valid value is found, raise - :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. Extra characters in the - string are ignored. + Convert the :term:`bytes-like object` to a value. If no valid value is found, raise + :exc:`EOFError`, :exc:`ValueError` or :exc:`TypeError`. Extra bytes in the + input are ignored. In addition, the following constants are defined: diff --git a/Python/marshal.c b/Python/marshal.c index 5b8de991921784..67e32c89734c48 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -549,7 +549,7 @@ w_complex_object(PyObject *v, char flag, WFILE *p) w_object(co->co_lnotab, p); } else if (PyObject_CheckBuffer(v)) { - /* Write unknown bytes-like objects as a byte string */ + /* Write unknown bytes-like objects as a bytes object */ Py_buffer view; if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) { w_byte(TYPE_UNKNOWN, p); @@ -1079,7 +1079,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (bytes object size out of range)"); break; } v = PyBytes_FromStringAndSize((char *)NULL, n); @@ -1103,7 +1103,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); break; } goto _read_ascii; @@ -1143,7 +1143,7 @@ r_object(RFILE *p) if (PyErr_Occurred()) break; if (n < 0 || n > SIZE32_MAX) { - PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); + PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); break; } if (n != 0) { @@ -1594,7 +1594,7 @@ PyMarshal_WriteObjectToString(PyObject *x, int version) if (wf.ptr - base > PY_SSIZE_T_MAX) { Py_DECREF(wf.str); PyErr_SetString(PyExc_OverflowError, - "too much marshal data for a string"); + "too much marshal data for a bytes object"); return NULL; } if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) @@ -1640,8 +1640,7 @@ PyDoc_STRVAR(dump_doc, "dump(value, file[, version])\n\ \n\ Write the value on the open file. The value must be a supported type.\n\ -The file must be an open file object such as sys.stdout or returned by\n\ -open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\ +The file must be a writeable binary file.\n\ \n\ If the value has (or contains an object that has) an unsupported type, a\n\ ValueError exception is raised - but garbage data will also be written\n\ @@ -1697,8 +1696,7 @@ PyDoc_STRVAR(load_doc, Read one value from the open file and return it. If no valid value is\n\ read (e.g. because the data has a different Python version's\n\ incompatible marshal format), raise EOFError, ValueError or TypeError.\n\ -The file must be an open file object opened in binary mode ('rb' or\n\ -'r+b').\n\ +The file must be a readable binary file.\n\ \n\ Note: If an object containing an unsupported type was marshalled with\n\ dump(), load() will substitute None for the unmarshallable type."); @@ -1717,7 +1715,7 @@ marshal_dumps(PyObject *self, PyObject *args) PyDoc_STRVAR(dumps_doc, "dumps(value[, version])\n\ \n\ -Return the string that would be written to a file by dump(value, file).\n\ +Return the bytes object that would be written to a file by dump(value, file).\n\ The value must be a supported type. Raise a ValueError exception if\n\ value has (or contains an object that has) an unsupported type.\n\ \n\ @@ -1753,8 +1751,8 @@ marshal_loads(PyObject *self, PyObject *args) PyDoc_STRVAR(loads_doc, "loads(bytes)\n\ \n\ -Convert the bytes object to a value. If no valid value is found, raise\n\ -EOFError, ValueError or TypeError. Extra characters in the input are\n\ +Convert the bytes-like object to a value. If no valid value is found,\n\ +raise EOFError, ValueError or TypeError. Extra bytes in the input are\n\ ignored."); static PyMethodDef marshal_methods[] = { @@ -1792,8 +1790,8 @@ Functions:\n\ \n\ dump() -- write value to a file\n\ load() -- read value from a file\n\ -dumps() -- write value to a string\n\ -loads() -- read value from a string"); +dumps() -- marshal value as a bytes object\n\ +loads() -- read value from a bytes-like object"); From a6aac8c87036c3180916b893d66b1e257b5e2ec2 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 12 Mar 2017 20:03:35 +1000 Subject: [PATCH 076/220] bpo-29798: Handle git worktree in `make patchcheck` (#629) (#634) In git worktree directories, `.git` is a configuration file rather than a subdirectory (cherry picked from commit 6a6d090612dd7deaac2bc0399fad743e5e2db606) --- Tools/scripts/patchcheck.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index 7a04aafa82a8a1..f4ec7d8a30ea23 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -98,7 +98,10 @@ def changed_files(base_branch=None): cmd += ' --rev qparent' with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: return [x.decode().rstrip() for x in st.stdout] - elif os.path.isdir(os.path.join(SRCDIR, '.git')): + elif os.path.exists(os.path.join(SRCDIR, '.git')): + # We just use an existence check here as: + # directory = normal git checkout/clone + # file = git worktree directory if base_branch: cmd = 'git diff --name-status ' + base_branch else: From a16894ebf8823f0e09036aacde9288c00e8d9058 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 12 Mar 2017 21:52:57 +0200 Subject: [PATCH 077/220] [3.5] bpo-8256: Fixed possible failing or crashing input() (#642) if attributes "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not strings. (cherry picked from commit c2cf12857187aa147c268651f10acd6da2c9cb74) --- Misc/NEWS | 3 +++ Python/bltinmodule.c | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index df0975a4d5ea22..98b47bdab4a8f1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -41,6 +41,9 @@ Extension Modules Library ------- +- bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" + or "errors" of sys.stdin or sys.stdout are not set or are not strings. + - bpo-28298: Fix a bug that prevented array 'Q', 'L' and 'I' from accepting big intables (objects that have __int__) as elements. Patch by Oren Milman. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 33d2cc2dc8e2cf..17c074a1b3b26b 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1892,12 +1892,15 @@ builtin_input_impl(PyObject *module, PyObject *prompt) PyObject *result; size_t len; + /* stdin is a text stream, so it must have an encoding. */ stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); stdin_errors = _PyObject_GetAttrId(fin, &PyId_errors); - if (!stdin_encoding || !stdin_errors) - /* stdin is a text stream, so it must have an - encoding. */ + if (!stdin_encoding || !stdin_errors || + !PyUnicode_Check(stdin_encoding) || + !PyUnicode_Check(stdin_errors)) { + tty = 0; goto _readline_errors; + } stdin_encoding_str = _PyUnicode_AsString(stdin_encoding); stdin_errors_str = _PyUnicode_AsString(stdin_errors); if (!stdin_encoding_str || !stdin_errors_str) @@ -1913,8 +1916,12 @@ builtin_input_impl(PyObject *module, PyObject *prompt) PyObject *stringpo; stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding); stdout_errors = _PyObject_GetAttrId(fout, &PyId_errors); - if (!stdout_encoding || !stdout_errors) + if (!stdout_encoding || !stdout_errors || + !PyUnicode_Check(stdout_encoding) || + !PyUnicode_Check(stdout_errors)) { + tty = 0; goto _readline_errors; + } stdout_encoding_str = _PyUnicode_AsString(stdout_encoding); stdout_errors_str = _PyUnicode_AsString(stdout_errors); if (!stdout_encoding_str || !stdout_errors_str) @@ -1969,13 +1976,17 @@ builtin_input_impl(PyObject *module, PyObject *prompt) Py_XDECREF(po); PyMem_FREE(s); return result; + _readline_errors: Py_XDECREF(stdin_encoding); Py_XDECREF(stdout_encoding); Py_XDECREF(stdin_errors); Py_XDECREF(stdout_errors); Py_XDECREF(po); - return NULL; + if (tty) + return NULL; + + PyErr_Clear(); } /* Fallback if we're not interactive */ From 216803d8e10615c769571fbfbd1f341557f25a14 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 12 Mar 2017 17:03:46 -0400 Subject: [PATCH 078/220] Fix wrapping into StopIteration of return values in generators and coroutines (#644) (#648) --- Lib/test/test_coroutines.py | 15 +++++++++++++++ Misc/NEWS | 2 ++ Objects/genobject.c | 3 +-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 4a327b5ba9f168..6d63cdb5f0fcc9 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -975,6 +975,21 @@ async def waiter(coro): "coroutine is being awaited already"): waiter(coro).send(None) + def test_await_16(self): + # See https://bugs.python.org/issue29600 for details. + + async def f(): + return ValueError() + + async def g(): + try: + raise KeyError + except: + return await f() + + _, result = run_async(g()) + self.assertIsNone(result.__context__) + def test_with_1(self): class Manager: def __init__(self, name): diff --git a/Misc/NEWS b/Misc/NEWS index 98b47bdab4a8f1..e56c0914b1b8d2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-29600: Fix wrapping coroutine return values in StopIteration. + - Issue #29537: Restore runtime compatibility with bytecode files generated by CPython 3.5.0 to 3.5.2, and adjust the eval loop to avoid the problems that could be caused by the malformed variant of the BUILD_MAP_UNPACK_WITH_CALL diff --git a/Objects/genobject.c b/Objects/genobject.c index d403598181abd4..0de540898d5e15 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -466,8 +466,7 @@ _PyGen_SetStopIterationValue(PyObject *value) PyObject *e; if (value == NULL || - (!PyTuple_Check(value) && - !PyObject_TypeCheck(value, (PyTypeObject *) PyExc_StopIteration))) + (!PyTuple_Check(value) && !PyExceptionInstance_Check(value))) { /* Delay exception instantiation if we can */ PyErr_SetObject(PyExc_StopIteration, value); From db522dc86294a99f46a63cd5b54c7c4ab8017c96 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Sun, 12 Mar 2017 17:06:04 -0400 Subject: [PATCH 079/220] bpo-29742: asyncio get_extra_info() throws exception (#525) (#646) --- Lib/asyncio/sslproto.py | 4 +++- Lib/test/test_asyncio/test_sslproto.py | 12 ++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py index c2c4b95fcbc803..aa5e03423766c4 100644 --- a/Lib/asyncio/sslproto.py +++ b/Lib/asyncio/sslproto.py @@ -542,8 +542,10 @@ def eof_received(self): def _get_extra_info(self, name, default=None): if name in self._extra: return self._extra[name] - else: + elif self._transport is not None: return self._transport.get_extra_info(name, default) + else: + return default def _start_shutdown(self): if self._in_shutdown: diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py index 59ff0f6967e5b5..f1771c5561afea 100644 --- a/Lib/test/test_asyncio/test_sslproto.py +++ b/Lib/test/test_asyncio/test_sslproto.py @@ -95,5 +95,17 @@ def test_connection_lost(self): test_utils.run_briefly(self.loop) self.assertIsInstance(waiter.exception(), ConnectionAbortedError) + def test_get_extra_info_on_closed_connection(self): + waiter = asyncio.Future(loop=self.loop) + ssl_proto = self.ssl_protocol(waiter) + self.assertIsNone(ssl_proto._get_extra_info('socket')) + default = object() + self.assertIs(ssl_proto._get_extra_info('socket', default), default) + self.connection_made(ssl_proto) + self.assertIsNotNone(ssl_proto._get_extra_info('socket')) + ssl_proto.connection_lost(None) + self.assertIsNone(ssl_proto._get_extra_info('socket')) + + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index e56c0914b1b8d2..f12b5e665512ff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Extension Modules Library ------- +- bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. + Patch by Nikolay Kim. + - bpo-8256: Fixed possible failing or crashing input() if attributes "encoding" or "errors" of sys.stdin or sys.stdout are not set or are not strings. From 3a8098f679a7ad6fd890aaabf145b2ffdb376a2a Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 13 Mar 2017 10:36:54 +0800 Subject: [PATCH 080/220] fix the name of argument to ftplib.FTP.set_pasv and fix wording (GH-653) (GH-655) --- Doc/library/ftplib.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 1e35f37f448bcd..a0cbe93e3a75c4 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -248,9 +248,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. prints the line to ``sys.stdout``. -.. method:: FTP.set_pasv(boolean) +.. method:: FTP.set_pasv(val) - Enable "passive" mode if *boolean* is true, other disable passive mode. + Enable "passive" mode if *val* is true, otherwise disable passive mode. Passive mode is on by default. From 59883bb25263318b25a817cc6e5af2b1a1246443 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 13 Mar 2017 11:06:58 +0800 Subject: [PATCH 081/220] ftplib.FTP.retrbinary callback gets a bytes, not a str (GH-652) (GH-658) --- Doc/library/ftplib.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index a0cbe93e3a75c4..f0e19bde452861 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -228,7 +228,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. Retrieve a file in binary transfer mode. *cmd* should be an appropriate ``RETR`` command: ``'RETR filename'``. The *callback* function is called for - each block of data received, with a single string argument giving the data + each block of data received, with a single bytes argument giving the data block. The optional *blocksize* argument specifies the maximum chunk size to read on the low-level socket object created to do the actual transfer (which will also be the largest size of the data blocks passed to *callback*). A From 0641ada9b78b6a06f539d4bde42c1ad1b90579a7 Mon Sep 17 00:00:00 2001 From: Michael Seifert Date: Wed, 15 Mar 2017 08:42:30 +0100 Subject: [PATCH 082/220] bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords are not strings (#649) (#672) --- Lib/test/test_functools.py | 26 ++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_functoolsmodule.c | 5 ++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index a82ca7ab88c38f..04ffab9a82dfc2 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -387,6 +387,32 @@ def __getitem__(self, key): self.assertRaises(TypeError, f.__setstate__, BadSequence()) + def test_manually_adding_non_string_keyword(self): + p = self.partial(capture) + # Adding a non-string/unicode keyword to partial kwargs + p.keywords[1234] = 'value' + r = repr(p) + self.assertIn('1234', r) + self.assertIn("'value'", r) + with self.assertRaises(TypeError): + p() + + def test_keystr_replaces_value(self): + p = self.partial(capture) + + class MutatesYourDict(object): + def __str__(self): + p.keywords[self] = ['sth2'] + return 'astr' + + # Raplacing the value during key formatting should keep the original + # value alive (at least long enough). + p.keywords[MutatesYourDict()] = ['sth'] + r = repr(p) + self.assertIn('astr', r) + self.assertIn("['sth']", r) + + class TestPartialPy(TestPartial, unittest.TestCase): partial = staticmethod(py_functools.partial) diff --git a/Misc/ACKS b/Misc/ACKS index d33ee913f49c41..8a952a45f5dcd4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1348,6 +1348,7 @@ Federico Schwindt Barry Scott Steven Scott Nick Seidenman +Michael Seifert Žiga Seilnacht Yury Selivanov Fred Sells diff --git a/Misc/NEWS b/Misc/NEWS index f12b5e665512ff..40d87e291d0f6e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Extension Modules Library ------- +- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords + are not strings. Patch by Michael Seifert. + - bpo-29742: get_extra_info() raises exception if get called on closed ssl transport. Patch by Nikolay Kim. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 0471d665e65a58..985bcb6985e835 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -234,8 +234,11 @@ partial_repr(partialobject *pto) /* Pack keyword arguments */ assert (PyDict_Check(pto->kw)); for (i = 0; PyDict_Next(pto->kw, &i, &key, &value);) { - Py_SETREF(arglist, PyUnicode_FromFormat("%U, %U=%R", arglist, + /* Prevent key.__str__ from deleting the value. */ + Py_INCREF(value); + Py_SETREF(arglist, PyUnicode_FromFormat("%U, %S=%R", arglist, key, value)); + Py_DECREF(value); if (arglist == NULL) goto done; } From 9a29d7577a6da0ab0f4411567204f1a93a2452b6 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 15 Mar 2017 14:13:09 +0300 Subject: [PATCH 083/220] Change assertRaises to assertRaisesRegex in test_xmlrpc (#481) (#675) (cherry picked from commit c6b448b36d22769c684bb3276f85c1b47d15ab63) --- Lib/test/test_xmlrpc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 7e023c16733196..c2de057ecbfaa4 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -364,7 +364,7 @@ def test_registered_func_is_none(self): dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() dispatcher.register_function(None, name='method') - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) def test_instance_has_no_func(self): @@ -372,14 +372,14 @@ def test_instance_has_no_func(self): dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() dispatcher.register_instance(object()) - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) def test_cannot_locate_func(self): """Calls a function that the dispatcher cannot locate""" dispatcher = xmlrpc.server.SimpleXMLRPCDispatcher() - with self.assertRaises(Exception, expected_regex='method'): + with self.assertRaisesRegex(Exception, 'method'): dispatcher._dispatch('method', ('param',)) From 00cbb8a0fa49b23ba15001d5a754717d07f824f9 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 16 Mar 2017 10:45:41 -0700 Subject: [PATCH 084/220] Takes vcruntime140.dll from the correct source. (#683) --- Tools/msi/make_zip.proj | 9 +++------ Tools/nuget/make_pkg.proj | 8 +++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Tools/msi/make_zip.proj b/Tools/msi/make_zip.proj index 1af6dd2868a1b9..1ff5fc549abb2e 100644 --- a/Tools/msi/make_zip.proj +++ b/Tools/msi/make_zip.proj @@ -17,15 +17,12 @@ rmdir /q/s "$(IntermediateOutputPath)\zip_$(ArchName)" "$(PythonExe)" "$(MSBuildThisFileDirectory)\make_zip.py" $(Arguments) -e -o "$(TargetPath)" -t "$(IntermediateOutputPath)\zip_$(ArchName)" -b "$(BuildPath.TrimEnd('\'))" - set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) - + diff --git a/Tools/nuget/make_pkg.proj b/Tools/nuget/make_pkg.proj index 81b84f98846b78..21acc2aa2e3c6e 100644 --- a/Tools/nuget/make_pkg.proj +++ b/Tools/nuget/make_pkg.proj @@ -34,9 +34,8 @@ $(NugetArguments) -Version "$(NuspecVersion)" $(NugetArguments) -NoPackageAnalysis -NonInteractive - setlocal -set DOC_FILENAME=python$(PythonVersion).chm -set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT + set DOC_FILENAME=python$(PythonVersion).chm + $(Environment)%0D%0Aset VCREDIST_PATH=$(CRTRedist)\$(Platform) @@ -45,8 +44,7 @@ set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140. - + From 091d90f9a429b81b046cb83582062941f8ded9da Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 16 Mar 2017 19:57:12 -0700 Subject: [PATCH 085/220] bpo-29820: othergui.rst: Remove outdated information (GH-685) (GH-689) (cherry picked from commit 1bb0f3762ec5104014aeed0ae6e9d64598d8fcac) --- Doc/library/othergui.rst | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst index ee1ce50b6bd5e1..d40abe167653b7 100644 --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -9,14 +9,15 @@ available for Python: .. seealso:: `PyGObject `_ - provides introspection bindings for C libraries using + PyGObject provides introspection bindings for C libraries using `GObject `_. One of these libraries is the `GTK+ 3 `_ widget set. GTK+ comes with many more widgets than Tkinter provides. An online `Python GTK+ 3 Tutorial `_ is available. - `PyGTK `_ provides bindings for an older version + `PyGTK `_ + PyGTK provides bindings for an older version of the library, GTK+ 2. It provides an object oriented interface that is slightly higher level than the C one. There are also bindings to `GNOME `_. An online `tutorial @@ -27,15 +28,10 @@ available for Python: extensive C++ GUI application development framework that is available for Unix, Windows and Mac OS X. :program:`sip` is a tool for generating bindings for C++ libraries as Python classes, and - is specifically designed for Python. The *PyQt3* bindings have a - book, `GUI Programming with Python: QT Edition - `_ by Boudewijn - Rempt. The *PyQt4* bindings also have a book, `Rapid GUI Programming - with Python and Qt `_, by Mark - Summerfield. + is specifically designed for Python. `PySide `_ - is a newer binding to the Qt toolkit, provided by Nokia. + PySide is a newer binding to the Qt toolkit, provided by Nokia. Compared to PyQt, its licensing scheme is friendlier to non-open source applications. @@ -49,9 +45,7 @@ available for Python: documentation and context sensitive help, printing, HTML viewing, low-level device context drawing, drag and drop, system clipboard access, an XML-based resource format and more, including an ever growing library - of user-contributed modules. wxPython has a book, `wxPython in Action - `_, by Noel Rappin and - Robin Dunn. + of user-contributed modules. PyGTK, PyQt, and wxPython, all have a modern look and feel and more widgets than Tkinter. In addition, there are many other GUI toolkits for From 41b4a2189f29daae008e57f799a30890643d191f Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Fri, 17 Mar 2017 14:37:51 +0300 Subject: [PATCH 086/220] bpo-16355: Clarify when inspect.getcomments() returns None (#428) (#691) Initial patch by Vajrasky Kok. (cherry picked from commit 3f2155ffe683080f2a1b28408fa48d43ba92f943) --- Doc/library/inspect.rst | 4 +++- Lib/test/test_inspect.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 89263e7bec1795..9526a0d59dabb5 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -440,7 +440,9 @@ Retrieving source code Return in a single string any lines of comments immediately preceding the object's source code (for a class, function, or method), or at the top of the - Python source file (if the object is a module). + Python source file (if the object is a module). If the object's source code + is unavailable, return ``None``. This could happen if the object has been + defined in C or the interactive shell. .. function:: getfile(object) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index d33de9e5bc3f78..2283000c860246 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -376,6 +376,11 @@ def test_cleandoc(self): def test_getcomments(self): self.assertEqual(inspect.getcomments(mod), '# line 1\n') self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n') + # If the object source file is not available, return None. + co = compile('x=1', '_non_existing_filename.py', 'exec') + self.assertIsNone(inspect.getcomments(co)) + # If the object has been defined in C, return None. + self.assertIsNone(inspect.getcomments(list)) def test_getmodule(self): # Check actual module From e59af55c28b657cdf57c71a7b0837c9e9f4b2a31 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 17 Mar 2017 19:54:50 +0000 Subject: [PATCH 087/220] bpo-29808: Do not fail in SysLogHandler constructor if syslog isn't available. (#695) bpo-29808: SysLogHandler: Do not fail if initial connect to syslog failed. (cherry picked from commit 1b038e073807ecb6fd176edaf3386a8e3205416e) --- Lib/logging/handlers.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py index c39a56ff066d22..e3463312f94065 100644 --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -803,7 +803,14 @@ def __init__(self, address=('localhost', SYSLOG_UDP_PORT), if isinstance(address, str): self.unixsocket = True - self._connect_unixsocket(address) + # Syslog server may be unavailable during handler initialisation. + # C's openlog() function also ignores connection errors. + # Moreover, we ignore these errors while logging, so it not worse + # to ignore it also here. + try: + self._connect_unixsocket(address) + except OSError: + pass else: self.unixsocket = False if socktype is None: From 825153bf8fd3b8ee80cf580d24b1a1b64bd8f4d1 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 17 Mar 2017 15:41:48 -0700 Subject: [PATCH 088/220] Combine the C++ header CI build into the main C build (GH-697) (GH-705) This will eliminate one of the builds in Travis, allowing for CI overall to complete faster. (cherry picked from commit 993d4b3440f2282976901ce66879037c4443868a) --- .travis.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27b63c6c08b376..36961e38790a4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -64,15 +64,6 @@ matrix: # Make the `coverage` command available to Codecov w/ a version of Python that can parse all source files. - source ./venv/bin/activate - bash <(curl -s https://codecov.io/bash) - - os: linux - language: cpp - compiler: clang - env: - - TESTING="C++ header compatibility" - before_script: - - ./configure - script: - - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . # Travis provides only 2 cores, so don't overdue the parallelism and waste memory. before_script: @@ -88,6 +79,8 @@ before_script: script: # `-r -w` implicitly provided through `make buildbottest`. - make buildbottest TESTOPTS="-j4" + # Test for C++ header compatibility. + - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . notifications: email: false From 3091636f16cdf9ed46bffa770fb3ec7c332799cf Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sun, 19 Mar 2017 10:03:48 -0700 Subject: [PATCH 089/220] Drop C++ header compatibility test (#718) (#720) The $CXX environment variable is not exported under the 'c' language on Travis. (cherry picked from commit 77ed11552da3e01dd235b7d68988076866b1f604) --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 36961e38790a4d..66f03dc7161a7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -79,8 +79,6 @@ before_script: script: # `-r -w` implicitly provided through `make buildbottest`. - make buildbottest TESTOPTS="-j4" - # Test for C++ header compatibility. - - echo '#include "Python.h"' > test.cc && $CXX -c test.cc -o /dev/null -I ./Include -I . notifications: email: false From 88b32eb7b317dd7c7943433f980e17e34e50f8f8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 20:26:42 +0200 Subject: [PATCH 090/220] bpo-28749: Fixed the documentation of the mapping codec APIs. (#487) (#715) Added the documentation for PyUnicode_Translate(). (cherry picked from commit c85a26628ceb9624c96c3064e8b99033c026d8a3) --- Doc/c-api/unicode.rst | 95 +++++++++++++++++++++-------------------- Include/unicodeobject.h | 45 ++++++++----------- 2 files changed, 66 insertions(+), 74 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 256fef3b2774a9..54d0373881d60b 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -1388,77 +1388,78 @@ Character Map Codecs This codec is special in that it can be used to implement many different codecs (and this is in fact what was done to obtain most of the standard codecs included in the :mod:`encodings` package). The codec uses mapping to encode and -decode characters. - -Decoding mappings must map single string characters to single Unicode -characters, integers (which are then interpreted as Unicode ordinals) or ``None`` -(meaning "undefined mapping" and causing an error). - -Encoding mappings must map single Unicode characters to single string -characters, integers (which are then interpreted as Latin-1 ordinals) or ``None`` -(meaning "undefined mapping" and causing an error). - -The mapping objects provided must only support the __getitem__ mapping -interface. - -If a character lookup fails with a LookupError, the character is copied as-is -meaning that its ordinal value will be interpreted as Unicode or Latin-1 ordinal -resp. Because of this, mappings only need to contain those mappings which map -characters to different code points. +decode characters. The mapping objects provided must support the +:meth:`__getitem__` mapping interface; dictionaries and sequences work well. These are the mapping codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, \ +.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *data, Py_ssize_t size, \ PyObject *mapping, const char *errors) - Create a Unicode object by decoding *size* bytes of the encoded string *s* using - the given *mapping* object. Return *NULL* if an exception was raised by the - codec. If *mapping* is *NULL* latin-1 decoding will be done. Else it can be a - dictionary mapping byte or a unicode string, which is treated as a lookup table. - Byte values greater that the length of the string and U+FFFE "characters" are - treated as "undefined mapping". + Create a Unicode object by decoding *size* bytes of the encoded string *s* + using the given *mapping* object. Return *NULL* if an exception was raised + by the codec. + + If *mapping* is *NULL*, Latin-1 decoding will be applied. Else + *mapping* must map bytes ordinals (integers in the range from 0 to 255) + to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or ``None``. Unmapped data bytes -- ones which cause a + :exc:`LookupError`, as well as ones which get mapped to ``None``, + ``0xFFFE`` or ``'\ufffe'``, are treated as undefined mappings and cause + an error. .. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) - Encode a Unicode object using the given *mapping* object and return the result - as Python string object. Error handling is "strict". Return *NULL* if an + Encode a Unicode object using the given *mapping* object and return the + result as a bytes object. Error handling is "strict". Return *NULL* if an exception was raised by the codec. -The following codec API is special in that maps Unicode to Unicode. - + The *mapping* object must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or ``None``. Unmapped character + ordinals (ones which cause a :exc:`LookupError`) as well as mapped to + ``None`` are treated as "undefined mapping" and cause an error. -.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ - PyObject *table, const char *errors) - - Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a - character mapping *table* to it and return the resulting Unicode object. Return - *NULL* when an exception was raised by the codec. - The *mapping* table must map Unicode ordinal integers to Unicode ordinal - integers or ``None`` (causing deletion of the character). +.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) - Mapping tables need only provide the :meth:`__getitem__` interface; dictionaries - and sequences work well. Unmapped character ordinals (ones which cause a - :exc:`LookupError`) are left untouched and are copied as-is. + Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given + *mapping* object and return the result as a bytes object. Return *NULL* if + an exception was raised by the codec. .. deprecated-removed:: 3.3 4.0 Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_Translate`. or :ref:`generic codec based API - ` + :c:func:`PyUnicode_AsCharmapString` or + :c:func:`PyUnicode_AsEncodedString`. -.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ +The following codec API is special in that maps Unicode to Unicode. + +.. c:function:: PyObject* PyUnicode_Translate(PyObject *unicode, \ PyObject *mapping, const char *errors) - Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given - *mapping* object and return a Python string object. Return *NULL* if an - exception was raised by the codec. + Translate a Unicode object using the given *mapping* object and return the + resulting Unicode object. Return *NULL* if an exception was raised by the + codec. + + The *mapping* object must map Unicode ordinal integers to Unicode strings, + integers (which are then interpreted as Unicode ordinals) or ``None`` + (causing deletion of the character). Unmapped character ordinals (ones + which cause a :exc:`LookupError`) are left untouched and are copied as-is. + + +.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) + + Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a + character *mapping* table to it and return the resulting Unicode object. + Return *NULL* when an exception was raised by the codec. .. deprecated-removed:: 3.3 4.0 Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsCharmapString` or - :c:func:`PyUnicode_AsEncodedString`. + :c:func:`PyUnicode_Translate`. or :ref:`generic codec based API + ` MBCS codecs for Windows diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 9308a6aa96af90..0accc1d5c2ddad 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1570,50 +1570,41 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeASCII( This codec uses mappings to encode and decode characters. - Decoding mappings must map single string characters to single - Unicode characters, integers (which are then interpreted as Unicode - ordinals) or None (meaning "undefined mapping" and causing an - error). - - Encoding mappings must map single Unicode characters to single - string characters, integers (which are then interpreted as Latin-1 - ordinals) or None (meaning "undefined mapping" and causing an - error). - - If a character lookup fails with a LookupError, the character is - copied as-is meaning that its ordinal value will be interpreted as - Unicode or Latin-1 ordinal resp. Because of this mappings only need - to contain those mappings which map characters to different code - points. + Decoding mappings must map byte ordinals (integers in the range from 0 to + 255) to Unicode strings, integers (which are then interpreted as Unicode + ordinals) or None. Unmapped data bytes (ones which cause a LookupError) + as well as mapped to None, 0xFFFE or '\ufffe' are treated as "undefined + mapping" and cause an error. + + Encoding mappings must map Unicode ordinal integers to bytes objects, + integers in the range from 0 to 255 or None. Unmapped character + ordinals (ones which cause a LookupError) as well as mapped to + None are treated as "undefined mapping" and cause an error. */ PyAPI_FUNC(PyObject*) PyUnicode_DecodeCharmap( const char *string, /* Encoded string */ Py_ssize_t length, /* size of string */ - PyObject *mapping, /* character mapping - (char ordinal -> unicode ordinal) */ + PyObject *mapping, /* decoding mapping */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) PyUnicode_AsCharmapString( PyObject *unicode, /* Unicode object */ - PyObject *mapping /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping /* encoding mapping */ ); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject*) PyUnicode_EncodeCharmap( const Py_UNICODE *data, /* Unicode char buffer */ Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ - PyObject *mapping, /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping, /* encoding mapping */ const char *errors /* error handling */ ); PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( PyObject *unicode, /* Unicode object */ - PyObject *mapping, /* character mapping - (unicode ordinal -> char ordinal) */ + PyObject *mapping, /* encoding mapping */ const char *errors /* error handling */ ); #endif @@ -1622,8 +1613,8 @@ PyAPI_FUNC(PyObject*) _PyUnicode_EncodeCharmap( character mapping table to it and return the resulting Unicode object. - The mapping table must map Unicode ordinal integers to Unicode - ordinal integers or None (causing deletion of the character). + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). Mapping tables may be dictionaries or sequences. Unmapped character ordinals (ones which cause a LookupError) are left untouched and @@ -1915,8 +1906,8 @@ PyAPI_FUNC(PyObject*) PyUnicode_RSplit( /* Translate a string by applying a character mapping table to it and return the resulting Unicode object. - The mapping table must map Unicode ordinal integers to Unicode - ordinal integers or None (causing deletion of the character). + The mapping table must map Unicode ordinal integers to Unicode strings, + Unicode ordinal integers or None (causing deletion of the character). Mapping tables may be dictionaries or sequences. Unmapped character ordinals (ones which cause a LookupError) are left untouched and From 2c5b2c3832d4d2af7b60333a5a8f73dd51ef6245 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 21:06:44 +0200 Subject: [PATCH 091/220] bpo-29116: Fix error messages for concatenating bytes and bytearray with unsupported type. (#709) (#724) (cherry picked from commit 6b5a9ec4788770c652bac3bf5d5a0a3b710b82ae) --- Objects/bytearrayobject.c | 2 +- Objects/bytesobject.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 3fad6d80b59e5a..5132eba52bf5ac 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -254,7 +254,7 @@ PyByteArray_Concat(PyObject *a, PyObject *b) if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 || PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) { PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s", - Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name); goto done; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 673bb00b984370..8ede5f0c599671 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1272,7 +1272,7 @@ bytes_concat(PyObject *a, PyObject *b) if (PyObject_GetBuffer(a, &va, PyBUF_SIMPLE) != 0 || PyObject_GetBuffer(b, &vb, PyBUF_SIMPLE) != 0) { PyErr_Format(PyExc_TypeError, "can't concat %.100s to %.100s", - Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); + Py_TYPE(b)->tp_name, Py_TYPE(a)->tp_name); goto done; } From bb67f10179011c50805a942cb6f2701c84854888 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 19 Mar 2017 21:38:53 +0200 Subject: [PATCH 092/220] bpo-29845: Mark tests that use _testcapi as CPython-only (#711) (#726) (cherry picked from commit 24c738a9e91b8f46da6166663d8ce7ec18cec784) --- Lib/ctypes/test/test_structures.py | 5 ++++- Lib/test/test_atexit.py | 1 + Lib/test/test_coroutines.py | 1 + Lib/test/test_socket.py | 1 + Lib/test/test_tracemalloc.py | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 0b9391a4dbb5a7..2e9fc7c49cc499 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -2,8 +2,8 @@ from ctypes import * from ctypes.test import need_symbol from struct import calcsize -import _testcapi import _ctypes_test +import test.support class SubclassesTest(unittest.TestCase): def test_subclass(self): @@ -202,7 +202,10 @@ class X(Structure): "_pack_": -1} self.assertRaises(ValueError, type(Structure), "X", (Structure,), d) + @test.support.cpython_only + def test_packed_c_limits(self): # Issue 15989 + import _testcapi d = {"_fields_": [("a", c_byte)], "_pack_": _testcapi.INT_MAX + 1} self.assertRaises(ValueError, type(Structure), "X", (Structure,), d) diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 172bd25419cea7..c761076c4a0225 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -143,6 +143,7 @@ def test_bound_methods(self): self.assertEqual(l, [5]) +@support.cpython_only class SubinterpreterTest(unittest.TestCase): def test_callbacks_leak(self): diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index 6d63cdb5f0fcc9..402fbe845765e5 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -1772,6 +1772,7 @@ def wrap(gen): sys.set_coroutine_wrapper(None) +@support.cpython_only class CAPITest(unittest.TestCase): def test_tp_await_1(self): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 70c03f9c468a21..b72fc8fbf0cadd 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -876,6 +876,7 @@ def testNtoH(self): self.assertEqual(swapped & mask, mask) self.assertRaises(OverflowError, func, 1<<34) + @support.cpython_only def testNtoHErrors(self): good_values = [ 1, 2, 3, 1, 2, 3 ] bad_values = [ -1, -2, -3, -1, -2, -3 ] diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index da89a9a8715935..2d1a9b3cfb20af 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -809,6 +809,7 @@ def test_sys_xoptions_invalid(self): b'number of frames', stderr) + @support.cpython_only def test_pymem_alloc0(self): # Issue #21639: Check that PyMem_Malloc(0) with tracemalloc enabled # does not crash. From 08612ed6a91003cdba7617dee7787c26495c50d9 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 20 Mar 2017 00:51:16 +0200 Subject: [PATCH 093/220] bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. (#514) (#727) (cherry picked from commit a5af6e1af77ee0f9294c5776478a9c24d9fbab94) --- Lib/test/test_fileio.py | 9 ++++++++- Lib/test/test_io.py | 20 ++++++++++++++++++++ Misc/NEWS | 2 ++ Modules/_io/bufferedio.c | 14 ++++++++++++-- Modules/_io/fileio.c | 16 +++++++++++++--- Modules/_io/textio.c | 23 ++++++++++++++++++++--- 6 files changed, 75 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 12f2f119b5e903..1bc1847a360cc7 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -9,7 +9,8 @@ from weakref import proxy from functools import wraps -from test.support import TESTFN, check_warnings, run_unittest, make_bad_fd, cpython_only +from test.support import (TESTFN, check_warnings, run_unittest, + make_bad_fd, cpython_only, swap_attr) from collections import UserList import _io # C implementation of io @@ -175,6 +176,12 @@ def testReprNoCloseFD(self): finally: os.close(fd) + def testRecursiveRepr(self): + # Issue #25455 + with swap_attr(self.f, 'name', self.f): + with self.assertRaises(RuntimeError): + repr(self.f) # Should not crash + def testErrors(self): f = self.f self.assertFalse(f.isatty()) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 5111882a0258e9..ab24ca110dd929 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -981,6 +981,16 @@ def test_repr(self): raw.name = b"dummy" self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) + def test_recursive_repr(self): + # Issue #25455 + raw = self.MockRawIO() + b = self.tp(raw) + with support.swap_attr(raw, 'name', b): + try: + repr(b) # Should not crash + except RuntimeError: + pass + def test_flush_error_on_close(self): # Test that buffered file is closed despite failed flush # and that flush() is called before file closed. @@ -2391,6 +2401,16 @@ def test_repr(self): t.buffer.detach() repr(t) # Should not raise an exception + def test_recursive_repr(self): + # Issue #25455 + raw = self.BytesIO() + t = self.TextIOWrapper(raw) + with support.swap_attr(raw, 'name', t): + try: + repr(t) # Should not crash + except RuntimeError: + pass + def test_line_buffering(self): r = self.BytesIO() b = self.BufferedWriter(r, 1000) diff --git a/Misc/NEWS b/Misc/NEWS index 40d87e291d0f6e..1005bc54358819 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,8 @@ Extension Modules Library ------- +- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. + - bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords are not strings. Patch by Michael Seifert. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 6d67751c7d6b08..909c4fa84659e5 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1416,8 +1416,18 @@ buffered_repr(buffered *self) res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name); } else { - res = PyUnicode_FromFormat("<%s name=%R>", - Py_TYPE(self)->tp_name, nameobj); + int status = Py_ReprEnter((PyObject *)self); + res = NULL; + if (status == 0) { + res = PyUnicode_FromFormat("<%s name=%R>", + Py_TYPE(self)->tp_name, nameobj); + Py_ReprLeave((PyObject *)self); + } + else if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } Py_DECREF(nameobj); } return res; diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index 919cf502dca4ac..c77f05521d080c 100644 --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -1093,9 +1093,19 @@ fileio_repr(fileio *self) self->fd, mode_string(self), self->closefd ? "True" : "False"); } else { - res = PyUnicode_FromFormat( - "<_io.FileIO name=%R mode='%s' closefd=%s>", - nameobj, mode_string(self), self->closefd ? "True" : "False"); + int status = Py_ReprEnter((PyObject *)self); + res = NULL; + if (status == 0) { + res = PyUnicode_FromFormat( + "<_io.FileIO name=%R mode='%s' closefd=%s>", + nameobj, mode_string(self), self->closefd ? "True" : "False"); + Py_ReprLeave((PyObject *)self); + } + else if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } Py_DECREF(nameobj); } return res; diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 89b0798cd0b687..3ab11387bf722a 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2483,6 +2483,7 @@ static PyObject * textiowrapper_repr(textio *self) { PyObject *nameobj, *modeobj, *res, *s; + int status; CHECK_INITIALIZED(self); @@ -2490,6 +2491,15 @@ textiowrapper_repr(textio *self) if (res == NULL) return NULL; + status = Py_ReprEnter((PyObject *)self); + if (status != 0) { + if (status > 0) { + PyErr_Format(PyExc_RuntimeError, + "reentrant call inside %s.__repr__", + Py_TYPE(self)->tp_name); + } + goto error; + } nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name); if (nameobj == NULL) { if (PyErr_ExceptionMatches(PyExc_Exception)) @@ -2504,7 +2514,7 @@ textiowrapper_repr(textio *self) goto error; PyUnicode_AppendAndDel(&res, s); if (res == NULL) - return NULL; + goto error; } modeobj = _PyObject_GetAttrId((PyObject *) self, &PyId_mode); if (modeobj == NULL) { @@ -2520,14 +2530,21 @@ textiowrapper_repr(textio *self) goto error; PyUnicode_AppendAndDel(&res, s); if (res == NULL) - return NULL; + goto error; } s = PyUnicode_FromFormat("%U encoding=%R>", res, self->encoding); Py_DECREF(res); + if (status == 0) { + Py_ReprLeave((PyObject *)self); + } return s; -error: + + error: Py_XDECREF(res); + if (status == 0) { + Py_ReprLeave((PyObject *)self); + } return NULL; } From 7cc071c96b95e7422f64cb436d547c952e0ca52f Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 19 Mar 2017 20:58:34 -0700 Subject: [PATCH 094/220] bpo-29856: Fix typo in curses documentation (GH-730) (GH-732) From Shifted Dxit -> Shifted Exit in Doc/library/curses.rst (cherry picked from commit 64508780d72769e4c7afc67a511c057261c578f6) --- Doc/library/curses.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index d746eafaea9b5c..d51085506c2a96 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -1443,7 +1443,7 @@ The exact keycaps available are system dependent. +-------------------+--------------------------------------------+ | ``KEY_SEOL`` | Shifted Clear line | +-------------------+--------------------------------------------+ -| ``KEY_SEXIT`` | Shifted Dxit | +| ``KEY_SEXIT`` | Shifted Exit | +-------------------+--------------------------------------------+ | ``KEY_SFIND`` | Shifted Find | +-------------------+--------------------------------------------+ From 4276068fe57e93b4c8d428f0b1cde8ca04b8fb99 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 20 Mar 2017 09:37:31 +0200 Subject: [PATCH 095/220] bpo-28876: bool of large range raises OverflowError (#699) (#735) (cherry picked from commit e46fb8611867fa3b407a813f53137929b7cb4a10) --- Lib/test/test_range.py | 17 +++++++++++++---- Misc/NEWS | 3 +++ Objects/rangeobject.c | 21 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index c022f070bf52c7..90efa1a01e6ab1 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -98,20 +98,24 @@ def test_large_operands(self): x = range(10**20+10, 10**20, 3) self.assertEqual(len(x), 0) self.assertEqual(len(list(x)), 0) + self.assertFalse(x) x = range(10**20, 10**20+10, -3) self.assertEqual(len(x), 0) self.assertEqual(len(list(x)), 0) + self.assertFalse(x) x = range(10**20+10, 10**20, -3) self.assertEqual(len(x), 4) self.assertEqual(len(list(x)), 4) + self.assertTrue(x) # Now test range() with longs - self.assertEqual(list(range(-2**100)), []) - self.assertEqual(list(range(0, -2**100)), []) - self.assertEqual(list(range(0, 2**100, -1)), []) - self.assertEqual(list(range(0, 2**100, -1)), []) + for x in [range(-2**100), + range(0, -2**100), + range(0, 2**100, -1)]: + self.assertEqual(list(x), []) + self.assertFalse(x) a = int(10 * sys.maxsize) b = int(100 * sys.maxsize) @@ -152,6 +156,7 @@ def _range_len(x): step = x[1] - x[0] length = 1 + ((x[-1] - x[0]) // step) return length + a = -sys.maxsize b = sys.maxsize expected_len = b - a @@ -159,6 +164,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -176,6 +182,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -194,6 +201,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 @@ -212,6 +220,7 @@ def _range_len(x): self.assertIn(a, x) self.assertNotIn(b, x) self.assertRaises(OverflowError, len, x) + self.assertTrue(x) self.assertEqual(_range_len(x), expected_len) self.assertEqual(x[0], a) idx = sys.maxsize+1 diff --git a/Misc/NEWS b/Misc/NEWS index 1005bc54358819..e45cf3edfdaf8a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-28876: ``bool(range)`` works even if ``len(range)`` + raises :exc:`OverflowError`. + - bpo-29600: Fix wrapping coroutine return values in StopIteration. - Issue #29537: Restore runtime compatibility with bytecode files generated by diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 899697aa3a1639..f221fde83f33c8 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -675,6 +675,25 @@ static PyMappingMethods range_as_mapping = { (objobjargproc)0, /* mp_ass_subscript */ }; +static int +range_bool(rangeobject* self) +{ + return PyObject_IsTrue(self->length); +} + +static PyNumberMethods range_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + (inquiry)range_bool, /* nb_bool */ +}; + static PyObject * range_iter(PyObject *seq); static PyObject * range_reverse(PyObject *seq); @@ -714,7 +733,7 @@ PyTypeObject PyRange_Type = { 0, /* tp_setattr */ 0, /* tp_reserved */ (reprfunc)range_repr, /* tp_repr */ - 0, /* tp_as_number */ + &range_as_number, /* tp_as_number */ &range_as_sequence, /* tp_as_sequence */ &range_as_mapping, /* tp_as_mapping */ (hashfunc)range_hash, /* tp_hash */ From ed512cba78af211da4d83cbb7cc533c39176f374 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Tue, 21 Mar 2017 00:35:51 -0400 Subject: [PATCH 096/220] bpo-27593: Revise git SCM build info. (#744) (#746) Use --short form of git hash. Use output from "git describe" for tag. Expected outputs: 1. previous hg 2. previous git 3. updated git Release (tagged) build: 1. Python 3.7.0a0 (v3.7.0a0:4def2a2901a5, ... 2. Python 3.7.0a0 (v3.7.0a0^0:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (v3.7.0a0:05f53735c8, ... Development build: 1. Python 3.7.0a0 (default:41df79263a11, ... 2. Python 3.7.0a0 (master:05f53735c8912f8df1077e897f052571e13c3496, ... 3. Python 3.7.0a0 (heads/master-dirty:05f53735c8, ... "dirty" means the working tree has uncommitted changes. See "git help describe" for more info. (cherry picked from commit 554626ada769abf82a5dabe6966afa4265acb6a6) --- PCbuild/pythoncore.vcxproj | 4 ++-- configure | 4 ++-- configure.ac | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index b7e0f3cec534d4..6466a6b48b9b08 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -407,8 +407,8 @@ - - + + $([System.IO.File]::ReadAllText('$(IntDir)gitbranch.txt').Trim()) $([System.IO.File]::ReadAllText('$(IntDir)gitversion.txt').Trim()) diff --git a/configure b/configure index 640cad7c4aa45a..0f7484231a38ce 100755 --- a/configure +++ b/configure @@ -2884,8 +2884,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" diff --git a/configure.ac b/configure.ac index 4682341723f038..0eca886aebdc69 100644 --- a/configure.ac +++ b/configure.ac @@ -37,8 +37,8 @@ HAS_GIT=no-repository fi if test $HAS_GIT = found then - GITVERSION="git -C \$(srcdir) rev-parse HEAD" - GITTAG="git -C \$(srcdir) name-rev --tags --name-only HEAD" + GITVERSION="git -C \$(srcdir) rev-parse --short HEAD" + GITTAG="git -C \$(srcdir) describe --all --always --dirty" GITBRANCH="git -C \$(srcdir) name-rev --name-only HEAD" else GITVERSION="" From cb4beb6b89f992b7967ca3e7471d292789385b48 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 22 Mar 2017 16:03:27 +0800 Subject: [PATCH 097/220] fix function name in tabnanny documentation (GH-763) --- Doc/library/tabnanny.rst | 8 ++++---- Lib/tabnanny.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/tabnanny.rst b/Doc/library/tabnanny.rst index 1edb0fbabb2023..dfe688a2f93e0c 100644 --- a/Doc/library/tabnanny.rst +++ b/Doc/library/tabnanny.rst @@ -48,14 +48,14 @@ described below. .. exception:: NannyNag - Raised by :func:`tokeneater` if detecting an ambiguous indent. Captured and + Raised by :func:`process_tokens` if detecting an ambiguous indent. Captured and handled in :func:`check`. -.. function:: tokeneater(type, token, start, end, line) +.. function:: process_tokens(tokens) - This function is used by :func:`check` as a callback parameter to the function - :func:`tokenize.tokenize`. + This function is used by :func:`check` to process tokens generated by the + :mod:`tokenize` module. .. XXX document errprint, format_witnesses, Whitespace, check_equal, indents, reset_globals diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py index 46e0f56a392ae6..bfb670c9027d76 100755 --- a/Lib/tabnanny.py +++ b/Lib/tabnanny.py @@ -59,7 +59,7 @@ def main(): class NannyNag(Exception): """ - Raised by tokeneater() if detecting an ambiguous indent. + Raised by process_tokens() if detecting an ambiguous indent. Captured and handled in check(). """ def __init__(self, lineno, msg, line): From d7df9e61c8ea1a7919466f82423bdbb0bfe1df61 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 22 Mar 2017 17:14:17 +0900 Subject: [PATCH 098/220] doc: minor fix for library/profile (GH-767) (cherry picked from commit bd3d8ba3b22da0bad018b53a3e6610ae03c5aa49) --- Doc/library/profile.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index bd67fe486abf77..b4b1479e2ceba4 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -85,11 +85,11 @@ next line: ``Ordered by: standard name``, indicates that the text string in the far right column was used to sort the output. The column headings include: ncalls - for the number of calls, + for the number of calls. tottime - for the total time spent in the given function (and excluding time made in - calls to sub-functions) + for the total time spent in the given function (and excluding time made in + calls to sub-functions) percall is the quotient of ``tottime`` divided by ``ncalls`` From a6a856f4d85d6dab5ea924546777292988cbc706 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 22 Mar 2017 18:55:33 -0700 Subject: [PATCH 099/220] Remove an outdated statement in execution model docs (GH-754) (GH-774) (cherry picked from commit fad7f1560669af1766c583c7ef242c55d8c8de41) --- Doc/reference/executionmodel.rst | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 5f1ea92ed460f3..f0dbbd1edf6321 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -194,12 +194,6 @@ This means that the following code will print 42:: i = 42 f() -There are several cases where Python statements are illegal when used in -conjunction with nested scopes that contain free variables. - -If a variable is referenced in an enclosing scope, it is illegal to delete the -name. An error will be reported at compile time. - .. XXX from * also invalid with relative imports (at least currently) The :func:`eval` and :func:`exec` functions do not have access to the full From 6a45811d06e25447c83f78d67fd78298f83868ee Mon Sep 17 00:00:00 2001 From: Christophe Zeitouny Date: Fri, 24 Mar 2017 04:21:37 -0700 Subject: [PATCH 100/220] faulthandler: Restore the old sigaltstack during teardown (GH-777) (GH-796) (cherry picked from commit 20fbf8accd494fd15b0fc4c84928178c71ead4d1) --- Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/faulthandler.c | 17 ++++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Misc/ACKS b/Misc/ACKS index 8a952a45f5dcd4..edfbb448bd9155 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1679,6 +1679,7 @@ Artur Zaprzala Mike Zarnstorff Yury V. Zaytsev Siebren van der Zee +Christophe Zeitouny Nickolai Zeldovich Yuxiao Zeng Uwe Zessin diff --git a/Misc/NEWS b/Misc/NEWS index e45cf3edfdaf8a..e063455b986413 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,9 @@ Extension Modules Library ------- +- bpo-29884: faulthandler: Restore the old sigaltstack during teardown. + Patch by Christophe Zeitouny. + - bpo-25455: Fixed crashes in repr of recursive buffered file-like objects. - bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index f1fda481fc61bf..56285b6358e056 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -124,6 +124,7 @@ static const unsigned char faulthandler_nsignals = \ #ifdef HAVE_SIGALTSTACK static stack_t stack; +static stack_t old_stack; #endif @@ -1148,7 +1149,7 @@ int _PyFaulthandler_Init(void) stack.ss_size = SIGSTKSZ; stack.ss_sp = PyMem_Malloc(stack.ss_size); if (stack.ss_sp != NULL) { - err = sigaltstack(&stack, NULL); + err = sigaltstack(&stack, &old_stack); if (err) { PyMem_Free(stack.ss_sp); stack.ss_sp = NULL; @@ -1204,6 +1205,20 @@ void _PyFaulthandler_Fini(void) faulthandler_disable(); #ifdef HAVE_SIGALTSTACK if (stack.ss_sp != NULL) { + /* Fetch the current alt stack */ + stack_t current_stack; + if (sigaltstack(NULL, ¤t_stack) == 0) { + if (current_stack.ss_sp == stack.ss_sp) { + /* The current alt stack is the one that we installed. + It is safe to restore the old stack that we found when + we installed ours */ + sigaltstack(&old_stack, NULL); + } else { + /* Someone switched to a different alt stack and didn't + restore ours when they were done (if they're done). + There's not much we can do in this unlikely case */ + } + } PyMem_Free(stack.ss_sp); stack.ss_sp = NULL; } From 80cb6ed4db9bae09de1e9ad6001d11cb45a4c1cc Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 24 Mar 2017 15:19:18 +0100 Subject: [PATCH 101/220] bpo-29861: release references to multiprocessing Pool tasks (#743) (#801) * bpo-29861: release references to multiprocessing Pool tasks (#743) * bpo-29861: release references to multiprocessing Pool tasks Release references to tasks, their arguments and their results as soon as they are finished, instead of keeping them alive until another task arrives. * Comments in test (cherry picked from commit 8988945cdc27ffa86ba8c624e095b51c459f5154) * Fix Misc/NEWS?? --- Lib/multiprocessing/pool.py | 7 ++++++- Lib/test/_test_multiprocessing.py | 28 ++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 6d25469e1620c0..7d5ab67b4704cd 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -128,6 +128,8 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, util.debug("Possible encoding error while sending result: %s" % ( wrapped)) put((job, i, (False, wrapped))) + + task = job = result = func = args = kwds = None completed += 1 util.debug('worker exiting after %d tasks' % completed) @@ -402,10 +404,11 @@ def _handle_tasks(taskqueue, put, outqueue, pool, cache): if set_length: util.debug('doing set_length()') set_length(i+1) + finally: + task = taskseq = job = None else: util.debug('task handler got sentinel') - try: # tell result handler to finish when cache is empty util.debug('task handler sending sentinel to result handler') @@ -445,6 +448,7 @@ def _handle_results(outqueue, get, cache): cache[job]._set(i, obj) except KeyError: pass + task = job = obj = None while cache and thread._state != TERMINATE: try: @@ -461,6 +465,7 @@ def _handle_results(outqueue, get, cache): cache[job]._set(i, obj) except KeyError: pass + task = job = obj = None if hasattr(outqueue, '_reader'): util.debug('ensuring that outqueue is not full') diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 9b789c2a3385b2..b053342f1c26c1 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -18,6 +18,7 @@ import logging import struct import operator +import weakref import test.support import test.support.script_helper @@ -1668,6 +1669,19 @@ def sqr(x, wait=0.0): def mul(x, y): return x*y +def identity(x): + return x + +class CountedObject(object): + n_instances = 0 + + def __new__(cls): + cls.n_instances += 1 + return object.__new__(cls) + + def __del__(self): + type(self).n_instances -= 1 + class SayWhenError(ValueError): pass def exception_throwing_generator(total, when): @@ -1676,6 +1690,7 @@ def exception_throwing_generator(total, when): raise SayWhenError("Somebody said when") yield i + class _TestPool(BaseTestCase): @classmethod @@ -1910,6 +1925,19 @@ def test_wrapped_exception(self): with self.assertRaises(RuntimeError): p.apply(self._test_wrapped_exception) + def test_release_task_refs(self): + # Issue #29861: task arguments and results should not be kept + # alive after we are done with them. + objs = [CountedObject() for i in range(10)] + refs = [weakref.ref(o) for o in objs] + self.pool.map(identity, objs) + + del objs + self.assertEqual(set(wr() for wr in refs), {None}) + # With a process pool, copies of the objects are returned, check + # they were released too. + self.assertEqual(CountedObject.n_instances, 0) + def raising(): raise KeyError("key") diff --git a/Misc/NEWS b/Misc/NEWS index e063455b986413..cc219d4bed0d49 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,9 @@ Extension Modules Library ------- +- bpo-29861: Release references to tasks, their arguments and their results + as soon as they are finished in multiprocessing.Pool. + - bpo-29884: faulthandler: Restore the old sigaltstack during teardown. Patch by Christophe Zeitouny. From 1fc1f8d7f737f80a1ee5ea37b9781c0a790102b2 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 24 Mar 2017 21:46:46 +0200 Subject: [PATCH 102/220] bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) (#805) (#807) when the OS gives priority to errors such as EACCES over EEXIST. (cherry picked from commit af7b9ec5c855366feef4c67dc492d64b3baf84ca) --- Lib/pathlib.py | 32 +++++++++++++++----------------- Lib/test/test_pathlib.py | 5 +++++ Misc/NEWS | 3 +++ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index c0d858ef56120a..16b99cddbc7183 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1207,25 +1207,23 @@ def touch(self, mode=0o666, exist_ok=True): os.close(fd) def mkdir(self, mode=0o777, parents=False, exist_ok=False): + """ + Create a new directory at this given path. + """ if self._closed: self._raise_closed() - if not parents: - try: - self._accessor.mkdir(self, mode) - except FileExistsError: - if not exist_ok or not self.is_dir(): - raise - else: - try: - self._accessor.mkdir(self, mode) - except FileExistsError: - if not exist_ok or not self.is_dir(): - raise - except OSError as e: - if e.errno != ENOENT or self.parent == self: - raise - self.parent.mkdir(parents=True) - self._accessor.mkdir(self, mode) + try: + self._accessor.mkdir(self, mode) + except FileNotFoundError: + if not parents or self.parent == self: + raise + self.parent.mkdir(parents=True) + self._accessor.mkdir(self, mode) + except OSError: + # Cannot rely on checking for EEXIST, since the operating system + # could give priority to other errors like EACCES or EROFS + if not exist_ok or not self.is_dir(): + raise def chmod(self, mode): """ diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 28e3ea4da6e28c..86d3077d5c4458 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1727,6 +1727,11 @@ def test_mkdir_exist_ok_with_parent(self): self.assertTrue(p.exists()) self.assertEqual(p.stat().st_ctime, st_ctime_first) + def test_mkdir_exist_ok_root(self): + # Issue #25803: A drive root could raise PermissionError on Windows + self.cls('/').resolve().mkdir(exist_ok=True) + self.cls('/').resolve().mkdir(parents=True, exist_ok=True) + @only_nt # XXX: not sure how to test this on POSIX def test_mkdir_with_unknown_drive(self): for d in 'ZYXWVUTSRQPONMLKJIHGFEDCBA': diff --git a/Misc/NEWS b/Misc/NEWS index cc219d4bed0d49..f541504e0cdc5f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,9 @@ Extension Modules Library ------- +- bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) + when the OS gives priority to errors such as EACCES over EEXIST. + - bpo-29861: Release references to tasks, their arguments and their results as soon as they are finished in multiprocessing.Pool. From 55717b4b487a9ccc119ca501fad71937fa01d1f6 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 25 Mar 2017 03:42:38 -0700 Subject: [PATCH 103/220] bpo-29862: Fix grammar in importlib.reload() exception (GH-809) (GH-812) (cherry picked from commit 9f0aa4843f8c26937d5817f27cac4aae9c0a034f) --- Lib/importlib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py index b6a9f82e05f268..8b11d22b024ffa 100644 --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -136,7 +136,7 @@ def reload(module): """ if not module or not isinstance(module, types.ModuleType): - raise TypeError("reload() argument must be module") + raise TypeError("reload() argument must be a module") try: name = module.__spec__.name except AttributeError: From 8ce3085bf167b702989a9db466078b5676e825e3 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 26 Mar 2017 13:59:01 -0400 Subject: [PATCH 104/220] bpo-29888: Fix the link referring to the "Python download page" (GH-824) (GH-827) (cherry picked from commit f8beb9831acd5cf80b9c56aea5864e16118c5400) --- Doc/tools/templates/download.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/tools/templates/download.html b/Doc/tools/templates/download.html index de84ae3abc81c7..3a05cb697938fd 100644 --- a/Doc/tools/templates/download.html +++ b/Doc/tools/templates/download.html @@ -42,7 +42,7 @@

Download Python {{ release }} Documentation

These archives contain all the content in the documentation.

HTML Help (.chm) files are made available in the "Windows" section -on the Python +on the Python download page.

From c2492ddd7c9797f94c85988ce7a86320d4ebfb59 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Sun, 26 Mar 2017 22:54:45 -0500 Subject: [PATCH 105/220] Treat Sphinx warnings as errors (GH-832) (GH-835) (cherry picked from commit 334e9ec938ea9876baadef15edb135d6d2aff30c) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 66f03dc7161a7f..3496a1abba2c97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ matrix: - cd Doc - make venv script: - - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q" + - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" - os: linux language: c compiler: clang From ec3a32699e03cc12892a1b2fd37eed5a721ab5a0 Mon Sep 17 00:00:00 2001 From: Zachary Ware Date: Mon, 27 Mar 2017 00:38:20 -0500 Subject: [PATCH 106/220] Minor test cleanup (GH-837) (GH-839) * Remove unused test file * Remove duplicated text in sndhdrdata README (cherry picked from commit b8a7daf077dab18e9e3701c5380b542ae0aa9a94) --- Lib/test/185test.db | Bin 16384 -> 0 bytes Lib/test/sndhdrdata/README | 7 ------- 2 files changed, 7 deletions(-) delete mode 100644 Lib/test/185test.db diff --git a/Lib/test/185test.db b/Lib/test/185test.db deleted file mode 100644 index 14cb5e258bc0961fa22527dcb5d947a6a0fd5480..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI!F$%&k6vpwdEl39?E*_+VxVZETo - -Sound file samples used by Lib/test/test_sndhdr.py and generated using the -following commands: - - dd if=/dev/zero of=sndhdr.raw bs=20 count=1 - sox -s -2 -c 2 -r 44100 sndhdr.raw sndhdr. - From cf57fe13b44e3994096ae79f32c11475f333a94f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Mar 2017 16:11:34 +0200 Subject: [PATCH 107/220] bpo-27425: Add .gitattributes, fix Windows tests (#844) Mark binary files as binay in .gitattributes to not translate newline characters in Git repositories on Windows. --- .gitattributes | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000000..82694d81f276b2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +*.pck binary +Lib/test/cjkencodings/* binary +Lib/test/decimaltestdata/*.decTest binary +Lib/test/sndhdrdata/sndhdr.* binary +Lib/test/test_email/data/msg_26.txt binary +Lib/test/xmltestdata/* binary +Lib/venv/scripts/nt/* binary +Lib/test/coding20731.py binary From cb09f421c88ff4c0bb8282ef6ca49d5ce2ccfc2c Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Mon, 27 Mar 2017 16:46:46 -0700 Subject: [PATCH 108/220] Drop the standard gcc test build on Travis (GH-853) (GH-860) Instead have gcc be used for the coverage build so gcc is exercised in at least one place. (cherry picked from commit ad2f9e2c8a0b44b3e6aec9d28ba59e13239236f7) --- .travis.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3496a1abba2c97..5fee6cd7673324 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,11 +15,11 @@ os: - linux # macOS builds are disabled as the machines are under-provisioned on Travis, # adding up to an extra hour completing a full CI run. - #- osx compiler: - clang - - gcc + # gcc also works, but to keep the # of concurrent builds down, we use one C + # compiler here and the other to run the coverage build. env: - TESTING=cpython @@ -32,7 +32,7 @@ matrix: include: - os: linux language: python - python: 3.5 + python: 3.6 env: - TESTING=docs before_script: @@ -42,7 +42,7 @@ matrix: - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" - os: linux language: c - compiler: clang + compiler: gcc env: - TESTING=coverage before_script: From 8994f36287b068e8ea9a9230fc90eda72bf5fff0 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Mon, 27 Mar 2017 17:09:21 -0700 Subject: [PATCH 109/220] bpo-29677: DOC: clarify documentation for `round` (GH-357) (GH-863) (cherry picked from commit 6003db7db5fec545c01923c198a5fdfca5a91538) --- Doc/library/functions.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 2f14949e1f646b..15413cba941932 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1241,7 +1241,8 @@ are always available. They are listed here in alphabetical order. closest multiple of 10 to the power minus *ndigits*; if two multiples are equally close, rounding is done toward the even choice (so, for example, both ``round(0.5)`` and ``round(-0.5)`` are ``0``, and ``round(1.5)`` is - ``2``). The return value is an integer if called with one argument, + ``2``). Any integer value is valid for *ndigits* (positive, zero, or + negative). The return value is an integer if called with one argument, otherwise of the same type as *number*. .. note:: From e6a49531568561fe5aaf662259ecb7b4bc2426be Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Wed, 29 Mar 2017 00:26:29 +0900 Subject: [PATCH 110/220] bpo-29643: Fix check for --enable-optimizations (GH-871) The presence of the ``--enable-optimizations`` flag is indicated by the value of ``$enableval``, but the configure script was checking ``$withval``, resulting in the ``--enable-optimizations`` flag being effectively ignored. (cherry picked from commit 8cea5929f52801b0ce5928b46ef836e99a24321a) --- Misc/NEWS | 5 +++++ configure | 2 +- configure.ac | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index f541504e0cdc5f..1b0c1c092c8dfa 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -157,6 +157,11 @@ Documentation - Issue #29349: Fix Python 2 syntax in code for building the documentation. +Build +----- + +- bpo-29643: Fix ``--enable-optimization`` didn't work. + Tests ----- diff --git a/configure b/configure index 0f7484231a38ce..c84a8ec9e04a1a 100755 --- a/configure +++ b/configure @@ -6548,7 +6548,7 @@ $as_echo_n "checking for --enable-optimizations... " >&6; } # Check whether --enable-optimizations was given. if test "${enable_optimizations+set}" = set; then : enableval=$enable_optimizations; -if test "$withval" != no +if test "$enableval" != no then Py_OPT='true' { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 diff --git a/configure.ac b/configure.ac index 0eca886aebdc69..779fe3764c7f5a 100644 --- a/configure.ac +++ b/configure.ac @@ -1237,7 +1237,7 @@ Py_OPT='false' AC_MSG_CHECKING(for --enable-optimizations) AC_ARG_ENABLE(optimizations, AS_HELP_STRING([--enable-optimizations], [Enable expensive optimizations (PGO, maybe LTO, etc). Disabled by default.]), [ -if test "$withval" != no +if test "$enableval" != no then Py_OPT='true' AC_MSG_RESULT(yes); From 0957f262c5e47167efd520624557aebdc61bfda8 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 28 Mar 2017 09:32:50 -0700 Subject: [PATCH 111/220] bpo-16011: clarify that 'in' always returns a boolean value (GH-152) (GH-875) (cherry picked from commit 0ae7c8bd614d3aa1fcaf2d71a10ff1148c80d9b5) --- Doc/reference/expressions.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index ea89486128c68f..7c1f2a6dc2d39c 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1271,28 +1271,29 @@ Membership test operations -------------------------- The operators :keyword:`in` and :keyword:`not in` test for membership. ``x in -s`` evaluates to true if *x* is a member of *s*, and false otherwise. ``x not -in s`` returns the negation of ``x in s``. All built-in sequences and set types -support this as well as dictionary, for which :keyword:`in` tests whether the -dictionary has a given key. For container types such as list, tuple, set, -frozenset, dict, or collections.deque, the expression ``x in y`` is equivalent +s`` evaluates to ``True`` if *x* is a member of *s*, and ``False`` otherwise. +``x not in s`` returns the negation of ``x in s``. All built-in sequences and +set types support this as well as dictionary, for which :keyword:`in` tests +whether the dictionary has a given key. For container types such as list, tuple, +set, frozenset, dict, or collections.deque, the expression ``x in y`` is equivalent to ``any(x is e or x == e for e in y)``. -For the string and bytes types, ``x in y`` is true if and only if *x* is a +For the string and bytes types, ``x in y`` is ``True`` if and only if *x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``. Empty strings are always considered to be a substring of any other string, so ``"" in "abc"`` will return ``True``. For user-defined classes which define the :meth:`__contains__` method, ``x in -y`` is true if and only if ``y.__contains__(x)`` is true. +y`` returns ``True`` if ``y.__contains__(x)`` returns a true value, and +``False`` otherwise. For user-defined classes which do not define :meth:`__contains__` but do define -:meth:`__iter__`, ``x in y`` is true if some value ``z`` with ``x == z`` is +:meth:`__iter__`, ``x in y`` is ``True`` if some value ``z`` with ``x == z`` is produced while iterating over ``y``. If an exception is raised during the iteration, it is as if :keyword:`in` raised that exception. Lastly, the old-style iteration protocol is tried: if a class defines -:meth:`__getitem__`, ``x in y`` is true if and only if there is a non-negative +:meth:`__getitem__`, ``x in y`` is ``True`` if and only if there is a non-negative integer index *i* such that ``x == y[i]``, and all lower integer indices do not raise :exc:`IndexError` exception. (If any other exception is raised, it is as if :keyword:`in` raised that exception). From 9f8e0904580cae3b99f8d343569b76e1be7e6092 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 29 Mar 2017 12:51:29 +0800 Subject: [PATCH 112/220] bpo-28699: fix abnormal behaviour of pools in multiprocessing.pool (GH-884) an exception raised at the very first of an iterable would cause pools behave abnormally (swallow the exception or hang) --- Lib/multiprocessing/pool.py | 79 +++++++++++++++++++++---------- Lib/test/_test_multiprocessing.py | 59 ++++++++++++++++++++++- Misc/NEWS | 4 ++ 3 files changed, 117 insertions(+), 25 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 7d5ab67b4704cd..789488f0493ce7 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -118,7 +118,7 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, try: result = (True, func(*args, **kwds)) except Exception as e: - if wrap_exception: + if wrap_exception and func is not _helper_reraises_exception: e = ExceptionWithTraceback(e, e.__traceback__) result = (False, e) try: @@ -133,6 +133,10 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, completed += 1 util.debug('worker exiting after %d tasks' % completed) +def _helper_reraises_exception(ex): + 'Pickle-able helper function for use by _guarded_task_generation.' + raise ex + # # Class representing a process pool # @@ -277,6 +281,17 @@ def starmap_async(self, func, iterable, chunksize=None, callback=None, return self._map_async(func, iterable, starmapstar, chunksize, callback, error_callback) + def _guarded_task_generation(self, result_job, func, iterable): + '''Provides a generator of tasks for imap and imap_unordered with + appropriate handling for iterables which throw exceptions during + iteration.''' + try: + i = -1 + for i, x in enumerate(iterable): + yield (result_job, i, func, (x,), {}) + except Exception as e: + yield (result_job, i+1, _helper_reraises_exception, (e,), {}) + def imap(self, func, iterable, chunksize=1): ''' Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. @@ -285,15 +300,23 @@ def imap(self, func, iterable, chunksize=1): raise ValueError("Pool not running") if chunksize == 1: result = IMapIterator(self._cache) - self._taskqueue.put((((result._job, i, func, (x,), {}) - for i, x in enumerate(iterable)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, func, iterable), + result._set_length + )) return result else: assert chunksize > 1 task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapIterator(self._cache) - self._taskqueue.put((((result._job, i, mapstar, (x,), {}) - for i, x in enumerate(task_batches)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapstar, + task_batches), + result._set_length + )) return (item for chunk in result for item in chunk) def imap_unordered(self, func, iterable, chunksize=1): @@ -304,15 +327,23 @@ def imap_unordered(self, func, iterable, chunksize=1): raise ValueError("Pool not running") if chunksize == 1: result = IMapUnorderedIterator(self._cache) - self._taskqueue.put((((result._job, i, func, (x,), {}) - for i, x in enumerate(iterable)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, func, iterable), + result._set_length + )) return result else: assert chunksize > 1 task_batches = Pool._get_tasks(func, iterable, chunksize) result = IMapUnorderedIterator(self._cache) - self._taskqueue.put((((result._job, i, mapstar, (x,), {}) - for i, x in enumerate(task_batches)), result._set_length)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapstar, + task_batches), + result._set_length + )) return (item for chunk in result for item in chunk) def apply_async(self, func, args=(), kwds={}, callback=None, @@ -323,7 +354,7 @@ def apply_async(self, func, args=(), kwds={}, callback=None, if self._state != RUN: raise ValueError("Pool not running") result = ApplyResult(self._cache, callback, error_callback) - self._taskqueue.put(([(result._job, None, func, args, kwds)], None)) + self._taskqueue.put(([(result._job, 0, func, args, kwds)], None)) return result def map_async(self, func, iterable, chunksize=None, callback=None, @@ -354,8 +385,14 @@ def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, task_batches = Pool._get_tasks(func, iterable, chunksize) result = MapResult(self._cache, chunksize, len(iterable), callback, error_callback=error_callback) - self._taskqueue.put((((result._job, i, mapper, (x,), {}) - for i, x in enumerate(task_batches)), None)) + self._taskqueue.put( + ( + self._guarded_task_generation(result._job, + mapper, + task_batches), + None + ) + ) return result @staticmethod @@ -377,33 +414,27 @@ def _handle_tasks(taskqueue, put, outqueue, pool, cache): for taskseq, set_length in iter(taskqueue.get, None): task = None - i = -1 try: - for i, task in enumerate(taskseq): + # iterating taskseq cannot fail + for task in taskseq: if thread._state: util.debug('task handler found thread._state != RUN') break try: put(task) except Exception as e: - job, ind = task[:2] + job, idx = task[:2] try: - cache[job]._set(ind, (False, e)) + cache[job]._set(idx, (False, e)) except KeyError: pass else: if set_length: util.debug('doing set_length()') - set_length(i+1) + idx = task[1] if task else -1 + set_length(idx + 1) continue break - except Exception as ex: - job, ind = task[:2] if task else (0, 0) - if job in cache: - cache[job]._set(ind + 1, (False, ex)) - if set_length: - util.debug('doing set_length()') - set_length(i+1) finally: task = taskseq = job = None else: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index b053342f1c26c1..d1ef98dab47332 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -1685,6 +1685,8 @@ def __del__(self): class SayWhenError(ValueError): pass def exception_throwing_generator(total, when): + if when == -1: + raise SayWhenError("Somebody said when") for i in range(total): if i == when: raise SayWhenError("Somebody said when") @@ -1763,6 +1765,32 @@ def test_map_chunksize(self): except multiprocessing.TimeoutError: self.fail("pool.map_async with chunksize stalled on null list") + def test_map_handle_iterable_exception(self): + if self.TYPE == 'manager': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + # SayWhenError seen at the very first of the iterable + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(1, -1), 1) + # again, make sure it's reentrant + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(1, -1), 1) + + with self.assertRaises(SayWhenError): + self.pool.map(sqr, exception_throwing_generator(10, 3), 1) + + class SpecialIterable: + def __iter__(self): + return self + def __next__(self): + raise SayWhenError + def __len__(self): + return 1 + with self.assertRaises(SayWhenError): + self.pool.map(sqr, SpecialIterable(), 1) + with self.assertRaises(SayWhenError): + self.pool.map(sqr, SpecialIterable(), 1) + def test_async(self): res = self.pool.apply_async(sqr, (7, TIMEOUT1,)) get = TimingWrapper(res.get) @@ -1793,6 +1821,13 @@ def test_imap_handle_iterable_exception(self): if self.TYPE == 'manager': self.skipTest('test not appropriate for {}'.format(self.TYPE)) + # SayWhenError seen at the very first of the iterable + it = self.pool.imap(sqr, exception_throwing_generator(1, -1), 1) + self.assertRaises(SayWhenError, it.__next__) + # again, make sure it's reentrant + it = self.pool.imap(sqr, exception_throwing_generator(1, -1), 1) + self.assertRaises(SayWhenError, it.__next__) + it = self.pool.imap(sqr, exception_throwing_generator(10, 3), 1) for i in range(3): self.assertEqual(next(it), i*i) @@ -1819,6 +1854,17 @@ def test_imap_unordered_handle_iterable_exception(self): if self.TYPE == 'manager': self.skipTest('test not appropriate for {}'.format(self.TYPE)) + # SayWhenError seen at the very first of the iterable + it = self.pool.imap_unordered(sqr, + exception_throwing_generator(1, -1), + 1) + self.assertRaises(SayWhenError, it.__next__) + # again, make sure it's reentrant + it = self.pool.imap_unordered(sqr, + exception_throwing_generator(1, -1), + 1) + self.assertRaises(SayWhenError, it.__next__) + it = self.pool.imap_unordered(sqr, exception_throwing_generator(10, 3), 1) @@ -1900,7 +1946,7 @@ def test_traceback(self): except Exception as e: exc = e else: - raise AssertionError('expected RuntimeError') + self.fail('expected RuntimeError') self.assertIs(type(exc), RuntimeError) self.assertEqual(exc.args, (123,)) cause = exc.__cause__ @@ -1914,6 +1960,17 @@ def test_traceback(self): sys.excepthook(*sys.exc_info()) self.assertIn('raise RuntimeError(123) # some comment', f1.getvalue()) + # _helper_reraises_exception should not make the error + # a remote exception + with self.Pool(1) as p: + try: + p.map(sqr, exception_throwing_generator(1, -1), 1) + except Exception as e: + exc = e + else: + self.fail('expected SayWhenError') + self.assertIs(type(exc), SayWhenError) + self.assertIs(exc.__cause__, None) @classmethod def _test_wrapped_exception(cls): diff --git a/Misc/NEWS b/Misc/NEWS index 1b0c1c092c8dfa..9a22010218f38b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,10 @@ Extension Modules Library ------- +- bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an + exception at the very first of an iterable may swallow the exception or + make the program hang. Patch by Davin Potts and Xiang Zhang. + - bpo-25803: Avoid incorrect errors raised by Path.mkdir(exist_ok=True) when the OS gives priority to errors such as EACCES over EEXIST. From eef6e11f9883f54de491121b8c49fdadd3e3506d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 29 Mar 2017 19:10:22 -0700 Subject: [PATCH 113/220] bpo-29677: DOC: clarify documentation for `round` (GH-877) (GH-893) (cherry picked from commit 85deefcf61d3cc192846f41a4ccc6df17da60c98) --- Doc/library/functions.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 15413cba941932..ff8c7b83bbddc8 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1233,9 +1233,9 @@ are always available. They are listed here in alphabetical order. .. function:: round(number[, ndigits]) - Return the floating point value *number* rounded to *ndigits* digits after - the decimal point. If *ndigits* is omitted or is ``None``, it returns the - nearest integer to its input. Delegates to ``number.__round__(ndigits)``. + Return *number* rounded to *ndigits* precision after the decimal + point. If *ndigits* is omitted or is ``None``, it returns the + nearest integer to its input. For the built-in types supporting :func:`round`, values are rounded to the closest multiple of 10 to the power minus *ndigits*; if two multiples are @@ -1245,6 +1245,9 @@ are always available. They are listed here in alphabetical order. negative). The return value is an integer if called with one argument, otherwise of the same type as *number*. + For a general Python object ``number``, ``round(number, ndigits)`` delegates to + ``number.__round__(ndigits)``. + .. note:: The behavior of :func:`round` for floats can be surprising: for example, From d1dbbaab01354f01faa696aff1280db3b349e354 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 29 Mar 2017 22:29:06 -0700 Subject: [PATCH 114/220] bpo-29917: DOC: Remove link from PyMethodDef (#890) (#895) (cherry picked from commit c3c7ef088583cc12bd218138036d1edb6de9c63f) --- Doc/c-api/structures.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index f48119391f2bbd..c080f317bee9d9 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -241,7 +241,7 @@ definition with the same method name. +==================+=============+===============================+ | :attr:`name` | char \* | name of the member | +------------------+-------------+-------------------------------+ - | :attr:`type` | int | the type of the member in the | + | :attr:`!type` | int | the type of the member in the | | | | C struct | +------------------+-------------+-------------------------------+ | :attr:`offset` | Py_ssize_t | the offset in bytes that the | @@ -256,7 +256,7 @@ definition with the same method name. | | | docstring | +------------------+-------------+-------------------------------+ - :attr:`type` can be one of many ``T_`` macros corresponding to various C + :attr:`!type` can be one of many ``T_`` macros corresponding to various C types. When the member is accessed in Python, it will be converted to the equivalent Python type. From 0fadf25e69f3de36b5deddecd9557addc8142fdf Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 29 Mar 2017 23:56:57 -0700 Subject: [PATCH 115/220] Remove an unrequired TODO in test_urllib2. (#897) (#901) (cherry picked from commit e6911a44f69c0d302db60f49952a9cf69da69a2b) --- Lib/test/test_urllib2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index eda7cccc6035a6..8c11b40daa099a 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1341,7 +1341,6 @@ def test_proxy_https_proxy_authorization(self): self.assertEqual(req.host, "proxy.example.com:3128") self.assertEqual(req.get_header("Proxy-authorization"), "FooBar") - # TODO: This should be only for OSX @unittest.skipUnless(sys.platform == 'darwin', "only relevant for OSX") def test_osx_proxy_bypass(self): bypass = { From c90ff1b78cb79bc3762184e03fa81f11984aaa45 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 30 Mar 2017 10:32:19 +0300 Subject: [PATCH 116/220] bpo-27863: Fixed multiple crashes in ElementTree. (#765) (#904) (cherry picked from commit 576def096ec7b64814e038f03290031f172886c3) --- Lib/test/test_xml_etree.py | 112 +++++++++++++++++++++++++++++++++++++ Misc/NEWS | 3 + Modules/_elementtree.c | 100 +++++++++++++++++---------------- 3 files changed, 167 insertions(+), 48 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 6c7616beae3ff9..5d0166a6a74af0 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1875,6 +1875,118 @@ def test_recursive_repr(self): with self.assertRaises(RuntimeError): repr(e) # Should not crash + def test_element_get_text(self): + # Issue #27863 + class X(str): + def __del__(self): + try: + elem.text + except NameError: + pass + + b = ET.TreeBuilder() + b.start('tag', {}) + b.data('ABCD') + b.data(X('EFGH')) + b.data('IJKL') + b.end('tag') + + elem = b.close() + self.assertEqual(elem.text, 'ABCDEFGHIJKL') + + def test_element_get_tail(self): + # Issue #27863 + class X(str): + def __del__(self): + try: + elem[0].tail + except NameError: + pass + + b = ET.TreeBuilder() + b.start('root', {}) + b.start('tag', {}) + b.end('tag') + b.data('ABCD') + b.data(X('EFGH')) + b.data('IJKL') + b.end('root') + + elem = b.close() + self.assertEqual(elem[0].tail, 'ABCDEFGHIJKL') + + def test_element_iter(self): + # Issue #27863 + state = { + 'tag': 'tag', + '_children': [None], # non-Element + 'attrib': 'attr', + 'tail': 'tail', + 'text': 'text', + } + + e = ET.Element('tag') + try: + e.__setstate__(state) + except AttributeError: + e.__dict__ = state + + it = e.iter() + self.assertIs(next(it), e) + self.assertRaises(AttributeError, next, it) + + def test_subscr(self): + # Issue #27863 + class X: + def __index__(self): + del e[:] + return 1 + + e = ET.Element('elem') + e.append(ET.Element('child')) + e[:X()] # shouldn't crash + + e.append(ET.Element('child')) + e[0:10:X()] # shouldn't crash + + def test_ass_subscr(self): + # Issue #27863 + class X: + def __index__(self): + e[:] = [] + return 1 + + e = ET.Element('elem') + for _ in range(10): + e.insert(0, ET.Element('child')) + + e[0:10:X()] = [] # shouldn't crash + + def test_treebuilder_start(self): + # Issue #27863 + def element_factory(x, y): + return [] + b = ET.TreeBuilder(element_factory=element_factory) + + b.start('tag', {}) + b.data('ABCD') + self.assertRaises(AttributeError, b.start, 'tag2', {}) + del b + gc_collect() + + def test_treebuilder_end(self): + # Issue #27863 + def element_factory(x, y): + return [] + b = ET.TreeBuilder(element_factory=element_factory) + + b.start('tag', {}) + b.data('ABCD') + self.assertRaises(AttributeError, b.end, 'tag') + del b + gc_collect() + + class MutatingElementPath(str): def __new__(cls, elem, *args): self = str.__new__(cls, *args) diff --git a/Misc/NEWS b/Misc/NEWS index 9a22010218f38b..749f3e34997a2c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,9 @@ Extension Modules Library ------- +- bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions + and wrong types. + - bpo-28699: Fixed a bug in pools in multiprocessing.pool that raising an exception at the very first of an iterable may swallow the exception or make the program hang. Patch by Davin Potts and Xiang Zhang. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index 7d50dd07a961f2..c800f92f70d766 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -155,7 +155,7 @@ deepcopy(PyObject* object, PyObject* memo) LOCAL(PyObject*) list_join(PyObject* list) { - /* join list elements (destroying the list in the process) */ + /* join list elements */ PyObject* joiner; PyObject* result; @@ -164,8 +164,6 @@ list_join(PyObject* list) return NULL; result = PyUnicode_Join(joiner, list); Py_DECREF(joiner); - if (result) - Py_DECREF(list); return result; } @@ -534,15 +532,17 @@ element_get_text(ElementObject* self) { /* return borrowed reference to text attribute */ - PyObject* res = self->text; + PyObject *res = self->text; if (JOIN_GET(res)) { res = JOIN_OBJ(res); if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) + PyObject *tmp = list_join(res); + if (!tmp) return NULL; - self->text = res; + self->text = tmp; + Py_DECREF(res); + res = tmp; } } @@ -554,15 +554,17 @@ element_get_tail(ElementObject* self) { /* return borrowed reference to text attribute */ - PyObject* res = self->tail; + PyObject *res = self->tail; if (JOIN_GET(res)) { res = JOIN_OBJ(res); if (PyList_CheckExact(res)) { - res = list_join(res); - if (!res) + PyObject *tmp = list_join(res); + if (!tmp) return NULL; - self->tail = res; + self->tail = tmp; + Py_DECREF(res); + res = tmp; } } @@ -2147,6 +2149,12 @@ elementiter_next(ElementIterObject *it) cur_parent = it->parent_stack->parent; child_index = it->parent_stack->child_index; if (cur_parent->extra && child_index < cur_parent->extra->length) { + if (!PyObject_TypeCheck(cur_parent->extra->children[child_index], &Element_Type)) { + PyErr_Format(PyExc_AttributeError, + "'%.100s' object has no attribute 'iter'", + Py_TYPE(cur_parent->extra->children[child_index])->tp_name); + return NULL; + } elem = (ElementObject *)cur_parent->extra->children[child_index]; it->parent_stack->child_index++; it->parent_stack = parent_stack_push_new(it->parent_stack, @@ -2435,40 +2443,51 @@ treebuilder_dealloc(TreeBuilderObject *self) /* helpers for handling of arbitrary element-like objects */ static int -treebuilder_set_element_text_or_tail(PyObject *element, PyObject *data, +treebuilder_set_element_text_or_tail(PyObject *element, PyObject **data, PyObject **dest, _Py_Identifier *name) { if (Element_CheckExact(element)) { - Py_DECREF(JOIN_OBJ(*dest)); - *dest = JOIN_SET(data, PyList_CheckExact(data)); + PyObject *tmp = JOIN_OBJ(*dest); + *dest = JOIN_SET(*data, PyList_CheckExact(*data)); + *data = NULL; + Py_DECREF(tmp); return 0; } else { - PyObject *joined = list_join(data); + PyObject *joined = list_join(*data); int r; if (joined == NULL) return -1; r = _PyObject_SetAttrId(element, name, joined); Py_DECREF(joined); - return r; + if (r < 0) + return -1; + Py_CLEAR(*data); + return 0; } } -/* These two functions steal a reference to data */ -static int -treebuilder_set_element_text(PyObject *element, PyObject *data) +LOCAL(int) +treebuilder_flush_data(TreeBuilderObject* self) { - _Py_IDENTIFIER(text); - return treebuilder_set_element_text_or_tail( - element, data, &((ElementObject *) element)->text, &PyId_text); -} + PyObject *element = self->last; -static int -treebuilder_set_element_tail(PyObject *element, PyObject *data) -{ - _Py_IDENTIFIER(tail); - return treebuilder_set_element_text_or_tail( - element, data, &((ElementObject *) element)->tail, &PyId_tail); + if (!self->data) { + return 0; + } + + if (self->this == element) { + _Py_IDENTIFIER(text); + return treebuilder_set_element_text_or_tail( + element, &self->data, + &((ElementObject *) element)->text, &PyId_text); + } + else { + _Py_IDENTIFIER(tail); + return treebuilder_set_element_text_or_tail( + element, &self->data, + &((ElementObject *) element)->tail, &PyId_tail); + } } static int @@ -2517,16 +2536,8 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, PyObject* this; elementtreestate *st = ET_STATE_GLOBAL; - if (self->data) { - if (self->this == self->last) { - if (treebuilder_set_element_text(self->last, self->data)) - return NULL; - } - else { - if (treebuilder_set_element_tail(self->last, self->data)) - return NULL; - } - self->data = NULL; + if (treebuilder_flush_data(self) < 0) { + return NULL; } if (self->element_factory && self->element_factory != Py_None) { @@ -2622,15 +2633,8 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) { PyObject* item; - if (self->data) { - if (self->this == self->last) { - if (treebuilder_set_element_text(self->last, self->data)) - return NULL; - } else { - if (treebuilder_set_element_tail(self->last, self->data)) - return NULL; - } - self->data = NULL; + if (treebuilder_flush_data(self) < 0) { + return NULL; } if (self->index == 0) { From 8b8bde44f3912d8b2df5591ffc31d2d8c6dcca6c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 30 Mar 2017 20:31:46 +0300 Subject: [PATCH 117/220] bpo-29935: Fixed error messages in the index() method of tuple, list and deque (#887) (#907) (#909) when pass indices of wrong type. (cherry picked from commit d4edfc9abffca965e76ebc5957a92031a4d6c4d4) (cherry picked from commit bf4bb2e43030661e568d5d4b046e8b9351cc164c) --- Include/ceval.h | 1 + Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 4 ++-- Objects/listobject.c | 4 ++-- Objects/tupleobject.c | 4 ++-- Python/ceval.c | 26 +++++++++++++++++++++----- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Include/ceval.h b/Include/ceval.h index b5373a9cc474f8..3f84b0658159ad 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -203,6 +203,7 @@ PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); +PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void); #endif diff --git a/Misc/NEWS b/Misc/NEWS index 749f3e34997a2c..e640622f0d86a1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-29935: Fixed error messages in the index() method of tuple, list and deque + when pass indices of wrong type. + - bpo-28876: ``bool(range)`` works even if ``len(range)`` raises :exc:`OverflowError`. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index ac81680e1bd710..08fcecad9adc00 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -913,8 +913,8 @@ deque_index(dequeobject *deque, PyObject *args) size_t start_state = deque->state; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(deque); diff --git a/Objects/listobject.c b/Objects/listobject.c index 815a1b9ea2d80b..e1e3cf018aaa7b 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2154,8 +2154,8 @@ listindex(PyListObject *self, PyObject *args) PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(self); diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 7920fec2bd86e8..48719454fe6537 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -515,8 +515,8 @@ tupleindex(PyTupleObject *self, PyObject *args) PyObject *v; if (!PyArg_ParseTuple(args, "O|O&O&:index", &v, - _PyEval_SliceIndex, &start, - _PyEval_SliceIndex, &stop)) + _PyEval_SliceIndexNotNone, &start, + _PyEval_SliceIndexNotNone, &stop)) return NULL; if (start < 0) { start += Py_SIZE(self); diff --git a/Python/ceval.c b/Python/ceval.c index 9ae8653f7e4e84..3070a90b43dbfb 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5098,14 +5098,10 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk) and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. Return 0 on error, 1 on success. */ -/* Note: If v is NULL, return success without storing into *pi. This - is because_PyEval_SliceIndex() is called by apply_slice(), which can be - called by the SLICE opcode with v and/or w equal to NULL. -*/ int _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) { - if (v != NULL) { + if (v != Py_None) { Py_ssize_t x; if (PyIndex_Check(v)) { x = PyNumber_AsSsize_t(v, NULL); @@ -5123,6 +5119,26 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi) return 1; } +int +_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi) +{ + Py_ssize_t x; + if (PyIndex_Check(v)) { + x = PyNumber_AsSsize_t(v, NULL); + if (x == -1 && PyErr_Occurred()) + return 0; + } + else { + PyErr_SetString(PyExc_TypeError, + "slice indices must be integers or " + "have an __index__ method"); + return 0; + } + *pi = x; + return 1; +} + + #define CANNOT_CATCH_MSG "catching classes that do not inherit from "\ "BaseException is not allowed" From 9273dfe1800fc7241d69f4d523d748ebd35b3801 Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Thu, 30 Mar 2017 12:48:55 -0700 Subject: [PATCH 118/220] bpo-29942: Fix the use of recursion in itertools.chain.from_iterable. (#912) Fix the use of recursion in itertools.chain.from_iterable. Using recursion is unnecessary, and can easily cause stack overflows, especially when building in low optimization modes or with Py_DEBUG enabled. (cherry picked from commit 5466d4af5fe76ec0a5fbc8a05675287d9e8e9d14) --- Lib/test/test_itertools.py | 8 ++++++ Misc/NEWS | 3 +++ Modules/itertoolsmodule.c | 52 ++++++++++++++++++++------------------ 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index e054303dedbe38..b8399fc1220cb6 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -1943,6 +1943,14 @@ def gen2(x): self.assertRaises(AssertionError, list, cycle(gen1())) self.assertEqual(hist, [0,1]) + def test_long_chain_of_empty_iterables(self): + # Make sure itertools.chain doesn't run into recursion limits when + # dealing with long chains of empty iterables. Even with a high + # number this would probably only fail in Py_DEBUG mode. + it = chain.from_iterable(() for unused in range(10000000)) + with self.assertRaises(StopIteration): + next(it) + class SubclassWithKwargsTest(unittest.TestCase): def test_keywords_in_subclass(self): # count is not subclassable... diff --git a/Misc/NEWS b/Misc/NEWS index e640622f0d86a1..0aefc7583bcb22 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering + long runs of empty iterables. + - bpo-27863: Fixed multiple crashes in ElementTree caused by race conditions and wrong types. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index be0f4982526f62..584dc6e7924341 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1854,33 +1854,37 @@ chain_next(chainobject *lz) { PyObject *item; - if (lz->source == NULL) - return NULL; /* already stopped */ - - if (lz->active == NULL) { - PyObject *iterable = PyIter_Next(lz->source); - if (iterable == NULL) { - Py_CLEAR(lz->source); - return NULL; /* no more input sources */ - } - lz->active = PyObject_GetIter(iterable); - Py_DECREF(iterable); + /* lz->source is the iterator of iterables. If it's NULL, we've already + * consumed them all. lz->active is the current iterator. If it's NULL, + * we should grab a new one from lz->source. */ + while (lz->source != NULL) { if (lz->active == NULL) { - Py_CLEAR(lz->source); - return NULL; /* input not iterable */ + PyObject *iterable = PyIter_Next(lz->source); + if (iterable == NULL) { + Py_CLEAR(lz->source); + return NULL; /* no more input sources */ + } + lz->active = PyObject_GetIter(iterable); + Py_DECREF(iterable); + if (lz->active == NULL) { + Py_CLEAR(lz->source); + return NULL; /* input not iterable */ + } } + item = (*Py_TYPE(lz->active)->tp_iternext)(lz->active); + if (item != NULL) + return item; + if (PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_StopIteration)) + PyErr_Clear(); + else + return NULL; /* input raised an exception */ + } + /* lz->active is consumed, try with the next iterable. */ + Py_CLEAR(lz->active); } - item = PyIter_Next(lz->active); - if (item != NULL) - return item; - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) - PyErr_Clear(); - else - return NULL; /* input raised an exception */ - } - Py_CLEAR(lz->active); - return chain_next(lz); /* recurse and use next active */ + /* Everything had been consumed already. */ + return NULL; } static PyObject * From 6356a3b7109c5c546c1e7be098170be194142f39 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Thu, 30 Mar 2017 23:15:56 -0700 Subject: [PATCH 119/220] Remove catching OSError in ftphandler test. Only URLError is raised in urllib.request module. (#918) (#921) (cherry picked from commit ed3dd1c02af6872bd0748f7b9a5dadb89f7b830f) --- Lib/test/test_urllib2.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 8c11b40daa099a..49e6c82d4339a8 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -826,7 +826,6 @@ def test_file(self): for url, ftp in [ ("file://ftp.example.com//foo.txt", False), ("file://ftp.example.com///foo.txt", False), -# XXXX bug: fails with OSError, should be URLError ("file://ftp.example.com/foo.txt", False), ("file://somehost//foo/something.txt", False), ("file://localhost//foo/something.txt", False), @@ -835,7 +834,7 @@ def test_file(self): try: h.file_open(req) # XXXX remove OSError when bug fixed - except (urllib.error.URLError, OSError): + except urllib.error.URLError: self.assertFalse(ftp) else: self.assertIs(o.req, req) @@ -1616,7 +1615,6 @@ def test_invalid_closed(self): self.assertTrue(conn.fakesock.closed, "Connection not closed") - class MiscTests(unittest.TestCase): def opener_has_handler(self, opener, handler_class): From f3158121132a1519439bf4c7dba3333b07802d6d Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Fri, 31 Mar 2017 15:43:35 +0900 Subject: [PATCH 120/220] bpo-29952: Use usual terminology of dict (GH-923) s/keys and elements/keys and values/ (cherry picked from commit cdcac039fb447f2ab04efcacbe663751bb2cb4ec) --- Doc/reference/expressions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 7c1f2a6dc2d39c..d4d007330c7972 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1195,7 +1195,7 @@ built-in types. true). * Mappings (instances of :class:`dict`) compare equal if and only if they have - equal `(key, value)` pairs. Equality comparison of the keys and elements + equal `(key, value)` pairs. Equality comparison of the keys and values enforces reflexivity. Order comparisons (``<``, ``>``, ``<=``, and ``>=``) raise :exc:`TypeError`. From 51fc7e3d6a29de7b3142e51f8caf4d31f7ac72a0 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 1 Apr 2017 20:00:41 -0700 Subject: [PATCH 121/220] bpo-26947: DOC: clarify wording on hashable in glossary (#948) (#958) (cherry picked from commit 64c887ab3a400cf91bde4f0c5ef69eacc88bc5e1) --- Doc/glossary.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/glossary.rst b/Doc/glossary.rst index 07b26a64b89c13..f474a6d8a71e95 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -434,9 +434,9 @@ Glossary Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally. - All of Python's immutable built-in objects are hashable, while no mutable - containers (such as lists or dictionaries) are. Objects which are - instances of user-defined classes are hashable by default; they all + All of Python's immutable built-in objects are hashable; mutable + containers (such as lists or dictionaries) are not. Objects which are + instances of user-defined classes are hashable by default. They all compare unequal (except with themselves), and their hash value is derived from their :func:`id`. From 553275d125478a6563dde7523f4f28c92f1861b4 Mon Sep 17 00:00:00 2001 From: "T. Wouters" Date: Sat, 1 Apr 2017 20:20:24 -0700 Subject: [PATCH 122/220] bpo-29941: Assert fixes (#886) (#956) Make a non-Py_DEBUG, asserts-enabled build of CPython possible. This means making sure helper functions are defined when NDEBUG is not defined, not just when Py_DEBUG is defined. Also fix a division-by-zero in obmalloc.c that went unnoticed because in Py_DEBUG mode, elsize is never zero. (cherry picked from commit a00c3fd12d421e41b769debd7df717d17b0deed5 and 06bb4873d6a9ac303701d08a851d6cd9a51e02a3) --- Include/unicodeobject.h | 4 ++++ Objects/obmalloc.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 0accc1d5c2ddad..59dcf736b1b2b3 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2263,6 +2263,10 @@ PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( PyAPI_FUNC(int) _PyUnicode_CheckConsistency( PyObject *op, int check_content); +#elif !defined(NDEBUG) +/* For asserts that call _PyUnicode_CheckConsistency(), which would + * otherwise be a problem when building with asserts but without Py_DEBUG. */ +#define _PyUnicode_CheckConsistency(op, check_content) PyUnicode_Check(op) #endif /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 7cc889f817b628..9dd8421a339482 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1176,7 +1176,7 @@ _PyObject_Alloc(int use_calloc, void *ctx, size_t nelem, size_t elsize) _Py_AllocatedBlocks++; - assert(nelem <= PY_SSIZE_T_MAX / elsize); + assert(elsize == 0 || nelem <= PY_SSIZE_T_MAX / elsize); nbytes = nelem * elsize; #ifdef WITH_VALGRIND @@ -2233,7 +2233,9 @@ _PyObject_DebugMallocStats(FILE *out) if (p->ref.count == 0) { /* currently unused */ +#ifdef Py_DEBUG assert(pool_is_in_list(p, arenas[i].freepools)); +#endif continue; } ++numpools[sz]; From 9881e02d690fd9638b7dff959640db51d297d151 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 2 Apr 2017 01:37:04 -0700 Subject: [PATCH 123/220] Minor spell fix and formatting fixes in urllib tests. (#959) (#960) (cherry picked from commit efbd4ea65dbb9f87b1afeec6a760802756badee5) --- Lib/test/test_urllib.py | 6 +++++- Lib/test/test_urllibnet.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 1772399803499a..1a28c9a21d14ab 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -206,6 +206,7 @@ def test_iter(self): def test_relativelocalfile(self): self.assertRaises(ValueError,urllib.request.urlopen,'./' + self.pathname) + class ProxyTests(unittest.TestCase): def setUp(self): @@ -259,6 +260,7 @@ def test_proxy_bypass_environment_host_match(self): self.assertFalse(bypass('newdomain.com')) # no port self.assertFalse(bypass('newdomain.com:1235')) # wrong port + class ProxyTests_withOrderedEnv(unittest.TestCase): def setUp(self): @@ -294,6 +296,7 @@ def test_getproxies_environment_prefer_lowercase(self): proxies = urllib.request.getproxies_environment() self.assertEqual('http://somewhere:3128', proxies['http']) + class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin): """Test urlopen() opening a fake http connection.""" @@ -432,7 +435,6 @@ def test_ftp_cache_pruning(self): finally: self.unfakeftp() - def test_userpass_inurl(self): self.fakehttp(b"HTTP/1.0 200 OK\r\n\r\nHello!") try: @@ -475,6 +477,7 @@ def test_cafile_and_context(self): "https://localhost", cafile="/nonexistent/path", context=context ) + class urlopen_DataTests(unittest.TestCase): """Test urlopen() opening a data URL.""" @@ -548,6 +551,7 @@ def test_invalid_base64_data(self): # missing padding character self.assertRaises(ValueError,urllib.request.urlopen,'data:;base64,Cg=') + class urlretrieve_FileTests(unittest.TestCase): """Test urllib.urlretrieve() on local files""" diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index b811930bbc7554..8379f1a512e94f 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -30,7 +30,7 @@ def testURLread(self): class urlopenNetworkTests(unittest.TestCase): - """Tests urllib.reqest.urlopen using the network. + """Tests urllib.request.urlopen using the network. These tests are not exhaustive. Assuming that testing using files does a good job overall of some of the basic interface features. There are no From 0f9ceaf322cc9358373167115fd4c21ab2d9ad50 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 3 Apr 2017 22:28:23 -0700 Subject: [PATCH 124/220] bpo-29725: DOC: add text for arraysize in sqlite3.Cursor (#947) (#986) (cherry picked from commit 02e12138000da834f23719521a011fa93763384d) --- Doc/library/sqlite3.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index 84a478352feb6d..1419ce0947ac29 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -633,6 +633,11 @@ Cursor Objects method. For operations other than ``INSERT`` or when :meth:`executemany` is called, :attr:`lastrowid` is set to :const:`None`. + .. attribute:: arraysize + + Read/write attribute that controls the number of rows returned by :meth:`fetchmany`. + The default value is 1 which means a single row would be fetched per call. + .. attribute:: description This read-only attribute provides the column names of the last query. To From 846bd39a9ca4fd95f0d3c12e2466f8c89c619944 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 5 Apr 2017 13:42:37 +0300 Subject: [PATCH 125/220] Miscellaneous minor fixes of Misc/NEWS formatting. (#1002) (#1006) (cherry picked from commit a0157b5f11e621f2196af4e918b9f07688a6cd1c) --- Misc/NEWS | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 0aefc7583bcb22..2e5904bdd96775 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -349,7 +349,7 @@ Library - Issue #28427: old keys should not remove new values from WeakValueDictionary when collecting from another thread. -- Issue 28923: Remove editor artifacts from Tix.py. +- Issue #28923: Remove editor artifacts from Tix.py. - Issue #28871: Fixed a crash when deallocate deep ElementTree. @@ -472,7 +472,7 @@ Library - Issue #27599: Fixed buffer overrun in binascii.b2a_qp() and binascii.a2b_qp(). -- Issue #19003:m email.generator now replaces only \r and/or \n line +- Issue #19003:m email.generator now replaces only ``\r`` and/or ``\n`` line endings, per the RFC, instead of all unicode line endings. - Issue #28019: itertools.count() no longer rounds non-integer step in range @@ -495,7 +495,7 @@ Library - Issue #27445: Don't pass str(_charset) to MIMEText.set_payload(). Patch by Claude Paroz. -- Issue #22450: urllib now includes an "Accept: */*" header among the +- Issue #22450: urllib now includes an ``Accept: */*`` header among the default headers. This makes the results of REST API requests more consistent and predictable especially when proxy servers are involved. @@ -510,7 +510,7 @@ Library characters, not on arbitrary unicode line breaks. This also fixes a bug in HTTP header parsing. -- Issue 27988: Fix email iter_attachments incorrect mutation of payload list. +- Issue #27988: Fix email iter_attachments incorrect mutation of payload list. - Issue #27691: Fix ssl module's parsing of GEN_RID subject alternative name fields in X.509 certs. @@ -961,7 +961,7 @@ Core and Builtins cookie names. - Issue #4806: Avoid masking the original TypeError exception when using star - (*) unpacking in function calls. Based on patch by Hagen Fürstenau and + (``*``) unpacking in function calls. Based on patch by Hagen Fürstenau and Daniel Urban. - Issue #27138: Fix the doc comment for FileFinder.find_spec(). @@ -1341,7 +1341,7 @@ Library - Issue #25672: In the ssl module, enable the SSL_MODE_RELEASE_BUFFERS mode option if it is safe to do so. -- Issue #26012: Don't traverse into symlinks for ** pattern in +- Issue #26012: Don't traverse into symlinks for ``**`` pattern in pathlib.Path.[r]glob(). - Issue #24120: Ignore PermissionError when traversing a tree with @@ -1751,7 +1751,7 @@ Library - Issue #25584: Added "escape" to the __all__ list in the glob module. -- Issue #25584: Fixed recursive glob() with patterns starting with '\*\*'. +- Issue #25584: Fixed recursive glob() with patterns starting with ``**``. - Issue #25446: Fix regression in smtplib's AUTH LOGIN support. @@ -3294,7 +3294,7 @@ Library - Issue #23521: Corrected pure python implementation of timedelta division. - * Eliminated OverflowError from timedelta * float for some floats; + * Eliminated OverflowError from ``timedelta * float`` for some floats; * Corrected rounding in timedlta true division. - Issue #21619: Popen objects no longer leave a zombie after exit in the with @@ -4093,7 +4093,7 @@ Library character instead of truncating it. Based on patch by Victor Stinner. - Issue #13968: The glob module now supports recursive search in - subdirectories using the "**" pattern. + subdirectories using the ``**`` pattern. - Issue #21951: Fixed a crash in Tkinter on AIX when called Tcl command with empty string or tuple argument. From 2d8bda5c1618e2917226635502fd5f15cdef123f Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Wed, 5 Apr 2017 06:52:53 -0700 Subject: [PATCH 126/220] correct parse_qs and parse_qsl test case descriptions. (#968) (#998) (cherry picked from commit 257b980b316a5206ecf6c23b958e2b7c4df4f3de) --- Lib/test/test_urlparse.py | 12 ++++++------ Lib/urllib/parse.py | 30 +++++++++++++++++------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py index 71abc147a6f9a2..8dac4b14102635 100644 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -6,8 +6,8 @@ RFC3986_BASE = 'http://a/b/c/d;p?q' SIMPLE_BASE = 'http://a/b/c/d' -# A list of test cases. Each test case is a two-tuple that contains -# a string with the query and a dictionary with the expected result. +# Each parse_qsl testcase is a two-tuple that contains +# a string with the query and a list with the expected result. parse_qsl_test_cases = [ ("", []), @@ -42,6 +42,9 @@ (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), ] +# Each parse_qs testcase is a two-tuple that contains +# a string with the query and a dictionary with the expected result. + parse_qs_test_cases = [ ("", {}), ("&", {}), @@ -290,7 +293,6 @@ def test_RFC2368(self): def test_RFC2396(self): # cases from RFC 2396 - self.checkJoin(RFC2396_BASE, 'g:h', 'g:h') self.checkJoin(RFC2396_BASE, 'g', 'http://a/b/c/g') self.checkJoin(RFC2396_BASE, './g', 'http://a/b/c/g') @@ -333,9 +335,7 @@ def test_RFC2396(self): # self.checkJoin(RFC2396_BASE, '/./g', 'http://a/./g') # self.checkJoin(RFC2396_BASE, '/../g', 'http://a/../g') - def test_RFC3986(self): - # Test cases from RFC3986 self.checkJoin(RFC3986_BASE, '?y','http://a/b/c/d;p?y') self.checkJoin(RFC3986_BASE, ';x', 'http://a/b/c/;x') self.checkJoin(RFC3986_BASE, 'g:h','g:h') @@ -363,7 +363,7 @@ def test_RFC3986(self): self.checkJoin(RFC3986_BASE, '../../g','http://a/g') self.checkJoin(RFC3986_BASE, '../../../g', 'http://a/g') - #Abnormal Examples + # Abnormal Examples # The 'abnormal scenarios' are incompatible with RFC2986 parsing # Tests are here for reference. diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 566fbf71888186..50641ba69bc83b 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -550,6 +550,7 @@ def unquote(string, encoding='utf-8', errors='replace'): append(bits[i + 1]) return ''.join(res) + def parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): """Parse a query given as a string argument. @@ -571,6 +572,8 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding and errors: specify how to decode percent-encoded sequences into Unicode characters, as accepted by the bytes.decode() method. + + Returns a dictionary. """ parsed_result = {} pairs = parse_qsl(qs, keep_blank_values, strict_parsing, @@ -582,28 +585,29 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False, parsed_result[name] = [value] return parsed_result + def parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace'): """Parse a query given as a string argument. - Arguments: + Arguments: - qs: percent-encoded query string to be parsed + qs: percent-encoded query string to be parsed - keep_blank_values: flag indicating whether blank values in - percent-encoded queries should be treated as blank strings. A - true value indicates that blanks should be retained as blank - strings. The default false value indicates that blank values - are to be ignored and treated as if they were not included. + keep_blank_values: flag indicating whether blank values in + percent-encoded queries should be treated as blank strings. + A true value indicates that blanks should be retained as blank + strings. The default false value indicates that blank values + are to be ignored and treated as if they were not included. - strict_parsing: flag indicating what to do with parsing errors. If - false (the default), errors are silently ignored. If true, - errors raise a ValueError exception. + strict_parsing: flag indicating what to do with parsing errors. If + false (the default), errors are silently ignored. If true, + errors raise a ValueError exception. - encoding and errors: specify how to decode percent-encoded sequences - into Unicode characters, as accepted by the bytes.decode() method. + encoding and errors: specify how to decode percent-encoded sequences + into Unicode characters, as accepted by the bytes.decode() method. - Returns a list, as G-d intended. + Returns a list, as G-d intended. """ qs, _coerce_result = _coerce_args(qs) pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] From 2cfe583ac8d3eaa98e3d2aca597577ce4787ca20 Mon Sep 17 00:00:00 2001 From: cocoatomo Date: Thu, 6 Apr 2017 23:00:15 +0900 Subject: [PATCH 127/220] [3.5] bpo-19225: Lack of c api exceptions doc (#965) * Keep the c-api exception doc up-to-date cherry-pick'ed from ec1f5df..e3d6db3 and fix conflict --- Doc/c-api/exceptions.rst | 201 ++++++++++++++++++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 146 insertions(+), 56 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index c389888b2bb01c..cf2385f3deb3c7 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -735,6 +735,60 @@ All standard Python exceptions are available as global variables whose names are :c:type:`PyObject\*`; they are all class objects. For completeness, here are all the variables: +.. index:: + single: PyExc_BaseException + single: PyExc_Exception + single: PyExc_ArithmeticError + single: PyExc_AssertionError + single: PyExc_AttributeError + single: PyExc_BlockingIOError + single: PyExc_BrokenPipeError + single: PyExc_BufferError + single: PyExc_ChildProcessError + single: PyExc_ConnectionAbortedError + single: PyExc_ConnectionError + single: PyExc_ConnectionRefusedError + single: PyExc_ConnectionResetError + single: PyExc_EOFError + single: PyExc_FileExistsError + single: PyExc_FileNotFoundError + single: PyExc_FloatingPointError + single: PyExc_GeneratorExit + single: PyExc_ImportError + single: PyExc_IndentationError + single: PyExc_IndexError + single: PyExc_InterruptedError + single: PyExc_IsADirectoryError + single: PyExc_KeyError + single: PyExc_KeyboardInterrupt + single: PyExc_LookupError + single: PyExc_MemoryError + single: PyExc_NameError + single: PyExc_NotADirectoryError + single: PyExc_NotImplementedError + single: PyExc_OSError + single: PyExc_OverflowError + single: PyExc_PermissionError + single: PyExc_ProcessLookupError + single: PyExc_RecursionError + single: PyExc_ReferenceError + single: PyExc_RuntimeError + single: PyExc_StopAsyncIteration + single: PyExc_StopIteration + single: PyExc_SyntaxError + single: PyExc_SystemError + single: PyExc_SystemExit + single: PyExc_TabError + single: PyExc_TimeoutError + single: PyExc_TypeError + single: PyExc_UnboundLocalError + single: PyExc_UnicodeDecodeError + single: PyExc_UnicodeEncodeError + single: PyExc_UnicodeError + single: PyExc_UnicodeTranslateError + single: PyExc_ValueError + single: PyExc_ZeroDivisionError + +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ @@ -744,8 +798,6 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | | @@ -754,26 +806,32 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BrokenPipeError` | :exc:`BrokenPipeError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | +| :c:data:`PyExc_BufferError` | :exc:`BufferError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | +| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionAbortedError` | :exc:`ConnectionAbortedError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionRefusedError` | :exc:`ConnectionRefusedError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ConnectionResetError` | :exc:`ConnectionResetError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FileExistsError` | :exc:`FileExistsError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FileNotFoundError` | :exc:`FileNotFoundError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_GeneratorExit` | :exc:`GeneratorExit` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ImportError` | :exc:`ImportError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_IndentationError` | :exc:`IndentationError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_IndexError` | :exc:`IndexError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_InterruptedError` | :exc:`InterruptedError` | | @@ -784,6 +842,8 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NameError` | :exc:`NameError` | | @@ -806,16 +866,32 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_StopAsyncIteration` | :exc:`StopAsyncIteration` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_StopIteration` | :exc:`StopIteration` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SystemError` | :exc:`SystemError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | -+-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TabError` | :exc:`TabError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_TypeError` | :exc:`TypeError` | | +-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnboundLocalError` | :exc:`UnboundLocalError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeDecodeError` | :exc:`UnicodeDecodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeEncodeError` | :exc:`UnicodeEncodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeError` | :exc:`UnicodeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeTranslateError` | :exc:`UnicodeTranslateError` | | ++-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ValueError` | :exc:`ValueError` | | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | @@ -832,11 +908,15 @@ the variables: and :c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`. .. versionadded:: 3.5 - :c:data:`PyExc_RecursionError`. - + :c:data:`PyExc_StopAsyncIteration` and :c:data:`PyExc_RecursionError`. These are compatibility aliases to :c:data:`PyExc_OSError`: +.. index:: + single: PyExc_EnvironmentError + single: PyExc_IOError + single: PyExc_WindowsError + +-------------------------------------+----------+ | C Name | Notes | +=====================================+==========+ @@ -850,52 +930,6 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: .. versionchanged:: 3.3 These aliases used to be separate exception types. - -.. index:: - single: PyExc_BaseException - single: PyExc_Exception - single: PyExc_ArithmeticError - single: PyExc_LookupError - single: PyExc_AssertionError - single: PyExc_AttributeError - single: PyExc_BlockingIOError - single: PyExc_BrokenPipeError - single: PyExc_ConnectionError - single: PyExc_ConnectionAbortedError - single: PyExc_ConnectionRefusedError - single: PyExc_ConnectionResetError - single: PyExc_EOFError - single: PyExc_FileExistsError - single: PyExc_FileNotFoundError - single: PyExc_FloatingPointError - single: PyExc_ImportError - single: PyExc_IndexError - single: PyExc_InterruptedError - single: PyExc_IsADirectoryError - single: PyExc_KeyError - single: PyExc_KeyboardInterrupt - single: PyExc_MemoryError - single: PyExc_NameError - single: PyExc_NotADirectoryError - single: PyExc_NotImplementedError - single: PyExc_OSError - single: PyExc_OverflowError - single: PyExc_PermissionError - single: PyExc_ProcessLookupError - single: PyExc_RecursionError - single: PyExc_ReferenceError - single: PyExc_RuntimeError - single: PyExc_SyntaxError - single: PyExc_SystemError - single: PyExc_SystemExit - single: PyExc_TimeoutError - single: PyExc_TypeError - single: PyExc_ValueError - single: PyExc_ZeroDivisionError - single: PyExc_EnvironmentError - single: PyExc_IOError - single: PyExc_WindowsError - Notes: (1) @@ -907,3 +941,58 @@ Notes: (3) Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. + +Standard Warnings +================= + +All standard Python warning categories are available as global variables whose +names are ``PyExc_`` followed by the Python exception name. These have the type +:c:type:`PyObject\*`; they are all class objects. For completeness, here are all +the variables: + +.. index:: + single: PyExc_Warning + single: PyExc_BytesWarning + single: PyExc_DepricationWarning + single: PyExc_FutureWarning + single: PyExc_ImportWarning + single: PyExc_PendingDeprecationWarning + single: PyExc_ResourceWarning + single: PyExc_RuntimeWarning + single: PyExc_SyntaxWarning + single: PyExc_UnicodeWarning + single: PyExc_UserWarning + ++------------------------------------------+---------------------------------+----------+ +| C Name | Python Name | Notes | ++==========================================+=================================+==========+ +| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_DeprecationWarning` | :exc:`DeprecationWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_FutureWarning` | :exc:`FutureWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ImportWarning` | :exc:`ImportWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_PendingDepricationWarning`| :exc:`PendingDeprecationWarning`| | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ResourceWarning` | :exc:`ResourceWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_RuntimeWarning` | :exc:`RuntimeWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_SyntaxWarning` | :exc:`SyntaxWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UnicodeWarning` | :exc:`UnicodeWarning` | | ++------------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_UserWarning` | :exc:`UserWarning` | | ++------------------------------------------+---------------------------------+----------+ + +.. versionadded:: 3.2 + :c:data:`PyExc_ResourceWarning`. + +Notes: + +(1) + This is a base class for other standard warning categories. diff --git a/Misc/ACKS b/Misc/ACKS index edfbb448bd9155..42790834da765f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -764,6 +764,7 @@ Jason Killen Jan Kim Taek Joo Kim Sam Kimbrel +Tomohiko Kinebuchi James King W. Trevor King Paul Kippes From 041e6006db57820dcd05f06bd15d26512c575841 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Fri, 7 Apr 2017 00:56:41 -0700 Subject: [PATCH 128/220] Remove Invalid comment in test_urllib2.py (#1021) (cherry picked from commit fd0cd07a5a3c964c084f4efc5bbcb89dd2193ee6) --- Lib/test/test_urllib2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 49e6c82d4339a8..3ed81ce5105119 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -833,7 +833,6 @@ def test_file(self): req = Request(url) try: h.file_open(req) - # XXXX remove OSError when bug fixed except urllib.error.URLError: self.assertFalse(ftp) else: From f688f180b21679c06d5258e88c688635ed719473 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 7 Apr 2017 16:50:20 -0400 Subject: [PATCH 129/220] Fix a minor typo. (#1032) (#1036) (cherry picked from commit dd9a0a14c89d57e43898d4b866b8c161e4ff8506) --- Doc/library/asyncio-protocol.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index e0d2b0f0b6e781..2e1a11bed7503b 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -381,7 +381,7 @@ The following callbacks are called on :class:`Protocol` instances: .. method:: Protocol.eof_received() - Calls when the other end signals it won't send any more data + Called when the other end signals it won't send any more data (for example by calling :meth:`write_eof`, if the other end also uses asyncio). From ae0915e42d8cd96e5ced1fc442ea078b4a59e82d Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Fri, 7 Apr 2017 23:24:51 +0100 Subject: [PATCH 130/220] Closes bpo-29939: suppress compiler warnings in _ctypes_test (#1039) Changed test code to suppress a compiler warning, while taking care to avoid the code being optimized out by the compiler. (cherry picked from commit 164d30eb1e66575dafee6af4fca4cbf52c7fbe6a) --- Modules/_ctypes/_ctypes_test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c index 20e65d2c1aef2b..e3240c526f7859 100644 --- a/Modules/_ctypes/_ctypes_test.c +++ b/Modules/_ctypes/_ctypes_test.c @@ -52,9 +52,9 @@ _testfunc_cbk_large_struct(Test in, void (*func)(Test)) EXPORT(void) _testfunc_large_struct_update_value(Test in) { - in.first = 0x0badf00d; - in.second = 0x0badf00d; - in.third = 0x0badf00d; + ((volatile Test *)&in)->first = 0x0badf00d; + ((volatile Test *)&in)->second = 0x0badf00d; + ((volatile Test *)&in)->third = 0x0badf00d; } EXPORT(void)testfunc_array(int values[4]) From fa25f16a4499178d7d79c18d2d68be7f70594106 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 8 Apr 2017 11:18:30 +0300 Subject: [PATCH 131/220] Expand the PySlice_GetIndicesEx macro. (#1023) (#1045) (cherry picked from commit b879fe82e7e5c3f7673c9a7fa4aad42bd05445d8) --- Modules/_ctypes/_ctypes.c | 10 ++++------ Modules/_elementtree.c | 12 ++++++------ Modules/_testbuffer.c | 7 ++++--- Modules/arraymodule.c | 11 ++++++----- Modules/mmapmodule.c | 9 ++++----- Objects/bytearrayobject.c | 12 ++++++------ Objects/bytesobject.c | 6 +++--- Objects/listobject.c | 10 ++++++---- Objects/memoryobject.c | 4 ++-- Objects/tupleobject.c | 6 +++--- Objects/unicodeobject.c | 5 +++-- 11 files changed, 47 insertions(+), 45 deletions(-) diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index b32a0ce9e81b4d..33fe659d45f88f 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -4279,11 +4279,10 @@ Array_subscript(PyObject *myself, PyObject *item) PyObject *np; Py_ssize_t start, stop, step, slicelen, cur, i; - if (PySlice_GetIndicesEx(item, - self->b_length, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); stgdict = PyObject_stgdict((PyObject *)self); assert(stgdict); /* Cannot be NULL for array object instances */ @@ -4420,11 +4419,10 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen, otherlen, i, cur; - if (PySlice_GetIndicesEx(item, - self->b_length, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->b_length, &start, &stop, step); if ((step < 0 && start < stop) || (step > 0 && start > stop)) stop = start; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index c800f92f70d766..0276452db4c337 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -1688,11 +1688,11 @@ element_subscr(PyObject* self_, PyObject* item) if (!self->extra) return PyList_New(0); - if (PySlice_GetIndicesEx(item, - self->extra->length, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, + step); if (slicelen <= 0) return PyList_New(0); @@ -1744,11 +1744,11 @@ element_ass_subscr(PyObject* self_, PyObject* item, PyObject* value) return -1; } - if (PySlice_GetIndicesEx(item, - self->extra->length, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->extra->length, &start, &stop, + step); if (value == NULL) { /* Delete slice */ diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c index 43db8a8e53a34a..0885a0333ebdaa 100644 --- a/Modules/_testbuffer.c +++ b/Modules/_testbuffer.c @@ -1714,10 +1714,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(key, base->shape[dim], - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(key, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); if (base->suboffsets == NULL || dim == 0) { @@ -1934,9 +1934,10 @@ slice_indices(PyObject *self, PyObject *args) "first argument must be a slice object"); return NULL; } - if (PySlice_GetIndicesEx(key, len, &s[0], &s[1], &s[2], &s[3]) < 0) { + if (PySlice_Unpack(key, &s[0], &s[1], &s[2]) < 0) { return NULL; } + s[3] = PySlice_AdjustIndices(len, &s[0], &s[1], s[2]); ret = PyTuple_New(4); if (ret == NULL) diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 8612847fcafe81..f615a690f31360 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2343,10 +2343,11 @@ array_subscr(arrayobject* self, PyObject* item) arrayobject* ar; int itemsize = self->ob_descr->itemsize; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (slicelength <= 0) { return newarrayobject(&Arraytype, 0, self->ob_descr); @@ -2414,11 +2415,11 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) return (*self->ob_descr->setitem)(self, i, value); } else if (PySlice_Check(item)) { - if (PySlice_GetIndicesEx(item, - Py_SIZE(self), &start, &stop, - &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); } else { PyErr_SetString(PyExc_TypeError, diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 4eb9274c665e7c..d80b1f63a06437 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -807,10 +807,10 @@ mmap_subscript(mmap_object *self, PyObject *item) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelen; - if (PySlice_GetIndicesEx(item, self->size, - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); if (slicelen <= 0) return PyBytes_FromStringAndSize("", 0); @@ -933,11 +933,10 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) Py_ssize_t start, stop, step, slicelen; Py_buffer vbuf; - if (PySlice_GetIndicesEx(item, - self->size, &start, &stop, - &step, &slicelen) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(self->size, &start, &stop, step); if (value == NULL) { PyErr_SetString(PyExc_TypeError, "mmap object doesn't support slice deletion"); diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 5132eba52bf5ac..85c6d1b748eff8 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -427,11 +427,11 @@ bytearray_subscript(PyByteArrayObject *self, PyObject *index) } else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; - if (PySlice_GetIndicesEx(index, - PyByteArray_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), + &start, &stop, step); if (slicelength <= 0) return PyByteArray_FromStringAndSize("", 0); @@ -657,11 +657,11 @@ bytearray_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *valu } } else if (PySlice_Check(index)) { - if (PySlice_GetIndicesEx(index, - PyByteArray_GET_SIZE(self), - &start, &stop, &step, &slicelen) < 0) { + if (PySlice_Unpack(index, &start, &stop, &step) < 0) { return -1; } + slicelen = PySlice_AdjustIndices(PyByteArray_GET_SIZE(self), &start, + &stop, step); } else { PyErr_Format(PyExc_TypeError, diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 8ede5f0c599671..77dd45e84af8e9 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1534,11 +1534,11 @@ bytes_subscript(PyBytesObject* self, PyObject* item) char* result_buf; PyObject* result; - if (PySlice_GetIndicesEx(item, - PyBytes_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyBytes_GET_SIZE(self), &start, + &stop, step); if (slicelength <= 0) { return PyBytes_FromStringAndSize("", 0); diff --git a/Objects/listobject.c b/Objects/listobject.c index e1e3cf018aaa7b..8100048561565a 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2421,10 +2421,11 @@ list_subscript(PyListObject* self, PyObject* item) PyObject* it; PyObject **src, **dest; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (slicelength <= 0) { return PyList_New(0); @@ -2470,10 +2471,11 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value) else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(item, Py_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(Py_SIZE(self), &start, &stop, + step); if (step == 1) return list_ass_slice(self, start, stop, value); diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index e261ee0cbfc8c3..45849be69c1fe2 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -2311,10 +2311,10 @@ init_slice(Py_buffer *base, PyObject *key, int dim) { Py_ssize_t start, stop, step, slicelength; - if (PySlice_GetIndicesEx(key, base->shape[dim], - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(key, &start, &stop, &step) < 0) { return -1; } + slicelength = PySlice_AdjustIndices(base->shape[dim], &start, &stop, step); if (base->suboffsets == NULL || dim == 0) { diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 48719454fe6537..19a6fed5cfc712 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -713,11 +713,11 @@ tuplesubscript(PyTupleObject* self, PyObject* item) PyObject* it; PyObject **src, **dest; - if (PySlice_GetIndicesEx(item, - PyTuple_GET_SIZE(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start, + &stop, step); if (slicelength <= 0) { return PyTuple_New(0); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 64a3760328f9fa..d7c9a34c39451b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13804,10 +13804,11 @@ unicode_subscript(PyObject* self, PyObject* item) int src_kind, dest_kind; Py_UCS4 ch, max_char, kind_limit; - if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), - &start, &stop, &step, &slicelength) < 0) { + if (PySlice_Unpack(item, &start, &stop, &step) < 0) { return NULL; } + slicelength = PySlice_AdjustIndices(PyUnicode_GET_LENGTH(self), + &start, &stop, step); if (slicelength <= 0) { _Py_RETURN_UNICODE_EMPTY(); From e63f8f293a96ceebf06de15b4e1c97dbbff0f6a8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 8 Apr 2017 11:26:03 +0300 Subject: [PATCH 132/220] bpo-29998: Pickling and copying ImportError now preserves name and path (#1010) (#1043) attributes. (cherry picked from commit b785396ab451b0c9d6ae9ee5a9e56c810209a6cb) --- Lib/test/test_exceptions.py | 20 ++++++++++++++++ Misc/NEWS | 3 +++ Objects/exceptions.c | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 96c3a48c317eb7..12cf7b84a7c2bd 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -1,5 +1,6 @@ # Python test set -- part 5, built-in exceptions +import copy import os import sys import unittest @@ -1120,6 +1121,25 @@ def test_non_str_argument(self): exc = ImportError(arg) self.assertEqual(str(arg), str(exc)) + def test_copy_pickle(self): + for kwargs in (dict(), + dict(name='somename'), + dict(path='somepath'), + dict(name='somename', path='somepath')): + orig = ImportError('test', **kwargs) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + exc = pickle.loads(pickle.dumps(orig, proto)) + self.assertEqual(exc.args, ('test',)) + self.assertEqual(exc.msg, 'test') + self.assertEqual(exc.name, orig.name) + self.assertEqual(exc.path, orig.path) + for c in copy.copy, copy.deepcopy: + exc = c(orig) + self.assertEqual(exc.args, ('test',)) + self.assertEqual(exc.msg, 'test') + self.assertEqual(exc.name, orig.name) + self.assertEqual(exc.path, orig.path) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index 2e5904bdd96775..49926830dcb3a6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-29998: Pickling and copying ImportError now preserves name and path + attributes. + - bpo-29942: Fix a crash in itertools.chain.from_iterable when encountering long runs of empty iterables. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 981ead2172a0ff..345a0fef70981d 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -692,6 +692,53 @@ ImportError_str(PyImportErrorObject *self) } } +static PyObject * +ImportError_getstate(PyImportErrorObject *self) +{ + PyObject *dict = ((PyBaseExceptionObject *)self)->dict; + if (self->name || self->path) { + _Py_IDENTIFIER(name); + _Py_IDENTIFIER(path); + dict = dict ? PyDict_Copy(dict) : PyDict_New(); + if (dict == NULL) + return NULL; + if (self->name && _PyDict_SetItemId(dict, &PyId_name, self->name) < 0) { + Py_DECREF(dict); + return NULL; + } + if (self->path && _PyDict_SetItemId(dict, &PyId_path, self->path) < 0) { + Py_DECREF(dict); + return NULL; + } + return dict; + } + else if (dict) { + Py_INCREF(dict); + return dict; + } + else { + Py_RETURN_NONE; + } +} + +/* Pickling support */ +static PyObject * +ImportError_reduce(PyImportErrorObject *self) +{ + PyObject *res; + PyObject *args; + PyObject *state = ImportError_getstate(self); + if (state == NULL) + return NULL; + args = ((PyBaseExceptionObject *)self)->args; + if (state == Py_None) + res = PyTuple_Pack(2, Py_TYPE(self), args); + else + res = PyTuple_Pack(3, Py_TYPE(self), args, state); + Py_DECREF(state); + return res; +} + static PyMemberDef ImportError_members[] = { {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0, PyDoc_STR("exception message")}, @@ -703,6 +750,7 @@ static PyMemberDef ImportError_members[] = { }; static PyMethodDef ImportError_methods[] = { + {"__reduce__", (PyCFunction)ImportError_reduce, METH_NOARGS}, {NULL} }; From c82d39479a88154bd72a3a304be5f473c118da95 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 9 Apr 2017 19:22:50 +1000 Subject: [PATCH 133/220] bpo-29798: Handle git worktree in patchcheck The original attempted fix missed an `isdir()` call in `get_base_branch()`. (cherry picked from commit 2abfdf5a81383d3b1ed6b7321903a9a168c373c5) --- Tools/scripts/patchcheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py index f4ec7d8a30ea23..33a9fead879325 100755 --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -70,7 +70,7 @@ def get_git_upstream_remote(): @status("Getting base branch for PR", info=lambda x: x if x is not None else "not a PR branch") def get_base_branch(): - if not os.path.isdir(os.path.join(SRCDIR, '.git')): + if not os.path.exists(os.path.join(SRCDIR, '.git')): # Not a git checkout, so there's no base branch return None version = sys.version_info From bd18351c31573ab9a8580677004370a774a4eaae Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 9 Apr 2017 20:57:15 +1000 Subject: [PATCH 134/220] bpo-29506: Clarify deep copy note in copy module The reference to administrative data was confusing to readers, so this simplifies the note to explain that deep copying may copy more then you intended, such as data that you expected to be shared between copies. (cherry picked from commit 19e04942562a980ad2519f6ff79c455a7472783b) --- Doc/library/copy.rst | 4 ++-- Misc/ACKS | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index d0b861d469bc05..2041d9175ea587 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -47,8 +47,8 @@ copy operations: * Recursive objects (compound objects that, directly or indirectly, contain a reference to themselves) may cause a recursive loop. -* Because deep copy copies *everything* it may copy too much, e.g., - even administrative data structures that should be shared even between copies. +* Because deep copy copies everything it may copy too much, such as data + which is intended to be shared between copies. The :func:`deepcopy` function avoids these problems by: diff --git a/Misc/ACKS b/Misc/ACKS index 42790834da765f..babd4950da6797 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -759,6 +759,7 @@ Lawrence Kesteloot Vivek Khera Dhiru Kholia Akshit Khurana +Sanyam Khurana Mads Kiilerich Jason Killen Jan Kim From d4489da36044b554921d6c566ed3c9f1013cb97e Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 9 Apr 2017 10:14:48 -0700 Subject: [PATCH 135/220] Remove invalid comment in urllib.request.(#1056) (cherry picked from commit a2a9ddd923a849124bdd1c484f70f02df6fde0e9) --- Lib/urllib/request.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index a46c6894935757..0cd03332b0e972 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1594,14 +1594,10 @@ def pathname2url(pathname): of the 'file' scheme; not recommended for general use.""" return quote(pathname) -# This really consists of two pieces: -# (1) a class which handles opening of all sorts of URLs -# (plus assorted utilities etc.) -# (2) a set of functions for parsing URLs -# XXX Should these be separated out into different modules? - ftpcache = {} + + class URLopener: """Class to open URLs. This is a class rather than just a subroutine because we may need From aa218af34494230e8f258b3ed4f9cf5070225a92 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 9 Apr 2017 15:16:14 -0700 Subject: [PATCH 136/220] [3.5] Correct typo in configparser.rst (GH-1012) (GH-1027) (cherry picked from commit 01fa9ae5460b00bf1ced500c797176ebd3fb060d) --- Doc/library/configparser.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index e09562dc9046c7..6f1c55e2351aa1 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -34,8 +34,8 @@ can be customized by end users easily. .. seealso:: Module :mod:`shlex` - Support for a creating Unix shell-like mini-languages which can be used - as an alternate format for application configuration files. + Support for creating Unix shell-like mini-languages which can be used as + an alternate format for application configuration files. Module :mod:`json` The json module implements a subset of JavaScript syntax which can also From 1adca396766d318981c0a4b98d9cff2661a57735 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 9 Apr 2017 20:38:00 -0700 Subject: [PATCH 137/220] Remove OSError related comment in urllib.request. (#1071) (cherry picked from commit 6dfcc81f6b1c82a71a1c876e14424fb8b3573447) --- Lib/urllib/request.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 0cd03332b0e972..e98be0cde1d355 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1424,7 +1424,6 @@ def open_local_file(self, req): origurl = 'file://' + filename return addinfourl(open(localfile, 'rb'), headers, origurl) except OSError as exp: - # users shouldn't expect OSErrors coming from urlopen() raise URLError(exp) raise URLError('file not on local host') From 72b1d419ac5f7cd9ef82ffd2ffe21aa9b34e21d2 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Thu, 13 Apr 2017 11:37:38 +0800 Subject: [PATCH 138/220] bpo-26985: Add missing info of code object in inspect documentation (GH-1090) (GH-1100) --- Doc/library/inspect.rst | 379 +++++++++++++++++++++------------------- Lib/inspect.py | 30 ++-- Misc/NEWS | 2 + 3 files changed, 220 insertions(+), 191 deletions(-) diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index 9526a0d59dabb5..16e33f0f724102 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -34,185 +34,198 @@ provided as convenient choices for the second argument to :func:`getmembers`. They also help you determine when you can expect to find the following special attributes: -+-----------+-----------------+---------------------------+ -| Type | Attribute | Description | -+===========+=================+===========================+ -| module | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __file__ | filename (missing for | -| | | built-in modules) | -+-----------+-----------------+---------------------------+ -| class | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | class was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __module__ | name of module in which | -| | | this class was defined | -+-----------+-----------------+---------------------------+ -| method | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | method was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __func__ | function object | -| | | containing implementation | -| | | of method | -+-----------+-----------------+---------------------------+ -| | __self__ | instance to which this | -| | | method is bound, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ -| function | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | name with which this | -| | | function was defined | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __code__ | code object containing | -| | | compiled function | -| | | :term:`bytecode` | -+-----------+-----------------+---------------------------+ -| | __defaults__ | tuple of any default | -| | | values for positional or | -| | | keyword parameters | -+-----------+-----------------+---------------------------+ -| | __kwdefaults__ | mapping of any default | -| | | values for keyword-only | -| | | parameters | -+-----------+-----------------+---------------------------+ -| | __globals__ | global namespace in which | -| | | this function was defined | -+-----------+-----------------+---------------------------+ -| | __annotations__ | mapping of parameters | -| | | names to annotations; | -| | | ``"return"`` key is | -| | | reserved for return | -| | | annotations. | -+-----------+-----------------+---------------------------+ -| traceback | tb_frame | frame object at this | -| | | level | -+-----------+-----------------+---------------------------+ -| | tb_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-----------------+---------------------------+ -| | tb_lineno | current line number in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | tb_next | next inner traceback | -| | | object (called by this | -| | | level) | -+-----------+-----------------+---------------------------+ -| frame | f_back | next outer frame object | -| | | (this frame's caller) | -+-----------+-----------------+---------------------------+ -| | f_builtins | builtins namespace seen | -| | | by this frame | -+-----------+-----------------+---------------------------+ -| | f_code | code object being | -| | | executed in this frame | -+-----------+-----------------+---------------------------+ -| | f_globals | global namespace seen by | -| | | this frame | -+-----------+-----------------+---------------------------+ -| | f_lasti | index of last attempted | -| | | instruction in bytecode | -+-----------+-----------------+---------------------------+ -| | f_lineno | current line number in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | f_locals | local namespace seen by | -| | | this frame | -+-----------+-----------------+---------------------------+ -| | f_restricted | 0 or 1 if frame is in | -| | | restricted execution mode | -+-----------+-----------------+---------------------------+ -| | f_trace | tracing function for this | -| | | frame, or ``None`` | -+-----------+-----------------+---------------------------+ -| code | co_argcount | number of arguments (not | -| | | including \* or \*\* | -| | | args) | -+-----------+-----------------+---------------------------+ -| | co_code | string of raw compiled | -| | | bytecode | -+-----------+-----------------+---------------------------+ -| | co_consts | tuple of constants used | -| | | in the bytecode | -+-----------+-----------------+---------------------------+ -| | co_filename | name of file in which | -| | | this code object was | -| | | created | -+-----------+-----------------+---------------------------+ -| | co_firstlineno | number of first line in | -| | | Python source code | -+-----------+-----------------+---------------------------+ -| | co_flags | bitmap of ``CO_*`` flags, | -| | | read more :ref:`here | -| | | `| -+-----------+-----------------+---------------------------+ -| | co_lnotab | encoded mapping of line | -| | | numbers to bytecode | -| | | indices | -+-----------+-----------------+---------------------------+ -| | co_name | name with which this code | -| | | object was defined | -+-----------+-----------------+---------------------------+ -| | co_names | tuple of names of local | -| | | variables | -+-----------+-----------------+---------------------------+ -| | co_nlocals | number of local variables | -+-----------+-----------------+---------------------------+ -| | co_stacksize | virtual machine stack | -| | | space required | -+-----------+-----------------+---------------------------+ -| | co_varnames | tuple of names of | -| | | arguments and local | -| | | variables | -+-----------+-----------------+---------------------------+ -| generator | __name__ | name | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | gi_frame | frame | -+-----------+-----------------+---------------------------+ -| | gi_running | is the generator running? | -+-----------+-----------------+---------------------------+ -| | gi_code | code | -+-----------+-----------------+---------------------------+ -| | gi_yieldfrom | object being iterated by | -| | | ``yield from``, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ -| coroutine | __name__ | name | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | cr_await | object being awaited on, | -| | | or ``None`` | -+-----------+-----------------+---------------------------+ -| | cr_frame | frame | -+-----------+-----------------+---------------------------+ -| | cr_running | is the coroutine running? | -+-----------+-----------------+---------------------------+ -| | cr_code | code | -+-----------+-----------------+---------------------------+ -| builtin | __doc__ | documentation string | -+-----------+-----------------+---------------------------+ -| | __name__ | original name of this | -| | | function or method | -+-----------+-----------------+---------------------------+ -| | __qualname__ | qualified name | -+-----------+-----------------+---------------------------+ -| | __self__ | instance to which a | -| | | method is bound, or | -| | | ``None`` | -+-----------+-----------------+---------------------------+ ++-----------+-------------------+---------------------------+ +| Type | Attribute | Description | ++===========+===================+===========================+ +| module | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __file__ | filename (missing for | +| | | built-in modules) | ++-----------+-------------------+---------------------------+ +| class | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | class was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __module__ | name of module in which | +| | | this class was defined | ++-----------+-------------------+---------------------------+ +| method | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | method was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __func__ | function object | +| | | containing implementation | +| | | of method | ++-----------+-------------------+---------------------------+ +| | __self__ | instance to which this | +| | | method is bound, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ +| function | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | name with which this | +| | | function was defined | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __code__ | code object containing | +| | | compiled function | +| | | :term:`bytecode` | ++-----------+-------------------+---------------------------+ +| | __defaults__ | tuple of any default | +| | | values for positional or | +| | | keyword parameters | ++-----------+-------------------+---------------------------+ +| | __kwdefaults__ | mapping of any default | +| | | values for keyword-only | +| | | parameters | ++-----------+-------------------+---------------------------+ +| | __globals__ | global namespace in which | +| | | this function was defined | ++-----------+-------------------+---------------------------+ +| | __annotations__ | mapping of parameters | +| | | names to annotations; | +| | | ``"return"`` key is | +| | | reserved for return | +| | | annotations. | ++-----------+-------------------+---------------------------+ +| traceback | tb_frame | frame object at this | +| | | level | ++-----------+-------------------+---------------------------+ +| | tb_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------+-------------------+---------------------------+ +| | tb_lineno | current line number in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | tb_next | next inner traceback | +| | | object (called by this | +| | | level) | ++-----------+-------------------+---------------------------+ +| frame | f_back | next outer frame object | +| | | (this frame's caller) | ++-----------+-------------------+---------------------------+ +| | f_builtins | builtins namespace seen | +| | | by this frame | ++-----------+-------------------+---------------------------+ +| | f_code | code object being | +| | | executed in this frame | ++-----------+-------------------+---------------------------+ +| | f_globals | global namespace seen by | +| | | this frame | ++-----------+-------------------+---------------------------+ +| | f_lasti | index of last attempted | +| | | instruction in bytecode | ++-----------+-------------------+---------------------------+ +| | f_lineno | current line number in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | f_locals | local namespace seen by | +| | | this frame | ++-----------+-------------------+---------------------------+ +| | f_restricted | 0 or 1 if frame is in | +| | | restricted execution mode | ++-----------+-------------------+---------------------------+ +| | f_trace | tracing function for this | +| | | frame, or ``None`` | ++-----------+-------------------+---------------------------+ +| code | co_argcount | number of arguments (not | +| | | including keyword only | +| | | arguments, \* or \*\* | +| | | args) | ++-----------+-------------------+---------------------------+ +| | co_code | string of raw compiled | +| | | bytecode | ++-----------+-------------------+---------------------------+ +| | co_cellvars | tuple of names of cell | +| | | variables (referenced by | +| | | containing scopes) | ++-----------+-------------------+---------------------------+ +| | co_consts | tuple of constants used | +| | | in the bytecode | ++-----------+-------------------+---------------------------+ +| | co_filename | name of file in which | +| | | this code object was | +| | | created | ++-----------+-------------------+---------------------------+ +| | co_firstlineno | number of first line in | +| | | Python source code | ++-----------+-------------------+---------------------------+ +| | co_flags | bitmap of ``CO_*`` flags, | +| | | read more :ref:`here | +| | | `| ++-----------+-------------------+---------------------------+ +| | co_lnotab | encoded mapping of line | +| | | numbers to bytecode | +| | | indices | ++-----------+-------------------+---------------------------+ +| | co_freevars | tuple of names of free | +| | | variables (referenced via | +| | | a function's closure) | ++-----------+-------------------+---------------------------+ +| | co_kwonlyargcount | number of keyword only | +| | | arguments (not including | +| | | \*\* arg) | ++-----------+-------------------+---------------------------+ +| | co_name | name with which this code | +| | | object was defined | ++-----------+-------------------+---------------------------+ +| | co_names | tuple of names of local | +| | | variables | ++-----------+-------------------+---------------------------+ +| | co_nlocals | number of local variables | ++-----------+-------------------+---------------------------+ +| | co_stacksize | virtual machine stack | +| | | space required | ++-----------+-------------------+---------------------------+ +| | co_varnames | tuple of names of | +| | | arguments and local | +| | | variables | ++-----------+-------------------+---------------------------+ +| generator | __name__ | name | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | gi_frame | frame | ++-----------+-------------------+---------------------------+ +| | gi_running | is the generator running? | ++-----------+-------------------+---------------------------+ +| | gi_code | code | ++-----------+-------------------+---------------------------+ +| | gi_yieldfrom | object being iterated by | +| | | ``yield from``, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ +| coroutine | __name__ | name | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | cr_await | object being awaited on, | +| | | or ``None`` | ++-----------+-------------------+---------------------------+ +| | cr_frame | frame | ++-----------+-------------------+---------------------------+ +| | cr_running | is the coroutine running? | ++-----------+-------------------+---------------------------+ +| | cr_code | code | ++-----------+-------------------+---------------------------+ +| builtin | __doc__ | documentation string | ++-----------+-------------------+---------------------------+ +| | __name__ | original name of this | +| | | function or method | ++-----------+-------------------+---------------------------+ +| | __qualname__ | qualified name | ++-----------+-------------------+---------------------------+ +| | __self__ | instance to which a | +| | | method is bound, or | +| | | ``None`` | ++-----------+-------------------+---------------------------+ .. versionchanged:: 3.5 @@ -1238,6 +1251,10 @@ Code Objects Bit Flags Python code objects have a ``co_flags`` attribute, which is a bitmap of the following flags: +.. data:: CO_OPTIMIZED + + The code object is optimized, using fast locals. + .. data:: CO_NEWLOCALS If set, a new dict will be created for the frame's ``f_locals`` when @@ -1251,6 +1268,10 @@ the following flags: The code object has a variable keyword parameter (``**kwargs``-like). +.. data:: CO_NESTED + + The flag is set when the code object is a nested function. + .. data:: CO_GENERATOR The flag is set when the code object is a generator function, i.e. diff --git a/Lib/inspect.py b/Lib/inspect.py index 9f9fcfef47c160..4a11006746acb4 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -241,18 +241,24 @@ def iscode(object): """Return true if the object is a code object. Code objects provide these attributes: - co_argcount number of arguments (not including * or ** args) - co_code string of raw compiled bytecode - co_consts tuple of constants used in the bytecode - co_filename name of file in which this code object was created - co_firstlineno number of first line in Python source code - co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg - co_lnotab encoded mapping of line numbers to bytecode indices - co_name name with which this code object was defined - co_names tuple of names of local variables - co_nlocals number of local variables - co_stacksize virtual machine stack space required - co_varnames tuple of names of arguments and local variables""" + co_argcount number of arguments (not including *, ** args + or keyword only arguments) + co_code string of raw compiled bytecode + co_cellvars tuple of names of cell variables + co_consts tuple of constants used in the bytecode + co_filename name of file in which this code object was created + co_firstlineno number of first line in Python source code + co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg + | 16=nested | 32=generator | 64=nofree | 128=coroutine + | 256=iterable_coroutine + co_freevars tuple of names of free variables + co_kwonlyargcount number of keyword only arguments (not including ** arg) + co_lnotab encoded mapping of line numbers to bytecode indices + co_name name with which this code object was defined + co_names tuple of names of local variables + co_nlocals number of local variables + co_stacksize virtual machine stack space required + co_varnames tuple of names of arguments and local variables""" return isinstance(object, types.CodeType) def isbuiltin(object): diff --git a/Misc/NEWS b/Misc/NEWS index 49926830dcb3a6..fd3814ca1fa543 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -163,6 +163,8 @@ C API Documentation ------------- +- bpo-26985: Add missing info of code object in inspect documentation. + - bpo-28929: Link the documentation to its source file on GitHub. - bpo-25008: Document smtpd.py as effectively deprecated and add a pointer to From f3972dd1c1c514ed26bb8139b59b649fa7983743 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 12 Apr 2017 20:46:07 -0700 Subject: [PATCH 139/220] [3.5] Remove superfluous comment in urllib.error. (GH-1076) (GH-1102) (cherry picked from commit 6fab78e9027f9ebd6414995580781b480433e595) --- Lib/urllib/error.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/urllib/error.py b/Lib/urllib/error.py index c5b675d16188b8..851515bc307d62 100644 --- a/Lib/urllib/error.py +++ b/Lib/urllib/error.py @@ -16,10 +16,6 @@ __all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] -# do these error classes make sense? -# make sure all of the OSError stuff is overridden. we just want to be -# subtypes. - class URLError(OSError): # URLError is a sub-type of OSError, but it doesn't share any of # the implementation. need to override __init__ and __str__. From c0f4240fac397e1cdd1ee202fc1ce6eb23037d06 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 12 Apr 2017 21:05:25 -0700 Subject: [PATCH 140/220] [3.5] Clarify exception handler scope in contextlib (GH-1104) Moved explicit raise from inside try to try...else. (cherry picked from commit 680e20beee8bbce9f857b8e7795009191f98b0ba) --- Lib/contextlib.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 4a7bd079a7dbb8..c0188952ad701e 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -75,7 +75,6 @@ def __exit__(self, type, value, traceback): value = type() try: self.gen.throw(type, value, traceback) - raise RuntimeError("generator didn't stop after throw()") except StopIteration as exc: # Suppress StopIteration *unless* it's the same exception that # was passed to throw(). This prevents a StopIteration @@ -101,6 +100,8 @@ def __exit__(self, type, value, traceback): # if sys.exc_info()[1] is not value: raise + else: + raise RuntimeError("generator didn't stop after throw()") def contextmanager(func): From 4d015a40a7b9c3c1b8cfbe81453187d700a43163 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 03:14:53 -0700 Subject: [PATCH 141/220] [3.5] bpo-29692: contextlib.contextmanager may incorrectly unchain RuntimeError (GH-949) (#1107) contextlib._GeneratorContextManager.__exit__ includes a special case to deal with PEP 479 RuntimeErrors created when `StopIteration` is thrown into the context manager body. Previously this check was too permissive, and undid one level of chaining on *all* RuntimeError instances, not just those that wrapped a StopIteration instance. (cherry picked from commit 00c75e9a45ff0366c185e9e8a2e23af5a35481b0) --- Lib/contextlib.py | 12 ++++++------ Lib/test/test_contextlib.py | 23 +++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index c0188952ad701e..5371a9f3319221 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -65,7 +65,7 @@ def __exit__(self, type, value, traceback): try: next(self.gen) except StopIteration: - return + return False else: raise RuntimeError("generator didn't stop") else: @@ -87,7 +87,7 @@ def __exit__(self, type, value, traceback): # Likewise, avoid suppressing if a StopIteration exception # was passed to throw() and later wrapped into a RuntimeError # (see PEP 479). - if exc.__cause__ is value: + if type is StopIteration and exc.__cause__ is value: return False raise except: @@ -98,10 +98,10 @@ def __exit__(self, type, value, traceback): # fixes the impedance mismatch between the throw() protocol # and the __exit__() protocol. # - if sys.exc_info()[1] is not value: - raise - else: - raise RuntimeError("generator didn't stop after throw()") + if sys.exc_info()[1] is value: + return False + raise + raise RuntimeError("generator didn't stop after throw()") def contextmanager(func): diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 516403ef655b9e..ad1b6cd787f88a 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -119,6 +119,29 @@ def woohoo(): else: self.fail('StopIteration was suppressed') + def test_contextmanager_do_not_unchain_non_stopiteration_exceptions(self): + @contextmanager + def test_issue29692(): + try: + yield + except Exception as exc: + raise RuntimeError('issue29692:Chained') from exc + try: + with test_issue29692(): + raise ZeroDivisionError + except Exception as ex: + self.assertIs(type(ex), RuntimeError) + self.assertEqual(ex.args[0], 'issue29692:Chained') + self.assertIsInstance(ex.__cause__, ZeroDivisionError) + + try: + with test_issue29692(): + raise StopIteration('issue29692:Unchained') + except Exception as ex: + self.assertIs(type(ex), StopIteration) + self.assertEqual(ex.args[0], 'issue29692:Unchained') + self.assertIsNone(ex.__cause__) + def _create_contextmanager_attribs(self): def attribs(**kw): def decorate(func): diff --git a/Misc/NEWS b/Misc/NEWS index fd3814ca1fa543..0caeefdfff45a8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -48,6 +48,9 @@ Extension Modules Library ------- +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. + Patch by Siddharth Velankar. - bpo-29998: Pickling and copying ImportError now preserves name and path attributes. From df9783720e40773e7854d2f4e4cfc93f0a2c08b8 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 13 Apr 2017 16:16:30 +0300 Subject: [PATCH 142/220] bpo-29791: Clarify that flush is keyword-only argument (GH-1093) Reported by Lucio Ricardo Montero Valenzuela. (cherry picked from commit 61b9ac93712df8092a25223cd56fa6528359792b) --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index ff8c7b83bbddc8..80b53263c8b53f 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1104,7 +1104,7 @@ are always available. They are listed here in alphabetical order. .. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) Print *objects* to the text stream *file*, separated by *sep* and followed - by *end*. *sep*, *end* and *file*, if present, must be given as keyword + by *end*. *sep*, *end*, *file* and *flush*, if present, must be given as keyword arguments. All non-keyword arguments are converted to strings like :func:`str` does and From e2cf9a918439006fb27f67c1939d0370886650e7 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 13 Apr 2017 19:41:26 +0300 Subject: [PATCH 143/220] bpo-30021: Add examples for re.escape(). (#1048) (#1116) And fix the parameter name. (cherry picked from commit 8fc7bc2b7631ee819ee614e47b6f44bacebe1574) --- Doc/library/re.rst | 17 ++++++++++++++--- Doc/tools/susp-ignored.csv | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst index 6baac6f53d898c..d33fff8ef3217b 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -771,11 +771,22 @@ form. Unmatched groups are replaced with an empty string. -.. function:: escape(string) +.. function:: escape(pattern) - Escape all the characters in pattern except ASCII letters, numbers and ``'_'``. + Escape all the characters in *pattern* except ASCII letters, numbers and ``'_'``. This is useful if you want to match an arbitrary literal string that may - have regular expression metacharacters in it. + have regular expression metacharacters in it. For example:: + + >>> print(re.escape('python.exe')) + python\.exe + + >>> legal_chars = string.ascii_lowercase + string.digits + "!#$%&'*+-.^_`|~:" + >>> print('[%s]+' % re.escape(legal_chars)) + [abcdefghijklmnopqrstuvwxyz0123456789\!\#\$\%\&\'\*\+\-\.\^_\`\|\~\:]+ + + >>> operators = ['+', '-', '*', '/', '**'] + >>> print('|'.join(map(re.escape, sorted(operators, reverse=True)))) + \/|\-|\+|\*\*|\* .. versionchanged:: 3.3 The ``'_'`` character is no longer escaped. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index dba93bf3a72b3e..c1dcf42a28afa8 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -274,6 +274,8 @@ whatsnew/3.2,,:location,zope9-location = ${zope9:location} whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf whatsnew/changelog,,:gz,": TarFile opened with external fileobj and ""w:gz"" mode didn't" whatsnew/changelog,,::,": Use ""127.0.0.1"" or ""::1"" instead of ""localhost"" as much as" +library/re,,`,!#$%&'*+-.^_`|~: +library/re,,`,\!\#\$\%\&\'\*\+\-\.\^_\`\|\~\: library/tarfile,149,:xz,'x:xz' library/xml.etree.elementtree,290,:sometag,prefix:sometag library/xml.etree.elementtree,301,:fictional," Date: Thu, 13 Apr 2017 16:38:17 -0700 Subject: [PATCH 144/220] [3.5] Fix a typo in Doc/library/functions.rst (GH-1117) (GH-1124) Replace `For object's ... ` with `For objects ...` (cherry picked from commit 873ef20d0007b4b120933473e6252d2309a70102) --- Doc/library/functions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 80b53263c8b53f..d6fa35a5ccb98c 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -604,7 +604,7 @@ are always available. They are listed here in alphabetical order. .. note:: - For object's with custom :meth:`__hash__` methods, note that :func:`hash` + For objects with custom :meth:`__hash__` methods, note that :func:`hash` truncates the return value based on the bit width of the host machine. See :meth:`__hash__` for details. From d7abeb7024b9755c291c29bdc8c4494246e975ad Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 13 Apr 2017 19:26:24 -0700 Subject: [PATCH 145/220] [3.5] bpo-29694: race condition in pathlib mkdir with flags parents=True (GH-1089). (GH-1127) (cherry picked from commit 22a594a0047d7706537ff2ac676cdc0f1dcb329c) --- Lib/pathlib.py | 4 ++-- Lib/test/test_pathlib.py | 30 ++++++++++++++++++++++++++++++ Misc/NEWS | 4 ++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 16b99cddbc7183..29914b97e7f4f3 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1217,8 +1217,8 @@ def mkdir(self, mode=0o777, parents=False, exist_ok=False): except FileNotFoundError: if not parents or self.parent == self: raise - self.parent.mkdir(parents=True) - self._accessor.mkdir(self, mode) + self.parent.mkdir(parents=True, exist_ok=True) + self.mkdir(mode, parents=False, exist_ok=exist_ok) except OSError: # Cannot rely on checking for EEXIST, since the operating system # could give priority to other errors like EACCES or EROFS diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 86d3077d5c4458..5e0708ae73b0f8 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -8,6 +8,7 @@ import stat import tempfile import unittest +from unittest import mock from test import support TESTFN = support.TESTFN @@ -1767,6 +1768,35 @@ def test_mkdir_no_parents_file(self): p.mkdir(exist_ok=True) self.assertEqual(cm.exception.errno, errno.EEXIST) + def test_mkdir_concurrent_parent_creation(self): + for pattern_num in range(32): + p = self.cls(BASE, 'dirCPC%d' % pattern_num) + self.assertFalse(p.exists()) + + def my_mkdir(path, mode=0o777): + path = str(path) + # Emulate another process that would create the directory + # just before we try to create it ourselves. We do it + # in all possible pattern combinations, assuming that this + # function is called at most 5 times (dirCPC/dir1/dir2, + # dirCPC/dir1, dirCPC, dirCPC/dir1, dirCPC/dir1/dir2). + if pattern.pop(): + os.mkdir(path, mode) # from another process + concurrently_created.add(path) + os.mkdir(path, mode) # our real call + + pattern = [bool(pattern_num & (1 << n)) for n in range(5)] + concurrently_created = set() + p12 = p / 'dir1' / 'dir2' + try: + with mock.patch("pathlib._normal_accessor.mkdir", my_mkdir): + p12.mkdir(parents=True, exist_ok=False) + except FileExistsError: + self.assertIn(str(p12), concurrently_created) + else: + self.assertNotIn(str(p12), concurrently_created) + self.assertTrue(p.exists()) + @with_symlinks def test_symlink_to(self): P = self.cls(BASE) diff --git a/Misc/NEWS b/Misc/NEWS index 0caeefdfff45a8..c6df1b86097056 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -48,6 +48,10 @@ Extension Modules Library ------- + +- bpo-29694: Fixed race condition in pathlib mkdir with flags + parents=True. Patch by Armin Rigo. + - bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in contextlib.contextmanager. Patch by Siddharth Velankar. From 47f24a018f6a9c3ed996d2b83a7ebd0d1f905827 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 14 Apr 2017 13:45:27 +0200 Subject: [PATCH 146/220] Relax test timing (bpo-29861) to avoid sporadic failures (#1120) (#1133) (cherry picked from commit 685cdb9acc3fca04a9897d88b89771ddfd50e772) --- Lib/test/_test_multiprocessing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index d1ef98dab47332..e41845b404307e 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -1990,6 +1990,7 @@ def test_release_task_refs(self): self.pool.map(identity, objs) del objs + time.sleep(DELTA) # let threaded cleanup code run self.assertEqual(set(wr() for wr in refs), {None}) # With a process pool, copies of the objects are returned, check # they were released too. From d960d766cf69152c71aa0fc62fa31af1aa174e1e Mon Sep 17 00:00:00 2001 From: Jack McCracken Date: Fri, 14 Apr 2017 10:45:17 -0400 Subject: [PATCH 147/220] Fix misplaced positional argument in OS X support library (#1135) --- Lib/_osx_support.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/_osx_support.py b/Lib/_osx_support.py index 13fcd8b8d25b3e..03d36c9f600a66 100644 --- a/Lib/_osx_support.py +++ b/Lib/_osx_support.py @@ -210,7 +210,7 @@ def _remove_universal_flags(_config_vars): # Do not alter a config var explicitly overridden by env var if cv in _config_vars and cv not in os.environ: flags = _config_vars[cv] - flags = re.sub('-arch\s+\w+\s', ' ', flags, re.ASCII) + flags = re.sub(r'-arch\s+\w+\s', ' ', flags, flags=re.ASCII) flags = re.sub('-isysroot [^ \t]*', ' ', flags) _save_modified_value(_config_vars, cv, flags) From c40740cf06470a774e98f84537801cd8b7176938 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 14 Apr 2017 18:36:11 -0700 Subject: [PATCH 148/220] [3.5] bpo-29738: Fix memory leak in _get_crl_dp (GH-526) (GH-1143) * Remove conditional on free of `dps`, since `dps` is now allocated for all versions of OpenSSL * Remove call to `x509_check_ca` since it was only used to cache the `crldp` field of the certificate CRL_DIST_POINTS_free is available in all supported versions of OpenSSL (recent 0.9.8+) and LibreSSL. (cherry picked from commit 2849cc34a8db93d448a62d69c462402347b50dcb) --- Modules/_ssl.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 5f7693c2d886f3..9f79d17f6d3f4a 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1181,10 +1181,6 @@ _get_crl_dp(X509 *certificate) { int i, j; PyObject *lst, *res = NULL; -#if OPENSSL_VERSION_NUMBER >= 0x10001000L - /* Calls x509v3_cache_extensions and sets up crldp */ - X509_check_ca(certificate); -#endif dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL); if (dps == NULL) @@ -1229,9 +1225,7 @@ _get_crl_dp(X509 *certificate) { done: Py_XDECREF(lst); -#if OPENSSL_VERSION_NUMBER < 0x10001000L - sk_DIST_POINT_free(dps); -#endif + CRL_DIST_POINTS_free(dps); return res; } From f40e72dbe60038eae69bc72e207ac47851d96752 Mon Sep 17 00:00:00 2001 From: Michael Seifert Date: Sat, 15 Apr 2017 04:05:00 +0200 Subject: [PATCH 149/220] [3.5] bpo-30059: Include Py_Ellipsis in C API documentation (GH-1018) (GH-1148) --- Doc/c-api/slice.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst index a825164918f446..8b695e065aeffd 100644 --- a/Doc/c-api/slice.rst +++ b/Doc/c-api/slice.rst @@ -56,3 +56,14 @@ Slice Objects .. versionchanged:: 3.2 The parameter type for the *slice* parameter was ``PySliceObject*`` before. + + +Ellipsis Object +--------------- + + +.. c:var:: PyObject *Py_Ellipsis + + The Python ``Ellipsis`` object. This object has no methods. It needs to be + treated just like any other object with respect to reference counts. Like + :c:data:`Py_None` it is a singleton object. From 4f43f87b6246e13e0eefc793a2c5415c915723c3 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Sat, 15 Apr 2017 13:28:08 +0800 Subject: [PATCH 150/220] bpo-30068: add missing iter(self) in _io._IOBase.readlines when hint is present (#1130) (#1151) --- Lib/test/test_io.py | 1 + Misc/NEWS | 8 +++++--- Modules/_io/iobase.c | 25 +++++++++++++++++-------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index ab24ca110dd929..ff23db5f43699d 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3466,6 +3466,7 @@ def test_io_after_close(self): self.assertRaises(ValueError, f.readinto1, bytearray(1024)) self.assertRaises(ValueError, f.readline) self.assertRaises(ValueError, f.readlines) + self.assertRaises(ValueError, f.readlines, 1) self.assertRaises(ValueError, f.seek, 0) self.assertRaises(ValueError, f.tell) self.assertRaises(ValueError, f.truncate) diff --git a/Misc/NEWS b/Misc/NEWS index c6df1b86097056..d440363ae4c4ba 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,12 +49,14 @@ Extension Modules Library ------- +- bpo-30068: _io._IOBase.readlines will check if it's closed first when + hint is present. + - bpo-29694: Fixed race condition in pathlib mkdir with flags parents=True. Patch by Armin Rigo. -- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in - contextlib.contextmanager. - Patch by Siddharth Velankar. +- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in + contextlib.contextmanager. Patch by Siddharth Velankar. - bpo-29998: Pickling and copying ImportError now preserves name and path attributes. diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 57541a85195045..9c335657710fe9 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -650,7 +650,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) /*[clinic end generated code: output=2f50421677fa3dea input=1961c4a95e96e661]*/ { Py_ssize_t length = 0; - PyObject *result; + PyObject *result, *it = NULL; result = PyList_New(0); if (result == NULL) @@ -664,19 +664,22 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self); if (ret == NULL) { - Py_DECREF(result); - return NULL; + goto error; } Py_DECREF(ret); return result; } + it = PyObject_GetIter(self); + if (it == NULL) { + goto error; + } + while (1) { - PyObject *line = PyIter_Next(self); + PyObject *line = PyIter_Next(it); if (line == NULL) { if (PyErr_Occurred()) { - Py_DECREF(result); - return NULL; + goto error; } else break; /* StopIteration raised */ @@ -684,8 +687,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) if (PyList_Append(result, line) < 0) { Py_DECREF(line); - Py_DECREF(result); - return NULL; + goto error; } length += PyObject_Size(line); Py_DECREF(line); @@ -693,7 +695,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) if (length > hint) break; } + + Py_DECREF(it); return result; + + error: + Py_XDECREF(it); + Py_DECREF(result); + return NULL; } /*[clinic input] From 49a905958ffc2fcd5d1d1a293ae453d45deeb884 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 16 Apr 2017 12:03:51 +0300 Subject: [PATCH 151/220] [3.5] bpo-29943: Do not replace the function PySlice_GetIndicesEx() with a macro (#1049) if Py_LIMITED_API is not defined. --- Include/sliceobject.h | 2 ++ Misc/NEWS | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Include/sliceobject.h b/Include/sliceobject.h index 36263544607096..579ac073d0f241 100644 --- a/Include/sliceobject.h +++ b/Include/sliceobject.h @@ -45,11 +45,13 @@ PyAPI_FUNC(int) PySlice_GetIndicesEx(PyObject *r, Py_ssize_t length, Py_ssize_t *step, Py_ssize_t *slicelength); #if !defined(Py_LIMITED_API) || (Py_LIMITED_API+0 >= 0x03050400 && Py_LIMITED_API+0 < 0x03060000) || Py_LIMITED_API+0 >= 0x03060100 +#ifdef Py_LIMITED_API #define PySlice_GetIndicesEx(slice, length, start, stop, step, slicelen) ( \ PySlice_Unpack((slice), (start), (stop), (step)) < 0 ? \ ((*(slicelen) = 0), -1) : \ ((*(slicelen) = PySlice_AdjustIndices((length), (start), (stop), *(step))), \ 0)) +#endif PyAPI_FUNC(int) PySlice_Unpack(PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step); PyAPI_FUNC(Py_ssize_t) PySlice_AdjustIndices(Py_ssize_t length, diff --git a/Misc/NEWS b/Misc/NEWS index d440363ae4c4ba..146a39c9cf8ae3 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -160,8 +160,8 @@ C API ----- - Issue #27867: Function PySlice_GetIndicesEx() is replaced with a macro if - Py_LIMITED_API is not set or set to the value between 0x03050400 - and 0x03060000 (not including) or 0x03060100 or higher. + Py_LIMITED_API is set to the value between 0x03050400 and 0x03060000 (not + including) or 0x03060100 or higher. - Issue #29083: Fixed the declaration of some public API functions. PyArg_VaParse() and PyArg_VaParseTupleAndKeywords() were not available in From e63af29c87b44bb7ada5783cd0ff6ee6d4f9c17c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 19 Apr 2017 22:09:56 +0300 Subject: [PATCH 152/220] [3.5] bpo-30061: Check if PyObject_Size()/PySequence_Size()/PyMapping_Size() (GH-1096) (GH-1180) (#1182) raised an error. (cherry picked from commit bf623ae8843dc30b28c574bec8d29fc14be59d86) (cherry picked from commit 680fea4067537a9b9c79aadd44a3a19e83cd2dbf) --- Lib/test/test_io.py | 16 ++++++++ Misc/NEWS | 5 +++ Modules/_io/iobase.c | 13 +++++-- Modules/_winapi.c | 17 ++++++--- Modules/cjkcodecs/multibytecodec.c | 3 ++ Modules/posixmodule.c | 60 +++++++++++++++++++++--------- Objects/setobject.c | 12 ++++-- 7 files changed, 95 insertions(+), 31 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index ff23db5f43699d..b8937c5a183adf 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -536,6 +536,22 @@ def test_readline(self): with self.open(support.TESTFN, "r") as f: self.assertRaises(TypeError, f.readline, 5.3) + def test_readline_nonsizeable(self): + # Issue #30061 + # Crash when readline() returns an object without __len__ + class R(self.IOBase): + def readline(self): + return None + self.assertRaises((TypeError, StopIteration), next, R()) + + def test_next_nonsizeable(self): + # Issue #30061 + # Crash when __next__() returns an object without __len__ + class R(self.IOBase): + def __next__(self): + return None + self.assertRaises(TypeError, R().readlines, 1) + def test_raw_bytes_io(self): f = self.BytesIO() self.write_ops(f) diff --git a/Misc/NEWS b/Misc/NEWS index 146a39c9cf8ae3..011663daac12a4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,11 @@ Extension Modules Library ------- +- bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when + readline() or __next__() respectively return non-sizeable object. + Fixed possible other errors caused by not checking results of PyObject_Size(), + PySequence_Size(), or PyMapping_Size(). + - bpo-30068: _io._IOBase.readlines will check if it's closed first when hint is present. diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 9c335657710fe9..9acd1461ce2e85 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -625,7 +625,8 @@ iobase_iternext(PyObject *self) if (line == NULL) return NULL; - if (PyObject_Size(line) == 0) { + if (PyObject_Size(line) <= 0) { + /* Error or empty */ Py_DECREF(line); return NULL; } @@ -676,6 +677,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) } while (1) { + Py_ssize_t line_length; PyObject *line = PyIter_Next(it); if (line == NULL) { if (PyErr_Occurred()) { @@ -689,11 +691,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) Py_DECREF(line); goto error; } - length += PyObject_Size(line); + line_length = PyObject_Size(line); Py_DECREF(line); - - if (length > hint) + if (line_length < 0) { + goto error; + } + if (line_length > hint - length) break; + length += line_length; } Py_DECREF(it); diff --git a/Modules/_winapi.c b/Modules/_winapi.c index edc6cf4adbb495..cc7b66360df6d4 100644 --- a/Modules/_winapi.c +++ b/Modules/_winapi.c @@ -722,17 +722,22 @@ getenvironment(PyObject* environment) return NULL; } - envsize = PyMapping_Length(environment); - keys = PyMapping_Keys(environment); values = PyMapping_Values(environment); if (!keys || !values) goto error; + envsize = PySequence_Fast_GET_SIZE(keys); + if (PySequence_Fast_GET_SIZE(values) != envsize) { + PyErr_SetString(PyExc_RuntimeError, + "environment changed size during iteration"); + goto error; + } + totalsize = 1; /* trailing null character */ for (i = 0; i < envsize; i++) { - PyObject* key = PyList_GET_ITEM(keys, i); - PyObject* value = PyList_GET_ITEM(values, i); + PyObject* key = PySequence_Fast_GET_ITEM(keys, i); + PyObject* value = PySequence_Fast_GET_ITEM(values, i); if (! PyUnicode_Check(key) || ! PyUnicode_Check(value)) { PyErr_SetString(PyExc_TypeError, @@ -760,8 +765,8 @@ getenvironment(PyObject* environment) end = buffer + totalsize; for (i = 0; i < envsize; i++) { - PyObject* key = PyList_GET_ITEM(keys, i); - PyObject* value = PyList_GET_ITEM(values, i); + PyObject* key = PySequence_Fast_GET_ITEM(keys, i); + PyObject* value = PySequence_Fast_GET_ITEM(values, i); if (!PyUnicode_AsUCS4(key, p, end - p, 0)) goto error; p += PyUnicode_GET_LENGTH(key); diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index f5c842154b9aff..61750edfed99ea 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1670,6 +1670,9 @@ _multibytecodec_MultibyteStreamWriter_writelines(MultibyteStreamWriterObject *se if (r == -1) return NULL; } + /* PySequence_Length() can fail */ + if (PyErr_Occurred()) + return NULL; Py_RETURN_NONE; } diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 3e446a524e9e93..00da3c086521a4 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6755,7 +6755,7 @@ static PyObject * os_setgroups(PyObject *module, PyObject *groups) /*[clinic end generated code: output=3fcb32aad58c5ecd input=fa742ca3daf85a7e]*/ { - int i, len; + Py_ssize_t i, len; gid_t grouplist[MAX_GROUPS]; if (!PySequence_Check(groups)) { @@ -6763,6 +6763,9 @@ os_setgroups(PyObject *module, PyObject *groups) return NULL; } len = PySequence_Size(groups); + if (len < 0) { + return NULL; + } if (len > MAX_GROUPS) { PyErr_SetString(PyExc_ValueError, "too many groups"); return NULL; @@ -8076,9 +8079,9 @@ os_read_impl(PyObject *module, int fd, Py_ssize_t length) #if (defined(HAVE_SENDFILE) && (defined(__FreeBSD__) || defined(__DragonFly__) \ || defined(__APPLE__))) || defined(HAVE_READV) || defined(HAVE_WRITEV) static Py_ssize_t -iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, int cnt, int type) +iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, Py_ssize_t cnt, int type) { - int i, j; + Py_ssize_t i, j; Py_ssize_t blen, total = 0; *iov = PyMem_New(struct iovec, cnt); @@ -8155,8 +8158,7 @@ static Py_ssize_t os_readv_impl(PyObject *module, int fd, PyObject *buffers) /*[clinic end generated code: output=792da062d3fcebdb input=e679eb5dbfa0357d]*/ { - int cnt; - Py_ssize_t n; + Py_ssize_t cnt, n; int async_err = 0; struct iovec *iov; Py_buffer *buf; @@ -8168,6 +8170,8 @@ os_readv_impl(PyObject *module, int fd, PyObject *buffers) } cnt = PySequence_Size(buffers); + if (cnt < 0) + return -1; if (iov_setup(&iov, &buf, buffers, cnt, PyBUF_WRITABLE) < 0) return -1; @@ -8310,15 +8314,24 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) "sendfile() headers must be a sequence"); return NULL; } else { - Py_ssize_t i = 0; /* Avoid uninitialized warning */ - sf.hdr_cnt = PySequence_Size(headers); - if (sf.hdr_cnt > 0 && - (i = iov_setup(&(sf.headers), &hbuf, - headers, sf.hdr_cnt, PyBUF_SIMPLE)) < 0) + Py_ssize_t i = PySequence_Size(headers); + if (i < 0) + return NULL; + if (i > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "sendfile() header is too large"); return NULL; + } + if (i > 0) { + sf.hdr_cnt = (int)i; + i = iov_setup(&(sf.headers), &hbuf, + headers, sf.hdr_cnt, PyBUF_SIMPLE); + if (i < 0) + return NULL; #ifdef __APPLE__ - sbytes += i; + sbytes += i; #endif + } } } if (trailers != NULL) { @@ -8327,15 +8340,24 @@ posix_sendfile(PyObject *self, PyObject *args, PyObject *kwdict) "sendfile() trailers must be a sequence"); return NULL; } else { - Py_ssize_t i = 0; /* Avoid uninitialized warning */ - sf.trl_cnt = PySequence_Size(trailers); - if (sf.trl_cnt > 0 && - (i = iov_setup(&(sf.trailers), &tbuf, - trailers, sf.trl_cnt, PyBUF_SIMPLE)) < 0) + Py_ssize_t i = PySequence_Size(trailers); + if (i < 0) + return NULL; + if (i > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "sendfile() trailer is too large"); return NULL; + } + if (i > 0) { + sf.trl_cnt = (int)i; + i = iov_setup(&(sf.trailers), &tbuf, + trailers, sf.trl_cnt, PyBUF_SIMPLE); + if (i < 0) + return NULL; #ifdef __APPLE__ - sbytes += i; + sbytes += i; #endif + } } } @@ -8605,7 +8627,7 @@ static Py_ssize_t os_writev_impl(PyObject *module, int fd, PyObject *buffers) /*[clinic end generated code: output=56565cfac3aac15b input=5b8d17fe4189d2fe]*/ { - int cnt; + Py_ssize_t cnt; Py_ssize_t result; int async_err = 0; struct iovec *iov; @@ -8617,6 +8639,8 @@ os_writev_impl(PyObject *module, int fd, PyObject *buffers) return -1; } cnt = PySequence_Size(buffers); + if (cnt < 0) + return -1; if (iov_setup(&iov, &buf, buffers, cnt, PyBUF_SIMPLE) < 0) { return -1; diff --git a/Objects/setobject.c b/Objects/setobject.c index 4ef692db332031..3dbdb4ea539306 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1498,15 +1498,21 @@ set_difference(PySetObject *so, PyObject *other) { PyObject *result; setentry *entry; - Py_ssize_t pos = 0; + Py_ssize_t pos = 0, other_size; - if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) { + if (PyAnySet_Check(other)) { + other_size = PySet_GET_SIZE(other); + } + else if (PyDict_CheckExact(other)) { + other_size = PyDict_Size(other); + } + else { return set_copy_and_difference(so, other); } /* If len(so) much more than len(other), it's more efficient to simply copy * so and then iterate other looking for common elements. */ - if ((PySet_GET_SIZE(so) >> 2) > PyObject_Size(other)) { + if ((PySet_GET_SIZE(so) >> 2) > other_size) { return set_copy_and_difference(so, other); } From 952a05e4e2cf082b74a1676a2804f1f43a9b7702 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 19 Apr 2017 23:44:43 +0300 Subject: [PATCH 153/220] [3.5] bpo-30070: Fixed leaks and crashes in errors handling in the parser module. (GH-1131). (#1185) (cherry picked from commit a79f4c219531c05fc8f670c1e4bbf12c081935d3) --- Lib/test/test_parser.py | 81 +++++++++++++++++++++++++++++ Misc/NEWS | 2 + Modules/parsermodule.c | 110 ++++++++++++++++++++++++---------------- 3 files changed, 150 insertions(+), 43 deletions(-) diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index ab6577f44d7e15..42ce6b00a3f3aa 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -1,4 +1,6 @@ +import copy import parser +import pickle import unittest import sys import operator @@ -386,6 +388,52 @@ def test_junk(self): # not even remotely valid: self.check_bad_tree((1, 2, 3), "") + def test_illegal_terminal(self): + tree = \ + (257, + (269, + (270, + (271, + (277, + (1,))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "too small items in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, b'pass'))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "non-string second item in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, 'pass', '0', 0))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "non-integer third item in terminal node") + tree = \ + (257, + (269, + (270, + (271, + (277, + (1, 'pass', 0, 0))), + (4, ''))), + (4, ''), + (0, '')) + self.check_bad_tree(tree, "too many items in terminal node") + def test_illegal_yield_1(self): # Illegal yield statement: def f(): return 1; yield 1 tree = \ @@ -590,6 +638,24 @@ def test_missing_import_source(self): (4, ''), (0, '')) self.check_bad_tree(tree, "from import fred") + def test_illegal_encoding(self): + # Illegal encoding declaration + tree = \ + (338, + (257, (0, ''))) + self.check_bad_tree(tree, "missed encoding") + tree = \ + (338, + (257, (0, '')), + b'iso-8859-1') + self.check_bad_tree(tree, "non-string encoding") + tree = \ + (338, + (257, (0, '')), + '\udcff') + with self.assertRaises(UnicodeEncodeError): + parser.sequence2st(tree) + class CompileTestCase(unittest.TestCase): @@ -728,6 +794,21 @@ def test_comparisons(self): self.assertRaises(TypeError, operator.lt, st1, 1815) self.assertRaises(TypeError, operator.gt, b'waterloo', st2) + def test_copy_pickle(self): + sts = [ + parser.expr('2 + 3'), + parser.suite('x = 2; y = x + 3'), + parser.expr('list(x**3 for x in range(20))') + ] + for st in sts: + st_copy = copy.copy(st) + self.assertEqual(st_copy.totuple(), st.totuple()) + st_copy = copy.deepcopy(st) + self.assertEqual(st_copy.totuple(), st.totuple()) + for proto in range(pickle.HIGHEST_PROTOCOL+1): + st_copy = pickle.loads(pickle.dumps(st, proto)) + self.assertEqual(st_copy.totuple(), st.totuple()) + check_sizeof = support.check_sizeof @support.cpython_only diff --git a/Misc/NEWS b/Misc/NEWS index 011663daac12a4..d9494c13b3c96b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,8 @@ Extension Modules Library ------- +- bpo-30070: Fixed leaks and crashes in errors handling in the parser module. + - bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when readline() or __next__() respectively return non-sizeable object. Fixed possible other errors caused by not checking results of PyObject_Size(), diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 6471b8ee997fcf..fe095e53732abe 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -763,6 +763,9 @@ build_node_children(PyObject *tuple, node *root, int *line_num) Py_ssize_t i; int err; + if (len < 0) { + return NULL; + } for (i = 1; i < len; ++i) { /* elem must always be a sequence, however simple */ PyObject* elem = PySequence_GetItem(tuple, i); @@ -783,7 +786,7 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if (type == -1 && PyErr_Occurred()) { Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } } Py_DECREF(temp); @@ -795,7 +798,7 @@ build_node_children(PyObject *tuple, node *root, int *line_num) PyErr_SetObject(parser_error, err); Py_XDECREF(err); Py_XDECREF(elem); - return (0); + return NULL; } if (ISTERMINAL(type)) { Py_ssize_t len = PyObject_Size(elem); @@ -804,11 +807,14 @@ build_node_children(PyObject *tuple, node *root, int *line_num) if ((len != 2) && (len != 3)) { err_string("terminal nodes must have 2 or 3 entries"); - return 0; + Py_DECREF(elem); + return NULL; } temp = PySequence_GetItem(elem, 1); - if (temp == NULL) - return 0; + if (temp == NULL) { + Py_DECREF(elem); + return NULL; + } if (!PyUnicode_Check(temp)) { PyErr_Format(parser_error, "second item in terminal node must be a string," @@ -816,46 +822,49 @@ build_node_children(PyObject *tuple, node *root, int *line_num) Py_TYPE(temp)->tp_name); Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } if (len == 3) { PyObject *o = PySequence_GetItem(elem, 2); - if (o != NULL) { - if (PyLong_Check(o)) { - int num = _PyLong_AsInt(o); - if (num == -1 && PyErr_Occurred()) { - Py_DECREF(o); - Py_DECREF(temp); - Py_DECREF(elem); - return 0; - } - *line_num = num; - } - else { - PyErr_Format(parser_error, - "third item in terminal node must be an" - " integer, found %s", - Py_TYPE(temp)->tp_name); + if (o == NULL) { + Py_DECREF(temp); + Py_DECREF(elem); + return NULL; + } + if (PyLong_Check(o)) { + int num = _PyLong_AsInt(o); + if (num == -1 && PyErr_Occurred()) { Py_DECREF(o); Py_DECREF(temp); Py_DECREF(elem); - return 0; + return NULL; } + *line_num = num; + } + else { + PyErr_Format(parser_error, + "third item in terminal node must be an" + " integer, found %s", + Py_TYPE(temp)->tp_name); Py_DECREF(o); + Py_DECREF(temp); + Py_DECREF(elem); + return NULL; } + Py_DECREF(o); } temp_str = _PyUnicode_AsStringAndSize(temp, &len); if (temp_str == NULL) { Py_DECREF(temp); - Py_XDECREF(elem); - return 0; + Py_DECREF(elem); + return NULL; } strn = (char *)PyObject_MALLOC(len + 1); if (strn == NULL) { Py_DECREF(temp); - Py_XDECREF(elem); + Py_DECREF(elem); PyErr_NoMemory(); - return 0; + return NULL; } (void) memcpy(strn, temp_str, len + 1); Py_DECREF(temp); @@ -865,20 +874,21 @@ build_node_children(PyObject *tuple, node *root, int *line_num) * It has to be one or the other; this is an error. * Raise an exception. */ - PyObject *err = Py_BuildValue("os", elem, "unknown node type."); + PyObject *err = Py_BuildValue("Os", elem, "unknown node type."); PyErr_SetObject(parser_error, err); Py_XDECREF(err); - Py_XDECREF(elem); - return (0); + Py_DECREF(elem); + return NULL; } err = PyNode_AddChild(root, type, strn, *line_num, 0); if (err == E_NOMEM) { - Py_XDECREF(elem); + Py_DECREF(elem); PyObject_FREE(strn); - return (node *) PyErr_NoMemory(); + PyErr_NoMemory(); + return NULL; } if (err == E_OVERFLOW) { - Py_XDECREF(elem); + Py_DECREF(elem); PyObject_FREE(strn); PyErr_SetString(PyExc_ValueError, "unsupported number of child nodes"); @@ -889,14 +899,14 @@ build_node_children(PyObject *tuple, node *root, int *line_num) node* new_child = CHILD(root, i - 1); if (new_child != build_node_children(elem, new_child, line_num)) { - Py_XDECREF(elem); - return (0); + Py_DECREF(elem); + return NULL; } } else if (type == NEWLINE) { /* It's true: we increment the */ ++(*line_num); /* line number *after* the newline! */ } - Py_XDECREF(elem); + Py_DECREF(elem); } return root; } @@ -931,10 +941,23 @@ build_node_tree(PyObject *tuple) if (num == encoding_decl) { encoding = PySequence_GetItem(tuple, 2); + if (encoding == NULL) { + PyErr_SetString(parser_error, "missed encoding"); + return NULL; + } + if (!PyUnicode_Check(encoding)) { + PyErr_Format(parser_error, + "encoding must be a string, found %.200s", + Py_TYPE(encoding)->tp_name); + Py_DECREF(encoding); + return NULL; + } /* tuple isn't borrowed anymore here, need to DECREF */ tuple = PySequence_GetSlice(tuple, 0, 2); - if (tuple == NULL) + if (tuple == NULL) { + Py_DECREF(encoding); return NULL; + } } res = PyNode_New(num); if (res != NULL) { @@ -947,31 +970,33 @@ build_node_tree(PyObject *tuple) const char *temp; temp = _PyUnicode_AsStringAndSize(encoding, &len); if (temp == NULL) { - Py_DECREF(res); + PyNode_Free(res); Py_DECREF(encoding); Py_DECREF(tuple); return NULL; } res->n_str = (char *)PyObject_MALLOC(len + 1); if (res->n_str == NULL) { - Py_DECREF(res); + PyNode_Free(res); Py_DECREF(encoding); Py_DECREF(tuple); PyErr_NoMemory(); return NULL; } (void) memcpy(res->n_str, temp, len + 1); - Py_DECREF(encoding); - Py_DECREF(tuple); } } + if (encoding != NULL) { + Py_DECREF(encoding); + Py_DECREF(tuple); + } } else { /* The tuple is illegal -- if the number is neither TERMINAL nor * NONTERMINAL, we can't use it. Not sure the implementation * allows this condition, but the API doesn't preclude it. */ - PyObject *err = Py_BuildValue("os", tuple, + PyObject *err = Py_BuildValue("Os", tuple, "Illegal component tuple."); PyErr_SetObject(parser_error, err); Py_XDECREF(err); @@ -3433,7 +3458,6 @@ parser__pickler(PyObject *self, PyObject *args) result = Py_BuildValue("O(O)", pickle_constructor, tuple); Py_DECREF(tuple); } - Py_DECREF(empty_dict); Py_DECREF(newargs); } finally: From c97c1914f401359f2a7e6c8e0364e71ad9fb5bc8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 20 Apr 2017 00:51:05 +0300 Subject: [PATCH 154/220] [3.5] bpo-30065: Fixed arguments validation in _posixsubprocess.fork_exec(). (GH-1110) (#1190) (cherry picked from commit 66bffd1) --- Lib/multiprocessing/util.py | 2 +- Lib/subprocess.py | 3 ++- Lib/test/test_capi.py | 6 +++--- Lib/test/test_subprocess.py | 13 ++++++++++- Modules/_posixsubprocess.c | 43 ++++++++++++++++++++----------------- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py index 1a2c0db40b9cc6..0ce274ceca6057 100644 --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -386,7 +386,7 @@ def _close_stdin(): def spawnv_passfds(path, args, passfds): import _posixsubprocess - passfds = sorted(passfds) + passfds = tuple(sorted(map(int, passfds))) errpipe_read, errpipe_write = os.pipe() try: return _posixsubprocess.fork_exec( diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 21655242a47268..281ea8af92257e 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1214,7 +1214,8 @@ def _execute_child(self, args, executable, preexec_fn, close_fds, fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, - close_fds, sorted(fds_to_keep), cwd, env_list, + close_fds, tuple(sorted(map(int, fds_to_keep))), + cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 1eadd2249e1729..042e5aaae35064 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -96,7 +96,7 @@ class Z(object): def __len__(self): return 1 self.assertRaises(TypeError, _posixsubprocess.fork_exec, - 1,Z(),3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) # Issue #15736: overflow in _PySequence_BytesToCharpArray() class Z(object): def __len__(self): @@ -104,7 +104,7 @@ def __len__(self): def __getitem__(self, i): return b'x' self.assertRaises(MemoryError, _posixsubprocess.fork_exec, - 1,Z(),3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + 1,Z(),3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) @unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.') def test_subprocess_fork_exec(self): @@ -114,7 +114,7 @@ def __len__(self): # Issue #15738: crash in subprocess_fork_exec() self.assertRaises(TypeError, _posixsubprocess.fork_exec, - Z(),[b'1'],3,[1, 2],5,6,7,8,9,10,11,12,13,14,15,16,17) + Z(),[b'1'],3,(1, 2),5,6,7,8,9,10,11,12,13,14,15,16,17) @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings") diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 2dc03ee7001bf3..03a06e051bff2f 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -2371,7 +2371,7 @@ def test_fork_exec(self): with self.assertRaises(TypeError): _posixsubprocess.fork_exec( args, exe_list, - True, [], cwd, env_list, + True, (), cwd, env_list, -1, -1, -1, -1, 1, 2, 3, 4, True, True, func) @@ -2383,6 +2383,16 @@ def test_fork_exec(self): def test_fork_exec_sorted_fd_sanity_check(self): # Issue #23564: sanity check the fork_exec() fds_to_keep sanity check. import _posixsubprocess + class BadInt: + first = True + def __init__(self, value): + self.value = value + def __int__(self): + if self.first: + self.first = False + return self.value + raise ValueError + gc_enabled = gc.isenabled() try: gc.enable() @@ -2393,6 +2403,7 @@ def test_fork_exec_sorted_fd_sanity_check(self): (18, 23, 42, 2**63), # Out of range. (5, 4), # Not sorted. (6, 7, 7, 8), # Duplicate. + (BadInt(1), BadInt(2)), ): with self.assertRaises( ValueError, diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index c0240e2af02f16..48c19538c8488f 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -112,13 +112,17 @@ _is_fdescfs_mounted_on_dev_fd(void) static int _sanity_check_python_fd_sequence(PyObject *fd_sequence) { - Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence); + Py_ssize_t seq_idx; long prev_fd = -1; - for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) { - PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx); - long iter_fd = PyLong_AsLong(py_fd); + for (seq_idx = 0; seq_idx < PyTuple_GET_SIZE(fd_sequence); ++seq_idx) { + PyObject* py_fd = PyTuple_GET_ITEM(fd_sequence, seq_idx); + long iter_fd; + if (!PyLong_Check(py_fd)) { + return 1; + } + iter_fd = PyLong_AsLong(py_fd); if (iter_fd < 0 || iter_fd <= prev_fd || iter_fd > INT_MAX) { - /* Negative, overflow, not a Long, unsorted, too big for a fd. */ + /* Negative, overflow, unsorted, too big for a fd. */ return 1; } prev_fd = iter_fd; @@ -133,13 +137,12 @@ _is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence) { /* Binary search. */ Py_ssize_t search_min = 0; - Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1; + Py_ssize_t search_max = PyTuple_GET_SIZE(fd_sequence) - 1; if (search_max < 0) return 0; do { long middle = (search_min + search_max) / 2; - long middle_fd = PyLong_AsLong( - PySequence_Fast_GET_ITEM(fd_sequence, middle)); + long middle_fd = PyLong_AsLong(PyTuple_GET_ITEM(fd_sequence, middle)); if (fd == middle_fd) return 1; if (fd > middle_fd) @@ -155,9 +158,9 @@ make_inheritable(PyObject *py_fds_to_keep, int errpipe_write) { Py_ssize_t i, len; - len = PySequence_Length(py_fds_to_keep); + len = PyTuple_GET_SIZE(py_fds_to_keep); for (i = 0; i < len; ++i) { - PyObject* fdobj = PySequence_Fast_GET_ITEM(py_fds_to_keep, i); + PyObject* fdobj = PyTuple_GET_ITEM(py_fds_to_keep, i); long fd = PyLong_AsLong(fdobj); assert(!PyErr_Occurred()); assert(0 <= fd && fd <= INT_MAX); @@ -214,14 +217,13 @@ static void _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep) { long end_fd = safe_get_max_fd(); - Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep); + Py_ssize_t num_fds_to_keep = PyTuple_GET_SIZE(py_fds_to_keep); Py_ssize_t keep_seq_idx; int fd_num; /* As py_fds_to_keep is sorted we can loop through the list closing * fds inbetween any in the keep list falling within our range. */ for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) { - PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep, - keep_seq_idx); + PyObject* py_keep_fd = PyTuple_GET_ITEM(py_fds_to_keep, keep_seq_idx); int keep_fd = PyLong_AsLong(py_keep_fd); if (keep_fd < start_fd) continue; @@ -307,7 +309,7 @@ _close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep) /* Close all open file descriptors from start_fd and higher. - * Do not close any in the sorted py_fds_to_keep list. + * Do not close any in the sorted py_fds_to_keep tuple. * * This function violates the strict use of async signal safe functions. :( * It calls opendir(), readdir() and closedir(). Of these, the one most @@ -563,8 +565,9 @@ subprocess_fork_exec(PyObject* self, PyObject *args) #endif if (!PyArg_ParseTuple( - args, "OOpOOOiiiiiiiiiiO:fork_exec", - &process_args, &executable_list, &close_fds, &py_fds_to_keep, + args, "OOpO!OOiiiiiiiiiiO:fork_exec", + &process_args, &executable_list, + &close_fds, &PyTuple_Type, &py_fds_to_keep, &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, @@ -575,10 +578,6 @@ subprocess_fork_exec(PyObject* self, PyObject *args) PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3"); return NULL; } - if (PySequence_Length(py_fds_to_keep) < 0) { - PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep"); - return NULL; - } if (_sanity_check_python_fd_sequence(py_fds_to_keep)) { PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep"); return NULL; @@ -632,6 +631,10 @@ subprocess_fork_exec(PyObject* self, PyObject *args) goto cleanup; for (arg_num = 0; arg_num < num_args; ++arg_num) { PyObject *borrowed_arg, *converted_arg; + if (PySequence_Fast_GET_SIZE(fast_args) != num_args) { + PyErr_SetString(PyExc_RuntimeError, "args changed during iteration"); + goto cleanup; + } borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num); if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0) goto cleanup; From 7e56fe35efe3aef0b9aac989255c4f13dfc01b09 Mon Sep 17 00:00:00 2001 From: cocoatomo Date: Thu, 20 Apr 2017 12:56:05 +0900 Subject: [PATCH 155/220] bpo-19225: Remove duplicated description for standard warning categories (GH-1068) --- Doc/c-api/exceptions.rst | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index cf2385f3deb3c7..b8af52062b7226 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -291,16 +291,11 @@ an error value). is the function calling :c:func:`PyErr_WarnEx`, 2 is the function above that, and so forth. - Warning categories must be subclasses of :c:data:`Warning`; the default warning - category is :c:data:`RuntimeWarning`. The standard Python warning categories are - available as global variables whose names are ``PyExc_`` followed by the Python - exception name. These have the type :c:type:`PyObject\*`; they are all class - objects. Their names are :c:data:`PyExc_Warning`, :c:data:`PyExc_UserWarning`, - :c:data:`PyExc_UnicodeWarning`, :c:data:`PyExc_DeprecationWarning`, - :c:data:`PyExc_SyntaxWarning`, :c:data:`PyExc_RuntimeWarning`, and - :c:data:`PyExc_FutureWarning`. :c:data:`PyExc_Warning` is a subclass of - :c:data:`PyExc_Exception`; the other warning categories are subclasses of - :c:data:`PyExc_Warning`. + Warning categories must be subclasses of :c:data:`PyExc_Warning`; + :c:data:`PyExc_Warning` is a subclass of :c:data:`PyExc_Exception`; + the default warning category is :c:data:`PyExc_RuntimeWarning`. The standard + Python warning categories are available as global variables whose names are + enumerated at :ref:`standarwarningcategories`. For information about warning control, see the documentation for the :mod:`warnings` module and the :option:`-W` option in the command line @@ -942,8 +937,10 @@ Notes: Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. -Standard Warnings -================= +.. _standarwarningcategories: + +Standard Warning Categories +=========================== All standard Python warning categories are available as global variables whose names are ``PyExc_`` followed by the Python exception name. These have the type From 6fb0f801d73b1e2794888772d016d978eccf52a6 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 20 Apr 2017 07:37:18 +0300 Subject: [PATCH 156/220] bpo-30078: Add an example of passing a path to unittest (GH-1178) (cherry picked from commit f7e62cf8adfb8ab6a6a870903defe8ff218a0383) --- Lib/unittest/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/unittest/main.py b/Lib/unittest/main.py index 09fefe11649bd3..807604f08dfd14 100644 --- a/Lib/unittest/main.py +++ b/Lib/unittest/main.py @@ -14,6 +14,7 @@ %(prog)s test_module - run tests from test_module %(prog)s module.TestClass - run tests from module.TestClass %(prog)s module.Class.test_method - run specified test method + %(prog)s path/to/test_file.py - run tests from test_file.py """ MODULE_EXAMPLES = """\ From ad2d47d95165a011f411a8afbb3a87513e269775 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Thu, 20 Apr 2017 07:40:05 +0300 Subject: [PATCH 157/220] Remove redundant comma in argparse HOWTO (GH-1141) Reported by Sean Canavan on docs@p.o. (cherry picked from commit 8526fb74edf5ac9ca175b7cdcb0d82bb8780d2cf) --- Doc/howto/argparse.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index 3b79b92082a70a..fac1a3573b98a0 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -221,7 +221,7 @@ before proceeding. Introducing Optional arguments ============================== -So far we, have been playing with positional arguments. Let us +So far we have been playing with positional arguments. Let us have a look on how to add optional ones:: import argparse From 60d27f42a07d0b9d4a2c3fb160cac1683e91f196 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 20 Apr 2017 07:12:50 -0700 Subject: [PATCH 158/220] [3.5] bpo-30109: Fix reindent.py (GH-1207) (GH-1209) Skip the file if it has bad encoding. (cherry picked from commit 58f3c9dc8f5626abe09ac9738c34f6ba99ce2972) --- Lib/test/test_tools/test_reindent.py | 7 +++++++ Tools/scripts/reindent.py | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_tools/test_reindent.py b/Lib/test/test_tools/test_reindent.py index d7c20e1e5c7206..34df0c5d511904 100644 --- a/Lib/test/test_tools/test_reindent.py +++ b/Lib/test/test_tools/test_reindent.py @@ -7,6 +7,7 @@ import os import unittest from test.support.script_helper import assert_python_ok +from test.support import findfile from test.test_tools import scriptsdir, skip_if_missing @@ -23,6 +24,12 @@ def test_help(self): self.assertEqual(out, b'') self.assertGreater(err, b'') + def test_reindent_file_with_bad_encoding(self): + bad_coding_path = findfile('bad_coding.py') + rc, out, err = assert_python_ok(self.script, '-r', bad_coding_path) + self.assertEqual(out, b'') + self.assertNotEqual(err, b'') + if __name__ == '__main__': unittest.main() diff --git a/Tools/scripts/reindent.py b/Tools/scripts/reindent.py index 18424dea1437ac..f6dadaac5a5206 100755 --- a/Tools/scripts/reindent.py +++ b/Tools/scripts/reindent.py @@ -118,7 +118,11 @@ def check(file): if verbose: print("checking", file, "...", end=' ') with open(file, 'rb') as f: - encoding, _ = tokenize.detect_encoding(f.readline) + try: + encoding, _ = tokenize.detect_encoding(f.readline) + except SyntaxError as se: + errprint("%s: SyntaxError: %s" % (file, str(se))) + return try: with open(file, encoding=encoding) as f: r = Reindenter(f) From ed5e0652cad5ae13f33777e822ff0f1aed3942f6 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Thu, 20 Apr 2017 20:56:03 -0700 Subject: [PATCH 159/220] [3.5] Add missing .gitignore entries for VS2015 IntelliSense DB (GH-1223) (#1226) (cherry picked from commit 8e675286a92f33837cfffac5914b5175dac5d573) --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d267d15c74db40..b324b920984265 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,8 @@ PCbuild/*.suo PCbuild/*.*sdf PCbuild/*-pgi PCbuild/*-pgo +PCbuild/*.VC.db +PCbuild/*.VC.opendb PCbuild/.vs/ PCbuild/amd64/ PCbuild/obj/ From 17db4b99b4d300a9b024ba0efdaa46d05d4f4cd3 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 21 Apr 2017 10:55:54 +0300 Subject: [PATCH 160/220] [3.5] bpo-29802: Fix the cleaning up issue in PyUnicode_FSDecoder(). (GH-1217) (#1219) (cherry picked from commit 7a113a0) --- Objects/unicodeobject.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index d7c9a34c39451b..d037d80b3d222e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3654,6 +3654,7 @@ PyUnicode_FSDecoder(PyObject* arg, void* addr) PyObject *output = NULL; if (arg == NULL) { Py_DECREF(*(PyObject**)addr); + *(PyObject**)addr = NULL; return 1; } if (PyUnicode_Check(arg)) { From 503d74a60aa9290cf8d174eab95fdfdea1f2b284 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Fri, 21 Apr 2017 19:58:01 -0700 Subject: [PATCH 161/220] bpo-30098: Clarify that run_coroutine_threadsafe expects asyncio.Future (GH-1170) (#1246) (cherry picked from commit ae5b3260dd459845aad8a30491b76d471577785d) --- Lib/asyncio/tasks.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 7b3bdb21865a49..b6bd53cef1aa41 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -565,7 +565,8 @@ def ensure_future(coro_or_future, *, loop=None): elif compat.PY35 and inspect.isawaitable(coro_or_future): return ensure_future(_wrap_awaitable(coro_or_future), loop=loop) else: - raise TypeError('A Future, a coroutine or an awaitable is required') + raise TypeError('An asyncio.Future, a coroutine or an awaitable is ' + 'required') @coroutine From 7badde2bbb93e39ee917e22cd086e81eed076162 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Sat, 22 Apr 2017 19:49:40 +0800 Subject: [PATCH 162/220] [3.5] Fix trailing colon and newline in test.rst (GH-1250) (#1255) (cherry picked from commit 7fae81e1672d0b4110d31ea6a765b54f63a2e54b) --- Doc/library/test.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 59577f0fe8969a..2777128bd82960 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -570,7 +570,8 @@ The :mod:`test.support` module defines the following functions: def load_tests(*args): return load_package_tests(os.path.dirname(__file__), *args) -.. function:: detect_api_mismatch(ref_api, other_api, *, ignore=()): + +.. function:: detect_api_mismatch(ref_api, other_api, *, ignore=()) Returns the set of attributes, functions or methods of *ref_api* not found on *other_api*, except for a defined list of items to be From c358536fd5e40e8f29ee4f086588a82fccb25a09 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 23 Apr 2017 08:50:20 +0300 Subject: [PATCH 163/220] [3.5] bpo-15718: Document the upper bound constrain on the __len__ return value. (GH-1256) (#1260) (cherry picked from commit 85157cd) --- Doc/reference/datamodel.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index cd28c147b27992..0d108d727e7a19 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1887,6 +1887,14 @@ through the container; for mappings, :meth:`__iter__` should be the same as :meth:`__bool__` method and whose :meth:`__len__` method returns zero is considered to be false in a Boolean context. + .. impl-detail:: + + In CPython, the length is required to be at most :attr:`sys.maxsize`. + If the length is larger than :attr:`!sys.maxsize` some features (such as + :func:`len`) may raise :exc:`OverflowError`. To prevent raising + :exc:`!OverflowError` by truth value testing, an object must define a + :meth:`__bool__` method. + .. method:: object.__length_hint__(self) @@ -1897,6 +1905,7 @@ through the container; for mappings, :meth:`__iter__` should be the same as .. versionadded:: 3.4 + .. note:: Slicing is done exclusively with the following three methods. A call like :: From d51d093b9bbca108f59bad0f1730c48ebf5b2e14 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sun, 23 Apr 2017 21:02:30 -0700 Subject: [PATCH 164/220] [3.5] bpo-29751: Improve PyLong_FromString documentation (GH-915) (#1267) (cherry picked from commit 26896f2832324dde85cdd63d525571ca669f6f0b) --- Doc/c-api/long.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 68f6a8ec49ee7b..78e555cc891873 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -85,13 +85,12 @@ All integers are implemented as "long" integer objects of arbitrary size. Return a new :c:type:`PyLongObject` based on the string value in *str*, which is interpreted according to the radix in *base*. If *pend* is non-*NULL*, *\*pend* will point to the first character in *str* which follows the - representation of the number. If *base* is ``0``, the radix will be - determined based on the leading characters of *str*: if *str* starts with - ``'0x'`` or ``'0X'``, radix 16 will be used; if *str* starts with ``'0o'`` or - ``'0O'``, radix 8 will be used; if *str* starts with ``'0b'`` or ``'0B'``, - radix 2 will be used; otherwise radix 10 will be used. If *base* is not - ``0``, it must be between ``2`` and ``36``, inclusive. Leading spaces are - ignored. If there are no digits, :exc:`ValueError` will be raised. + representation of the number. If *base* is ``0``, *str* is interpreted using + the :ref:`integers` definition; in this case, leading zeros in a + non-zero decimal number raises a :exc:`ValueError`. If *base* is not ``0``, + it must be between ``2`` and ``36``, inclusive. Leading spaces and single + underscores after a base specifier and between digits are ignored. If there + are no digits, :exc:`ValueError` will be raised. .. c:function:: PyObject* PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base) From c7b8367076dc7771dabcb9491bd98218c788d489 Mon Sep 17 00:00:00 2001 From: Louie Lu Date: Wed, 26 Apr 2017 16:47:03 +0800 Subject: [PATCH 165/220] bpo-28698: Fix c_wchar_p doc example (GH-1160) (cherry picked from commit 0d637e236d7099f7b724026c8cb7bd83d8e12e6b) --- Doc/library/ctypes.rst | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index b25fbbb1621f4a..3536b32139e71b 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -284,7 +284,7 @@ the correct type and value:: >>> c_int() c_long(0) >>> c_wchar_p("Hello, World") - c_wchar_p('Hello, World') + c_wchar_p(140018365411392) >>> c_ushort(-3) c_ushort(65533) >>> @@ -309,11 +309,15 @@ bytes objects are immutable):: >>> s = "Hello, World" >>> c_s = c_wchar_p(s) >>> print(c_s) - c_wchar_p('Hello, World') + c_wchar_p(139966785747344) + >>> print(c_s.value) + Hello World >>> c_s.value = "Hi, there" - >>> print(c_s) - c_wchar_p('Hi, there') - >>> print(s) # first object is unchanged + >>> print(c_s) # the memory location has changed + c_wchar_p(139966783348904) + >>> print(c_s.value) + Hi, there + >>> print(s) # first object is unchanged Hello, World >>> From 271a289a03ad10c91c5326bde3020f1cdf6a1fff Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 26 Apr 2017 17:24:35 +0300 Subject: [PATCH 166/220] bpo-29974: Improve typing.TYPE_CHECKING example (GH-982) * Fix PEP 8 (SomeType instead of some_type) * Add a function parameter annotation * Explain, using wording from PEP 484 and PEP 526, why one annotation is in quotes and another is not. Suggested by Ivan Levkevskyi. (cherry picked from commit 87c07fe9d908d0a2143fcc8369255c6ff3241503) --- Doc/library/typing.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index 93ea4f9422997a..2ca3bcd5a2cea7 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -963,5 +963,10 @@ The module defines the following classes, functions and decorators: if TYPE_CHECKING: import expensive_mod - def fun(): - local_var: expensive_mod.some_type = other_fun() + def fun(arg: 'expensive_mod.SomeType') -> None: + local_var: expensive_mod.AnotherType = other_fun() + + Note that the first type annotation must be enclosed in quotes, making it a + "forward reference", to hide the ``expensive_mod`` reference from the + interpreter runtime. Type annotations for local variables are not + evaluated, so the second annotation does not need to be enclosed in quotes. From 9a626ec4e58c0bca1b4f71154e9e1da7e6d7e4a7 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Thu, 27 Apr 2017 01:55:21 +0900 Subject: [PATCH 167/220] [3.5] bpo-30142: Remove "callable" from the 2to3fixer documentation. (GH-1304) --- Doc/library/2to3.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index ace1bfaf8cb9d6..4c9a528d42e703 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -199,13 +199,6 @@ and off individually. They are described here in more detail. because the :class:`memoryview` API is similar but not exactly the same as that of :class:`buffer`. -.. 2to3fixer:: callable - - Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. Note ``callable(x)`` has returned - in Python 3.2, so if you do not intend to support Python 3.1, you can disable - this fixer. - .. 2to3fixer:: dict Fixes dictionary iteration methods. :meth:`dict.iteritems` is converted to From c4dfe2537fee970dc1bf3eb4fc2a3e007b36531c Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 26 Apr 2017 22:19:09 -0700 Subject: [PATCH 168/220] [3.5] bpo-30182: Use the correct name for ISO in Unicode HOWTO. (GH-1312) (GH-1314) (cherry picked from commit 6fde770e4e940c19cd62de0b6aeb77840690843e) --- Doc/howto/unicode.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index a48ae1f5faba7e..9649b9c609c255 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -43,9 +43,9 @@ hold values ranging from 0 to 255. ASCII codes only went up to 127, so some machines assigned values between 128 and 255 to accented characters. Different machines had different codes, however, which led to problems exchanging files. Eventually various commonly used sets of values for the 128--255 range emerged. -Some were true standards, defined by the International Standards Organization, -and some were *de facto* conventions that were invented by one company or -another and managed to catch on. +Some were true standards, defined by the International Organization for +Standardization, and some were *de facto* conventions that were invented by one +company or another and managed to catch on. 255 characters aren't very many. For example, you can't fit both the accented characters used in Western Europe and the Cyrillic alphabet used for Russian From 0eda2d43a7d5b262c979b944592999015a822395 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 27 Apr 2017 21:32:09 +0200 Subject: [PATCH 169/220] bpo-30175: Skip client cert tests of test_imaplib (#1320) (#1324) * bpo-30175: Skip client cert tests of test_imaplib The IMAP server cyrus.andrew.cmu.edu doesn't accept our randomly generated client x509 certificate anymore. * bpo-30188: Catch EOFError in NetworkedNNTPTests test_nntplib fails randomly with EOFError in NetworkedNNTPTests.setUpClass(). Catch EOFError to skip tests in that case. (cherry picked from commit 5bccca58b9b2b3a925b16750bedbd907695ea8d7) --- Lib/test/test_imaplib.py | 6 ++++++ Lib/test/test_nntplib.py | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index a29b40ac235b95..7a821f3e973e4d 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -917,11 +917,17 @@ def test_logincapa(self): _server = self.imap_class(self.host, self.port) self.check_logincapa(_server) + @unittest.skipIf(True, + "bpo-30175: FIXME: cyrus.andrew.cmu.edu doesn't accept " + "our randomly generated client x509 certificate anymore") def test_logincapa_with_client_certfile(self): with transient_internet(self.host): _server = self.imap_class(self.host, self.port, certfile=CERTFILE) self.check_logincapa(_server) + @unittest.skipIf(True, + "bpo-30175: FIXME: cyrus.andrew.cmu.edu doesn't accept " + "our randomly generated client x509 certificate anymore") def test_logincapa_with_client_ssl_context(self): with transient_internet(self.host): _server = self.imap_class( diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py index 66ef930a545deb..22fb45a5e702fe 100644 --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -286,7 +286,12 @@ class NetworkedNNTPTests(NetworkedNNTPTestsMixin, unittest.TestCase): def setUpClass(cls): support.requires("network") with support.transient_internet(cls.NNTP_HOST): - cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, usenetrc=False) + try: + cls.server = cls.NNTP_CLASS(cls.NNTP_HOST, timeout=TIMEOUT, + usenetrc=False) + except EOFError: + raise unittest.SkipTest("%s got EOF error on connecting " + "to %r" % (cls, cls.NNTP_HOST)) @classmethod def tearDownClass(cls): From d855e53eabca0e8b2b39d25670c37bbdb4ab2e4c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 04:27:11 +0200 Subject: [PATCH 170/220] bpo-30131: test_logging now joins queue threads (#1298) (#1318) QueueListenerTest of test_logging now closes the multiprocessing Queue and joins its thread to prevent leaking dangling threads to following tests. Add also @support.reap_threads to detect earlier if a test leaks threads (and try to "cleanup" these threads). (cherry picked from commit 8ca2f2faefa8dba323a2e4c4b86efb633d7a53cf) --- Lib/test/test_logging.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 1c850456b14d49..dd7100c6161901 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3067,6 +3067,7 @@ def setup_and_log(log_queue, ident): handler.close() @patch.object(logging.handlers.QueueListener, 'handle') + @support.reap_threads def test_handle_called_with_queue_queue(self, mock_handle): for i in range(self.repeat): log_queue = queue.Queue() @@ -3076,10 +3077,13 @@ def test_handle_called_with_queue_queue(self, mock_handle): @support.requires_multiprocessing_queue @patch.object(logging.handlers.QueueListener, 'handle') + @support.reap_threads def test_handle_called_with_mp_queue(self, mock_handle): for i in range(self.repeat): log_queue = multiprocessing.Queue() self.setup_and_log(log_queue, '%s_%s' % (self.id(), i)) + log_queue.close() + log_queue.join_thread() self.assertEqual(mock_handle.call_count, 5 * self.repeat, 'correct number of handled log messages') @@ -3092,6 +3096,7 @@ def get_all_from_queue(log_queue): return [] @support.requires_multiprocessing_queue + @support.reap_threads def test_no_messages_in_queue_after_stop(self): """ Five messages are logged then the QueueListener is stopped. This @@ -3104,6 +3109,9 @@ def test_no_messages_in_queue_after_stop(self): self.setup_and_log(queue, '%s_%s' %(self.id(), i)) # time.sleep(1) items = list(self.get_all_from_queue(queue)) + queue.close() + queue.join_thread() + expected = [[], [logging.handlers.QueueListener._sentinel]] self.assertIn(items, expected, 'Found unexpected messages in queue: %s' % ( From 98c7a9e662b49029ff051b6699ddc0f542663c96 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 28 Apr 2017 16:59:44 +0200 Subject: [PATCH 171/220] [3.5] bpo-30107: don't dump core on expected test_io crash (#1235) (#1344) * bpo-30107: Make SuppressCrashReport quiet on macOS (#1279) (#1335) On macOS, SuppressCrashReport now redirects /usr/bin/defaults command stderr into a pipe to not pollute stderr. It fixes a test_io.test_daemon_threads_shutdown_stderr_deadlock() failure when the CrashReporter domain doesn't exists. Message logged into stderr: 2017-04-24 16:57:21.432 defaults[41046:2462851] The domain/default pair of (com.apple.CrashReporter, DialogType) does not exist (cherry picked from commit d819ad9832292d854e9710493ecdf959b69802e3) * bpo-30107: don't dump core on expected test_io crash (#1235) test_io has two unit tests which trigger a deadlock: * test_daemon_threads_shutdown_stdout_deadlock() * test_daemon_threads_shutdown_stderr_deadlock() These tests call Py_FatalError() if the expected bug is triggered which calls abort(). Use test.support.SuppressCrashReport to prevent the creation on a core dump, to fix the warning: Warning -- files was modified by test_io Before: [] After: ['python.core'] --- Lib/test/support/__init__.py | 13 +++++++++---- Lib/test/test_io.py | 5 +++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d0d126a3a033a5..a5aba3114370ee 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2337,6 +2337,7 @@ def __enter__(self): (0, self.old_value[1])) except (ValueError, OSError): pass + if sys.platform == 'darwin': # Check if the 'Crash Reporter' on OSX was configured # in 'Developer' mode and warn that it will get triggered @@ -2344,10 +2345,14 @@ def __enter__(self): # # This assumes that this context manager is used in tests # that might trigger the next manager. - value = subprocess.Popen(['/usr/bin/defaults', 'read', - 'com.apple.CrashReporter', 'DialogType'], - stdout=subprocess.PIPE).communicate()[0] - if value.strip() == b'developer': + cmd = ['/usr/bin/defaults', 'read', + 'com.apple.CrashReporter', 'DialogType'] + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + with proc: + stdout = proc.communicate()[0] + if stdout.strip() == b'developer': print("this test triggers the Crash Reporter, " "that is intentional", end='', flush=True) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index b8937c5a183adf..8b4892b2e56b87 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3688,6 +3688,7 @@ def check_daemon_threads_shutdown_deadlock(self, stream_name): import sys import time import threading + from test.support import SuppressCrashReport file = sys.{stream_name} @@ -3696,6 +3697,10 @@ def run(): file.write('.') file.flush() + crash = SuppressCrashReport() + crash.__enter__() + # don't call __exit__(): the crash occurs at Python shutdown + thread = threading.Thread(target=run) thread.daemon = True thread.start() From 910ba937e90ffe3aa154a5b27dc7e2c3d3c88d1f Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 28 Apr 2017 20:05:53 +0300 Subject: [PATCH 172/220] [3.5] bpo-30197: Enhance functions swap_attr() and swap_item() in test.support. (#1341) (#1346) They now work when delete replaced attribute or item inside the with statement. The old value of the attribute or item (or None if it doesn't exist) now will be assigned to the target of the "as" clause, if there is one. (cherry picked from commit d1a1def7bf221b04dcf3fc3a67aa19aa2f622f83) --- Lib/test/support/__init__.py | 16 ++++++++++++---- Lib/test/test_support.py | 29 +++++++++++++++++++++++------ Lib/test/test_tempfile.py | 5 ++--- Misc/NEWS | 6 ++++++ 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index a5aba3114370ee..a9f8fd5b3d7449 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2073,12 +2073,15 @@ def swap_attr(obj, attr, new_val): restoring the old value at the end of the block. If `attr` doesn't exist on `obj`, it will be created and then deleted at the end of the block. + + The old value (or None if it doesn't exist) will be assigned to the + target of the "as" clause, if there is one. """ if hasattr(obj, attr): real_val = getattr(obj, attr) setattr(obj, attr, new_val) try: - yield + yield real_val finally: setattr(obj, attr, real_val) else: @@ -2086,7 +2089,8 @@ def swap_attr(obj, attr, new_val): try: yield finally: - delattr(obj, attr) + if hasattr(obj, attr): + delattr(obj, attr) @contextlib.contextmanager def swap_item(obj, item, new_val): @@ -2100,12 +2104,15 @@ def swap_item(obj, item, new_val): restoring the old value at the end of the block. If `item` doesn't exist on `obj`, it will be created and then deleted at the end of the block. + + The old value (or None if it doesn't exist) will be assigned to the + target of the "as" clause, if there is one. """ if item in obj: real_val = obj[item] obj[item] = new_val try: - yield + yield real_val finally: obj[item] = real_val else: @@ -2113,7 +2120,8 @@ def swap_item(obj, item, new_val): try: yield finally: - del obj[item] + if item in obj: + del obj[item] def strip_python_stderr(stderr): """Strip the stderr of a Python process from potential debug output diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index 5e0f990e400045..70137e1a0be223 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -283,17 +283,34 @@ def test_python_is_optimized(self): def test_swap_attr(self): class Obj: - x = 1 + pass obj = Obj() - with support.swap_attr(obj, "x", 5): + obj.x = 1 + with support.swap_attr(obj, "x", 5) as x: self.assertEqual(obj.x, 5) + self.assertEqual(x, 1) self.assertEqual(obj.x, 1) + with support.swap_attr(obj, "y", 5) as y: + self.assertEqual(obj.y, 5) + self.assertIsNone(y) + self.assertFalse(hasattr(obj, 'y')) + with support.swap_attr(obj, "y", 5): + del obj.y + self.assertFalse(hasattr(obj, 'y')) def test_swap_item(self): - D = {"item":1} - with support.swap_item(D, "item", 5): - self.assertEqual(D["item"], 5) - self.assertEqual(D["item"], 1) + D = {"x":1} + with support.swap_item(D, "x", 5) as x: + self.assertEqual(D["x"], 5) + self.assertEqual(x, 1) + self.assertEqual(D["x"], 1) + with support.swap_item(D, "y", 5) as y: + self.assertEqual(D["y"], 5) + self.assertIsNone(y) + self.assertNotIn("y", D) + with support.swap_item(D, "y", 5): + del D["y"] + self.assertNotIn("y", D) class RefClass: attribute1 = None diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 51df1ecd7d18e6..d0cf04b0cb67ca 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -273,13 +273,12 @@ def raise_OSError(*args, **kwargs): tempfile._get_default_tempdir() self.assertEqual(os.listdir(our_temp_directory), []) - open = io.open def bad_writer(*args, **kwargs): - fp = open(*args, **kwargs) + fp = orig_open(*args, **kwargs) fp.write = raise_OSError return fp - with support.swap_attr(io, "open", bad_writer): + with support.swap_attr(io, "open", bad_writer) as orig_open: # test again with failing write() with self.assertRaises(FileNotFoundError): tempfile._get_default_tempdir() diff --git a/Misc/NEWS b/Misc/NEWS index d9494c13b3c96b..4c90aa83dfb0da 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -199,6 +199,12 @@ Build Tests ----- +- bpo-30197: Enhanced functions swap_attr() and swap_item() in the + test.support module. They now work when delete replaced attribute or item + inside the with statement. The old value of the attribute or item (or None + if it doesn't exist) now will be assigned to the target of the "as" clause, + if there is one. + - Issue #29571: to match the behaviour of the ``re.LOCALE`` flag, test_re.test_locale_flag now uses ``locale.getpreferredencoding(False)`` to determine the candidate encoding for the test regex (allowing it to correctly From 52630ae17aa5bd8bffdb430b6515d07ffbaabc9e Mon Sep 17 00:00:00 2001 From: csabella Date: Sat, 29 Apr 2017 20:43:11 -0400 Subject: [PATCH 173/220] [3.5] bpo-30208: DOC: fix small typos in IDLE (#1357) (cherry picked from commit d9af73330f46d79cc0c56d369f65ebeec3cb5334) --- Doc/library/idle.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index a629bc50dbc749..80dd6fac4b2c60 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -244,7 +244,7 @@ Go to File/Line single: stack viewer Debugger (toggle) - When actived, code entered in the Shell or run from an Editor will run + When activated, code entered in the Shell or run from an Editor will run under the debugger. In the Editor, breakpoints can be set with the context menu. This feature is still incomplete and somewhat experimental. @@ -372,7 +372,7 @@ the :kbd:`Command` key on Mac OSX. * :kbd:`C-l` center window around the insertion point - * :kbd:`C-b` go backwards one character without deleting (usually you can + * :kbd:`C-b` go backward one character without deleting (usually you can also use the cursor key for this) * :kbd:`C-f` go forward one character without deleting (usually you can @@ -394,7 +394,7 @@ After a block-opening statement, the next line is indented by 4 spaces (in the Python Shell window by one tab). After certain keywords (break, return etc.) the next line is dedented. In leading indentation, :kbd:`Backspace` deletes up to 4 spaces if they are there. :kbd:`Tab` inserts spaces (in the Python -Shell window one tab), number depends on Indent width. Currently tabs +Shell window one tab), number depends on Indent width. Currently, tabs are restricted to four spaces due to Tcl/Tk limitations. See also the indent/dedent region commands in the edit menu. @@ -418,7 +418,7 @@ If there is only one possible completion for the characters entered, a :kbd:`C-space` will open a completions window. In an empty string, this will contain the files in the current directory. On a blank line, it will contain the built-in and user-defined functions and -classes in the current name spaces, plus any modules imported. If some +classes in the current namespaces, plus any modules imported. If some characters have been entered, the ACW will attempt to be more specific. If a string of characters is typed, the ACW selection will jump to the @@ -557,7 +557,7 @@ IDLE-console differences As much as possible, the result of executing Python code with IDLE is the same as executing the same code in a console window. However, the different -interface and operation occasionally affects visible results. For instance, +interface and operation occasionally affect visible results. For instance, ``sys.modules`` starts with more entries. IDLE also replaces ``sys.stdin``, ``sys.stdout``, and ``sys.stderr`` with @@ -583,7 +583,7 @@ If firewall software complains anyway, you can ignore it. If the attempt to make the socket connection fails, Idle will notify you. Such failures are sometimes transient, but if persistent, the problem -may be either a firewall blocking the connecton or misconfiguration of +may be either a firewall blocking the connection or misconfiguration of a particular system. Until the problem is fixed, one can run Idle with the -n command line switch. @@ -619,14 +619,14 @@ Setting preferences The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. Keys can be user defined; -IDLE ships with four built in key sets. In addition a user can create a +IDLE ships with four built-in key sets. In addition, a user can create a custom key set in the Configure IDLE dialog under the keys tab. Extensions ^^^^^^^^^^ -IDLE contains an extension facility. Peferences for extensions can be +IDLE contains an extension facility. Preferences for extensions can be changed with Configure Extensions. See the beginning of config-extensions.def in the idlelib directory for further information. The default extensions are currently: From e37d163ab215964898705d0bdb9c5457fad53708 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 29 Apr 2017 22:18:51 -0700 Subject: [PATCH 174/220] [3.5] Improve the grammar in windows.rst (GH-1330) (GH-1359) (cherry picked from commit 80a3da4d4aad0b51893e1e2f696b6252eca80e07) --- Doc/using/windows.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index a4a6a30c362523..1db86075e743d1 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -517,9 +517,9 @@ Shebang Lines If the first line of a script file starts with ``#!``, it is known as a "shebang" line. Linux and other Unix like operating systems have native -support for such lines and are commonly used on such systems to indicate how -a script should be executed. This launcher allows the same facilities to be -using with Python scripts on Windows and the examples above demonstrate their +support for such lines and they are commonly used on such systems to indicate +how a script should be executed. This launcher allows the same facilities to +be used with Python scripts on Windows and the examples above demonstrate their use. To allow shebang lines in Python scripts to be portable between Unix and From 03a7ab77d2f75323e1f3e8b6a1c164e701d58bfb Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 11:16:21 +0200 Subject: [PATCH 175/220] bpo-30104: Use -fno-strict-aliasing on clang (#1376) (#1377) Python/dtoa.c is not compiled correctly with clang 4.0 and optimization level -O2 or higher, because of an aliasing issue on the double/ULong[2] union. Only compile dtoa.c with -fno-strict-aliasing. LLVM bug report: https://bugs.llvm.org//show_bug.cgi?id=31928 (cherry picked from commit 809101f14f27ddb394cd77c477470761ecf99f41) --- Makefile.pre.in | 9 +++++++++ configure | 35 ++++++++++++++++++++++++++++------- configure.ac | 34 +++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index e1436c3bfdca91..f0450effad0f5a 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -103,6 +103,8 @@ ARFLAGS= @ARFLAGS@ CFLAGSFORSHARED=@CFLAGSFORSHARED@ # C flags used for building the interpreter object files PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE +# Strict or non-strict aliasing flags used to compile dtoa.c, see above +CFLAGS_ALIASING=@CFLAGS_ALIASING@ # Machine-dependent subdirectories @@ -1532,6 +1534,13 @@ config.status: $(srcdir)/configure .c.o: $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< +# bpo-30104: dtoa.c uses union to cast double to unsigned long[2]. clang 4.0 +# with -O2 or higher and strict aliasing miscompiles the ratio() function +# causing rounding issues. Compile dtoa.c using -fno-strict-aliasing on clang. +# https://bugs.llvm.org//show_bug.cgi?id=31928 +Python/dtoa.o: Python/dtoa.c + $(CC) -c $(PY_CORE_CFLAGS) $(CFLAGS_ALIASING) -o $@ $< + # Run reindent on the library reindent: ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/reindent.py -r $(srcdir)/Lib diff --git a/configure b/configure index c84a8ec9e04a1a..f5fe5f459c394f 100755 --- a/configure +++ b/configure @@ -666,6 +666,7 @@ OTHER_LIBTOOL_OPT UNIVERSAL_ARCH_FLAGS CFLAGS_NODIST BASECFLAGS +CFLAGS_ALIASING OPT LLVM_PROF_FOUND target_os @@ -6859,6 +6860,7 @@ esac # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line + if test "${OPT-unset}" = "unset" then case $GCC in @@ -6871,30 +6873,49 @@ then WRAP="-fwrapv" fi - # Clang also needs -fwrapv case $CC in - *clang*) WRAP="-fwrapv" - ;; + *clang*) + cc_is_clang=1 + ;; + *) + if $CC --version 2>&1 | grep -q clang + then + cc_is_clang=1 + else + cc_is_clang= + fi esac + if test -n "${cc_is_clang}" + then + # Clang also needs -fwrapv + WRAP="-fwrapv" + # bpo-30104: disable strict aliasing to compile correctly dtoa.c, + # see Makefile.pre.in for more information + CFLAGS_ALIASING="-fno-strict-aliasing" + fi + case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g -Og -Wall" else - OPT="-g -O0 -Wall $STRICT_PROTO" + OPT="-g -O0 -Wall" fi else - OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" + OPT="-g $WRAP -O3 -Wall" fi ;; *) - OPT="-O3 -Wall $STRICT_PROTO" + OPT="-O3 -Wall" ;; esac + + OPT="$OPT $STRICT_PROTO" + case $ac_sys_system in SCO_SV*) OPT="$OPT -m486 -DSCO5" ;; diff --git a/configure.ac b/configure.ac index 779fe3764c7f5a..21284d01684587 100644 --- a/configure.ac +++ b/configure.ac @@ -1403,6 +1403,7 @@ esac # tweak OPT based on compiler and platform, only if the user didn't set # it on the command line AC_SUBST(OPT) +AC_SUBST(CFLAGS_ALIASING) if test "${OPT-unset}" = "unset" then case $GCC in @@ -1415,30 +1416,49 @@ then WRAP="-fwrapv" fi - # Clang also needs -fwrapv case $CC in - *clang*) WRAP="-fwrapv" - ;; + *clang*) + cc_is_clang=1 + ;; + *) + if $CC --version 2>&1 | grep -q clang + then + cc_is_clang=1 + else + cc_is_clang= + fi esac + if test -n "${cc_is_clang}" + then + # Clang also needs -fwrapv + WRAP="-fwrapv" + # bpo-30104: disable strict aliasing to compile correctly dtoa.c, + # see Makefile.pre.in for more information + CFLAGS_ALIASING="-fno-strict-aliasing" + fi + case $ac_cv_prog_cc_g in yes) if test "$Py_DEBUG" = 'true' ; then # Optimization messes up debuggers, so turn it off for # debug builds. if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then - OPT="-g -Og -Wall $STRICT_PROTO" + OPT="-g -Og -Wall" else - OPT="-g -O0 -Wall $STRICT_PROTO" + OPT="-g -O0 -Wall" fi else - OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" + OPT="-g $WRAP -O3 -Wall" fi ;; *) - OPT="-O3 -Wall $STRICT_PROTO" + OPT="-O3 -Wall" ;; esac + + OPT="$OPT $STRICT_PROTO" + case $ac_sys_system in SCO_SV*) OPT="$OPT -m486 -DSCO5" ;; From 092f4602c329e23b863692249cc630a3eba5b6b5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 11:45:45 +0200 Subject: [PATCH 176/220] bpo-30108: Restore sys.path in test_site (#1197) (#1379) Add setUpModule() and tearDownModule() functions to test_site to save/restore sys.path at the module level to prevent warning if the user site directory is created, since site.addsitedir() modifies sys.path. (cherry picked from commit b85c136903c6d2368162f7c4a58f258c9c69ead0) --- Lib/test/test_site.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index da20a3d21a936f..755eb9cdb84958 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -26,14 +26,27 @@ import site -if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): - # need to add user site directory for tests - try: - os.makedirs(site.USER_SITE) - site.addsitedir(site.USER_SITE) - except PermissionError as exc: - raise unittest.SkipTest('unable to create user site directory (%r): %s' - % (site.USER_SITE, exc)) + +OLD_SYS_PATH = None + + +def setUpModule(): + global OLD_SYS_PATH + OLD_SYS_PATH = sys.path[:] + + if site.ENABLE_USER_SITE and not os.path.isdir(site.USER_SITE): + # need to add user site directory for tests + try: + os.makedirs(site.USER_SITE) + # modify sys.path: will be restored by tearDownModule() + site.addsitedir(site.USER_SITE) + except PermissionError as exc: + raise unittest.SkipTest('unable to create user site directory (%r): %s' + % (site.USER_SITE, exc)) + + +def tearDownModule(): + sys.path[:] = OLD_SYS_PATH class HelperFunctionsTests(unittest.TestCase): From 3ceeb84b5a90e327ef55190105e82c926b0b8aab Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 16:26:04 +0200 Subject: [PATCH 177/220] bpo-30132: distutils BuildExtTestCase use temp_cwd (#1387) (#1388) BuildExtTestCase of test_distutils now uses support.temp_cwd() in setUp() to remove files created in the current working in all BuildExtTestCase unit tests, not only test_build_ext(). Fix the following warning: Warning -- files was modified by test_distutils Before: [] After: ['vc140.pdb'] (cherry picked from commit 30768958490c658fba0fe24f1cabbdad44be22ff) --- Lib/distutils/tests/test_build_ext.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index f3df564e37347d..ce13227126f74f 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -37,6 +37,13 @@ def setUp(self): from distutils.command import build_ext build_ext.USER_BASE = site.USER_BASE + # bpo-30132: On Windows, a .pdb file may be created in the current + # working directory. Create a temporary working directory to cleanup + # everything at the end of the test. + self.temp_cwd = support.temp_cwd() + self.temp_cwd.__enter__() + self.addCleanup(self.temp_cwd.__exit__, None, None, None) + def build_ext(self, *args, **kwargs): return build_ext(*args, **kwargs) From 89a54c73746417bae003a9985668fa665040d5d9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 16:48:36 +0200 Subject: [PATCH 178/220] bpo-30199: test_ssl closes all asyncore channels (#1381) (#1389) AsyncoreEchoServer of test_ssl now calls asyncore.close_all(ignore_all=True) to ensure that asyncore.socket_map is cleared once the test completes, even if ConnectionHandler was not correctly unregistered. Fix the following warning: Warning -- asyncore.socket_map was modified by test_ssl Before: {} After: {6: } (cherry picked from commit 1dae7450c68bad498e57800387b24cb103c461fa) --- Lib/test/test_ssl.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 551558304fcdd6..ffb7314f577c19 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -2034,7 +2034,7 @@ class AsyncoreEchoServer(threading.Thread): class EchoServer (asyncore.dispatcher): - class ConnectionHandler (asyncore.dispatcher_with_send): + class ConnectionHandler(asyncore.dispatcher_with_send): def __init__(self, conn, certfile): self.socket = ssl.wrap_socket(conn, server_side=True, @@ -2125,6 +2125,8 @@ def __exit__(self, *args): self.join() if support.verbose: sys.stdout.write(" cleanup: successfully joined.\n") + # make sure that ConnectionHandler is removed from socket_map + asyncore.close_all(ignore_all=True) def start (self, flag=None): self.flag = flag From 9b854debea4dbd91c9ffc36f084a90fa225d5197 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 2 May 2017 23:06:39 +0200 Subject: [PATCH 179/220] Issue 27372: Stop test_idle from changing locale, so test passes. (#1397) In 3.6, the warning is now called an error, making it harder to ignore. (cherry picked from commit 7c1534141d3a159a32db9742e1d201d5c7a9ba81) --- Lib/idlelib/EditorWindow.py | 8 +++- Lib/idlelib/IOBinding.py | 86 ++++++++++++++++++++----------------- Lib/idlelib/__init__.py | 1 + Lib/test/test_idle.py | 15 ++++--- 4 files changed, 62 insertions(+), 48 deletions(-) diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py index 9944da3e7084c7..861353669d7520 100644 --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -25,9 +25,9 @@ # The default tab setting for a Text widget, in average-width characters. TK_TABWIDTH_DEFAULT = 8 - _py_version = ' (%s)' % platform.python_version() + def _sphinx_version(): "Format sys.version_info to produce the Sphinx version string used to install the chm docs" major, minor, micro, level, serial = sys.version_info @@ -92,11 +92,12 @@ class EditorWindow(object): from idlelib.Percolator import Percolator from idlelib.ColorDelegator import ColorDelegator, color_config from idlelib.UndoDelegator import UndoDelegator - from idlelib.IOBinding import IOBinding, filesystemencoding, encoding + from idlelib.IOBinding import IOBinding, encoding from idlelib import Bindings from tkinter import Toplevel from idlelib.MultiStatusBar import MultiStatusBar + filesystemencoding = sys.getfilesystemencoding() # for file names help_url = None def __init__(self, flist=None, filename=None, key=None, root=None): @@ -1686,5 +1687,8 @@ def _editor_window(parent): # htest # # edit.text.bind("<>", edit.close_event) if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_editor', verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(_editor_window) diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py index 84f39a2fee8e55..efd0d5e68ca4d2 100644 --- a/Lib/idlelib/IOBinding.py +++ b/Lib/idlelib/IOBinding.py @@ -10,57 +10,60 @@ import tkinter.messagebox as tkMessageBox from tkinter.simpledialog import askstring +import idlelib from idlelib.configHandler import idleConf - -# Try setting the locale, so that we can find out -# what encoding to use -try: - import locale - locale.setlocale(locale.LC_CTYPE, "") -except (ImportError, locale.Error): - pass - -# Encoding for file names -filesystemencoding = sys.getfilesystemencoding() ### currently unused - -locale_encoding = 'ascii' -if sys.platform == 'win32': - # On Windows, we could use "mbcs". However, to give the user - # a portable encoding name, we need to find the code page - try: - locale_encoding = locale.getdefaultlocale()[1] - codecs.lookup(locale_encoding) - except LookupError: - pass +if idlelib.testing: # Set True by test.test_idle to avoid setlocale. + encoding = 'utf-8' else: + # Try setting the locale, so that we can find out + # what encoding to use try: - # Different things can fail here: the locale module may not be - # loaded, it may not offer nl_langinfo, or CODESET, or the - # resulting codeset may be unknown to Python. We ignore all - # these problems, falling back to ASCII - locale_encoding = locale.nl_langinfo(locale.CODESET) - if locale_encoding is None or locale_encoding is '': - # situation occurs on Mac OS X - locale_encoding = 'ascii' - codecs.lookup(locale_encoding) - except (NameError, AttributeError, LookupError): - # Try getdefaultlocale: it parses environment variables, - # which may give a clue. Unfortunately, getdefaultlocale has - # bugs that can cause ValueError. + import locale + locale.setlocale(locale.LC_CTYPE, "") + except (ImportError, locale.Error): + pass + + locale_decode = 'ascii' + if sys.platform == 'win32': + # On Windows, we could use "mbcs". However, to give the user + # a portable encoding name, we need to find the code page try: locale_encoding = locale.getdefaultlocale()[1] + codecs.lookup(locale_encoding) + except LookupError: + pass + else: + try: + # Different things can fail here: the locale module may not be + # loaded, it may not offer nl_langinfo, or CODESET, or the + # resulting codeset may be unknown to Python. We ignore all + # these problems, falling back to ASCII + locale_encoding = locale.nl_langinfo(locale.CODESET) if locale_encoding is None or locale_encoding is '': # situation occurs on Mac OS X locale_encoding = 'ascii' codecs.lookup(locale_encoding) - except (ValueError, LookupError): - pass + except (NameError, AttributeError, LookupError): + # Try getdefaultlocale: it parses environment variables, + # which may give a clue. Unfortunately, getdefaultlocale has + # bugs that can cause ValueError. + try: + locale_encoding = locale.getdefaultlocale()[1] + if locale_encoding is None or locale_encoding is '': + # situation occurs on Mac OS X + locale_encoding = 'ascii' + codecs.lookup(locale_encoding) + except (ValueError, LookupError): + pass -locale_encoding = locale_encoding.lower() + locale_encoding = locale_encoding.lower() -encoding = locale_encoding ### KBK 07Sep07 This is used all over IDLE, check! - ### 'encoding' is used below in encode(), check! + encoding = locale_encoding + # Encoding is used in multiple files; locale_encoding nowhere. + # The only use of 'encoding' below is in _decode as initial value + # of deprecated block asking user for encoding. + # Perhaps use elsewhere should be reviewed. coding_re = re.compile(r'^[ \t\f]*#.*?coding[:=][ \t]*([-\w.]+)', re.ASCII) blank_re = re.compile(r'^[ \t\f]*(?:[#\r\n]|$)', re.ASCII) @@ -301,7 +304,7 @@ def _decode(self, two_lines, bytes): "The file's encoding is invalid for Python 3.x.\n" "IDLE will convert it to UTF-8.\n" "What is the current encoding of the file?", - initialvalue = locale_encoding, + initialvalue = encoding, parent = self.editwin.text) if enc: @@ -561,5 +564,8 @@ def savecopy(self, event): IOBinding(editwin) if __name__ == "__main__": + import unittest + unittest.main('idlelib.idle_test.test_iomenu', verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(_io_binding) diff --git a/Lib/idlelib/__init__.py b/Lib/idlelib/__init__.py index 711f61bb6928d5..208ced13a621b7 100644 --- a/Lib/idlelib/__init__.py +++ b/Lib/idlelib/__init__.py @@ -6,3 +6,4 @@ The other files are private implementations. Their details are subject to change. See PEP 434 for more. Import them at your own risk. """ +testing = False # Set True by test.test_idle. diff --git a/Lib/test/test_idle.py b/Lib/test/test_idle.py index 141e89e4931881..7df98ff4366a03 100644 --- a/Lib/test/test_idle.py +++ b/Lib/test/test_idle.py @@ -2,15 +2,18 @@ from test import support from test.support import import_module -# Skip test if _thread or _tkinter wasn't built or idlelib was deleted. +# Skip test if _thread or _tkinter wasn't built, or idlelib is missing, +# or if tcl/tk version before 8.5, which is needed for ttk widgets. + import_module('threading') # imported by PyShell, imports _thread tk = import_module('tkinter') # imports _tkinter -idletest = import_module('idlelib.idle_test') +idlelib = import_module('idlelib') +idlelib.testing = True # Avoid locale-changed test error -# Without test_main present, regrtest.runtest_inner (line1219) calls -# unittest.TestLoader().loadTestsFromModule(this_module) which calls -# load_tests() if it finds it. (Unittest.main does the same.) -load_tests = idletest.load_tests +# Without test_main present, test.libregrtest.runtest.runtest_inner +# calls (line 173) unittest.TestLoader().loadTestsFromModule(module) +# which calls load_tests() if it finds it. (Unittest.main does the same.) +from idlelib.idle_test import load_tests if __name__ == '__main__': unittest.main(verbosity=2, exit=False) From 360fb81367bb409bb7a1d261d88fcf82cee528f0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 May 2017 00:06:17 +0200 Subject: [PATCH 180/220] [3.5] bpo-30232: Support Git worktree in configure.ac (#1398) (#1401) * bpo-30232: Support Git worktree in configure.ac (#1391) Don't test if .git/HEAD file exists, but only if the .git file (or directory) exists. (cherry picked from commit 5facdbb29169c2799c42f887cef4cd9d087b0167) * bpo-30232: Regenerate configure (#1396) Run autoconf. (cherry picked from commit 9ed34a89532763cf89f5e11fffb91ef7dee29fed) (cherry picked from commit 4dae0d111dd7bb34ec730eea2327a3219acff211) --- configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index f5fe5f459c394f..a6d83f266008c9 100755 --- a/configure +++ b/configure @@ -2840,7 +2840,7 @@ fi -if test -e $srcdir/.git/HEAD +if test -e $srcdir/.git then # Extract the first word of "git", so it can be a program name with args. set dummy git; ac_word=$2 diff --git a/configure.ac b/configure.ac index 21284d01684587..22ac805a66a3f6 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ AC_SUBST(GITVERSION) AC_SUBST(GITTAG) AC_SUBST(GITBRANCH) -if test -e $srcdir/.git/HEAD +if test -e $srcdir/.git then AC_CHECK_PROG(HAS_GIT, git, found, not-found) else From 0d9d61828bbd6cbc289489bf1d439fa91eca3743 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 3 May 2017 00:22:28 +0200 Subject: [PATCH 181/220] Backport bpo-30205 to 3.5 (#1404) --- Lib/test/test_socket.py | 4 ++++ Misc/NEWS | 2 ++ Modules/socketmodule.c | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index b72fc8fbf0cadd..c652c6fd01428f 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -4589,6 +4589,10 @@ def bind(self, sock, path): else: raise + def testUnbound(self): + # Issue #30205 + self.assertIn(self.sock.getsockname(), (None, '')) + def testStrAddr(self): # Test binding to and retrieving a normal string pathname. path = os.path.abspath(support.TESTFN) diff --git a/Misc/NEWS b/Misc/NEWS index 4c90aa83dfb0da..c428d77f17b754 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,8 @@ Extension Modules Library ------- +- bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. + - bpo-30070: Fixed leaks and crashes in errors handling in the parser module. - bpo-30061: Fixed crashes in IOBase methods __next__() and readlines() when diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index af6cc94415b686..47abe8d3f2c6ee 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1183,9 +1183,9 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto) { struct sockaddr_un *a = (struct sockaddr_un *) addr; #ifdef linux - if (a->sun_path[0] == 0) { /* Linux abstract namespace */ - addrlen -= offsetof(struct sockaddr_un, sun_path); - return PyBytes_FromStringAndSize(a->sun_path, addrlen); + size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path); + if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */ + return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen); } else #endif /* linux */ From 22982350235f8c5821b71661a5616423e1c7fcc0 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 May 2017 02:12:34 +0200 Subject: [PATCH 182/220] regrtest: always show before/after of modified env (#1407) Buildbots don't run tests with -vv and so only log "xxx was modified by test_xxx" which is not enough to debug such random issue. In many cases, I'm unable to reproduce the warning and so unable to fix it. Always logging the value before and value after should help to debug such warning on buildbots. (cherry picked from commit ec4b17239d899550be4ee6104b61751bb3c70382) --- Lib/test/regrtest.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 12909ec4778319..d7ca07b6647986 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1267,10 +1267,9 @@ def __exit__(self, exc_type, exc_val, exc_tb): print("Warning -- {} was modified by {}".format( name, self.testname), file=sys.stderr) - if self.verbose > 1 and not self.pgo: - print(" Before: {}\n After: {} ".format( - original, current), - file=sys.stderr) + print(" Before: {}\n After: {} ".format( + original, current), + file=sys.stderr) return False From f99623a5bee30b18a8fa55a9061753064d8a88f4 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Tue, 2 May 2017 21:36:01 -0700 Subject: [PATCH 183/220] [3.5] Fix typo in selectors.rst (GH-1383) (#1415) decriptor -> descriptor (cherry picked from commit b0d82036549074357717d130a772d1e2ebc8ea01) --- Doc/library/selectors.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst index 1624d88aaed38d..6d864a836de075 100644 --- a/Doc/library/selectors.rst +++ b/Doc/library/selectors.rst @@ -68,7 +68,7 @@ constants below: .. class:: SelectorKey A :class:`SelectorKey` is a :class:`~collections.namedtuple` used to - associate a file object to its underlying file decriptor, selected event + associate a file object to its underlying file descriptor, selected event mask and attached data. It is returned by several :class:`BaseSelector` methods. From 23b312b087582cec5cc8c528d267eb42061601ac Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 May 2017 12:04:57 +0200 Subject: [PATCH 184/220] [3.6] bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS (#463) (#1424) Skip some tests of select.poll when running on macOS due to unresolved issues with the underlying system poll function on some macOS versions. (cherry picked from commit de04644627f82d9dc48b3423def7ff5b4aa1926a) (cherry picked from commit 1d391f926b37484b8d4b326003a72c0084db19ec) --- Lib/test/eintrdata/eintr_tester.py | 2 ++ Lib/test/test_asyncore.py | 3 +++ Misc/NEWS | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index e3f1aa519e0fe9..81b6277a0401ff 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -424,6 +424,8 @@ def test_select(self): self.stop_alarm() self.assertGreaterEqual(dt, self.sleep_time) + @unittest.skipIf(sys.platform == "darwin", + "poll may fail on macOS; see issue #28087") @unittest.skipUnless(hasattr(select, 'poll'), 'need select.poll') def test_poll(self): poller = select.poll() diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 38579168cfd47d..18f1ea23fae8cc 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -656,6 +656,9 @@ def test_handle_expt(self): if HAS_UNIX_SOCKETS and self.family == socket.AF_UNIX: self.skipTest("Not applicable to AF_UNIX sockets.") + if sys.platform == "darwin" and self.use_poll: + self.skipTest("poll may fail on macOS; see issue #28087") + class TestClient(BaseClient): def handle_expt(self): self.socket.recv(1024, socket.MSG_OOB) diff --git a/Misc/NEWS b/Misc/NEWS index c428d77f17b754..c7d273c2414d21 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -201,6 +201,10 @@ Build Tests ----- +- bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS. + Skip some tests of select.poll when running on macOS due to unresolved + issues with the underlying system poll function on some macOS versions. + - bpo-30197: Enhanced functions swap_attr() and swap_item() in the test.support module. They now work when delete replaced attribute or item inside the with statement. The old value of the attribute or item (or None From 5e9c1101924bacf3ead03124b5c1e48551638360 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 3 May 2017 14:11:35 +0200 Subject: [PATCH 185/220] bpo-24725: Skip the test_socket.testFDPassEmpty on OS X (#1427) In OS X 10.11, the test fails consistently due to a platform change since 10.10. Thanks to Jeff Ramnani for the patch. (cherry picked from commit 3c61a448f106c7cafb050ff7be5c5c421273e68f) --- Lib/test/test_socket.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index c652c6fd01428f..58c04d71045d56 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -2844,6 +2844,7 @@ def sendAncillaryIfPossible(self, msg, ancdata): nbytes = self.sendmsgToServer([msg]) self.assertEqual(nbytes, len(msg)) + @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #24725") def testFDPassEmpty(self): # Try to pass an empty FD array. Can receive either no array # or an empty array. From 4b15e45895ca56ac5f7837cacb8cd3ccc26d1f66 Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 3 May 2017 09:37:50 -0700 Subject: [PATCH 186/220] [3.5] bpo-28556: Routine updates to typing (GH-1366) (#1417) - Add NoReturn type - Use WrapperDescriptorType (original PR by Jim Fasarakis-Hilliard) - Minor bug-fixes (cherry picked from commit f06e0218ef6007667f5d61184b85a81a0466d3ae) --- Lib/test/test_typing.py | 51 +++++++++++++++++++++++++++++++++++++---- Lib/typing.py | 35 ++++++++++++++++++++++++---- Misc/NEWS | 4 ++++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index f0070ec975791a..b3cabda394497e 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -6,7 +6,7 @@ from unittest import TestCase, main, skipUnless, SkipTest from copy import copy, deepcopy -from typing import Any +from typing import Any, NoReturn from typing import TypeVar, AnyStr from typing import T, KT, VT # Not in __all__. from typing import Union, Optional @@ -102,10 +102,6 @@ def test_cannot_instantiate(self): with self.assertRaises(TypeError): type(Any)() - def test_cannot_subscript(self): - with self.assertRaises(TypeError): - Any[int] - def test_any_works_with_alias(self): # These expressions must simply not fail. typing.Match[Any] @@ -113,6 +109,40 @@ def test_any_works_with_alias(self): typing.IO[Any] +class NoReturnTests(BaseTestCase): + + def test_noreturn_instance_type_error(self): + with self.assertRaises(TypeError): + isinstance(42, NoReturn) + + def test_noreturn_subclass_type_error(self): + with self.assertRaises(TypeError): + issubclass(Employee, NoReturn) + with self.assertRaises(TypeError): + issubclass(NoReturn, Employee) + + def test_repr(self): + self.assertEqual(repr(NoReturn), 'typing.NoReturn') + + def test_not_generic(self): + with self.assertRaises(TypeError): + NoReturn[int] + + def test_cannot_subclass(self): + with self.assertRaises(TypeError): + class A(NoReturn): + pass + with self.assertRaises(TypeError): + class A(type(NoReturn)): + pass + + def test_cannot_instantiate(self): + with self.assertRaises(TypeError): + NoReturn() + with self.assertRaises(TypeError): + type(NoReturn)() + + class TypeVarTests(BaseTestCase): def test_basic_plain(self): @@ -2273,6 +2303,14 @@ def _fields(self): return 'no chance for this' """) + with self.assertRaises(AttributeError): + exec(""" +class XMethBad2(NamedTuple): + x: int + def _source(self): + return 'no chance for this as well' +""") + @skipUnless(PY36, 'Python 3.6 required') def test_namedtuple_keyword_usage(self): LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int) @@ -2420,6 +2458,9 @@ def test_all(self): self.assertNotIn('sys', a) # Check that Text is defined. self.assertIn('Text', a) + # Check previously missing classes. + self.assertIn('SupportsBytes', a) + self.assertIn('SupportsComplex', a) if __name__ == '__main__': diff --git a/Lib/typing.py b/Lib/typing.py index 9a0f49099a3114..645bc6f8ae0edd 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -11,9 +11,9 @@ except ImportError: import collections as collections_abc # Fallback for PY3.2. try: - from types import SlotWrapperType, MethodWrapperType, MethodDescriptorType + from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType except ImportError: - SlotWrapperType = type(object.__init__) + WrapperDescriptorType = type(object.__init__) MethodWrapperType = type(object().__str__) MethodDescriptorType = type(str.join) @@ -63,6 +63,8 @@ # Structural checks, a.k.a. protocols. 'Reversible', 'SupportsAbs', + 'SupportsBytes', + 'SupportsComplex', 'SupportsFloat', 'SupportsInt', 'SupportsRound', @@ -420,6 +422,31 @@ def __subclasscheck__(self, cls): Any = _Any(_root=True) +class _NoReturn(_FinalTypingBase, _root=True): + """Special type indicating functions that never return. + Example:: + + from typing import NoReturn + + def stop() -> NoReturn: + raise Exception('no way') + + This type is invalid in other positions, e.g., ``List[NoReturn]`` + will fail in static type checkers. + """ + + __slots__ = () + + def __instancecheck__(self, obj): + raise TypeError("NoReturn cannot be used with isinstance().") + + def __subclasscheck__(self, cls): + raise TypeError("NoReturn cannot be used with issubclass().") + + +NoReturn = _NoReturn(_root=True) + + class TypeVar(_TypingBase, _root=True): """Type variable. @@ -1450,7 +1477,7 @@ def _get_defaults(func): _allowed_types = (types.FunctionType, types.BuiltinFunctionType, types.MethodType, types.ModuleType, - SlotWrapperType, MethodWrapperType, MethodDescriptorType) + WrapperDescriptorType, MethodWrapperType, MethodDescriptorType) def get_type_hints(obj, globalns=None, localns=None): @@ -2051,7 +2078,7 @@ def _make_nmtuple(name, types): # attributes prohibited to set in NamedTuple class syntax _prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__', '_fields', '_field_defaults', '_field_types', - '_make', '_replace', '_asdict') + '_make', '_replace', '_asdict', '_source') _special = ('__module__', '__name__', '__qualname__', '__annotations__') diff --git a/Misc/NEWS b/Misc/NEWS index c7d273c2414d21..93bd30ffd374d9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Extension Modules Library ------- +- bpo-28556: Various updates to typing module: add typing.NoReturn type, use + WrapperDescriptorType, minor bug-fixes. Original PRs by + Jim Fasarakis-Hilliard and Ivan Levkivskyi. + - bpo-30205: Fix getsockname() for unbound AF_UNIX sockets on Linux. - bpo-30070: Fixed leaks and crashes in errors handling in the parser module. From 5274faf5e360f74690ffb735e919cdba5fdbdf1c Mon Sep 17 00:00:00 2001 From: Mariatta Date: Wed, 3 May 2017 18:41:12 -0700 Subject: [PATCH 187/220] [3.5] bpo-28315: Improve code examples in docs (GH-1372) (#1446) Replace File "", line 1, in ? with File "", line 1, in (cherry picked from commit 8856940cf2e82cb17db2b684cd5732fe658605ca) --- Doc/extending/newtypes.rst | 2 +- Doc/howto/functional.rst | 6 +++--- Doc/library/ctypes.rst | 30 +++++++++++++++--------------- Doc/library/doctest.rst | 6 +++--- Doc/library/fpectl.rst | 2 +- Doc/library/pdb.rst | 2 +- Doc/library/unicodedata.rst | 2 +- Doc/reference/expressions.rst | 2 +- Doc/tutorial/classes.rst | 2 +- Doc/tutorial/controlflow.rst | 2 +- Doc/tutorial/datastructures.rst | 2 +- Doc/tutorial/inputoutput.rst | 2 +- 12 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index b8ce4377877e70..003b4e505d3247 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -124,7 +124,7 @@ our objects and in some error messages, for example:: >>> "" + noddy.new_noddy() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: cannot add type "noddy.Noddy" to string Note that the name is a dotted name that includes both the module name and the diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index 8ae9679894a578..a82dca7077e905 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -210,7 +210,7 @@ You can experiment with the iteration interface manually: 3 >>> next(it) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in StopIteration >>> @@ -474,7 +474,7 @@ Here's a sample usage of the ``generate_ints()`` generator: 2 >>> next(gen) Traceback (most recent call last): - File "stdin", line 1, in ? + File "stdin", line 1, in File "stdin", line 2, in generate_ints StopIteration @@ -577,7 +577,7 @@ And here's an example of changing the counter: 9 >>> next(it) #doctest: +SKIP Traceback (most recent call last): - File "t.py", line 15, in ? + File "t.py", line 15, in it.next() StopIteration diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 3536b32139e71b..97a59a7a5a436b 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -97,7 +97,7 @@ Functions are accessed as attributes of dll objects:: <_FuncPtr object at 0x...> >>> print(windll.kernel32.MyOwnFunction) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "ctypes.py", line 239, in __getattr__ func = _StdcallFuncPtr(name, self) AttributeError: function 'MyOwnFunction' not found @@ -135,7 +135,7 @@ functions can be accessed by indexing the dll object with the ordinal number:: <_FuncPtr object at 0x...> >>> cdll.kernel32[0] # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "ctypes.py", line 310, in __getitem__ func = _StdcallFuncPtr(name, self) AttributeError: function ordinal 0 not found @@ -168,11 +168,11 @@ although an error is raised the function *has* been called:: >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with not enough arguments (4 bytes missing) >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with too many arguments (4 bytes in excess) >>> @@ -181,13 +181,13 @@ The same exception is raised when you call an ``stdcall`` function with the >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with not enough arguments (4 bytes missing) >>> >>> windll.msvcrt.printf(b"spam") # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: Procedure probably called with too many arguments (4 bytes in excess) >>> @@ -200,7 +200,7 @@ argument values:: >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in OSError: exception: access violation reading 0x00000020 >>> @@ -373,7 +373,7 @@ from within *IDLE* or *PythonWin*:: 19 >>> printf(b"%f bottles of beer\n", 42.5) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: Don't know how to convert parameter 2 >>> @@ -436,7 +436,7 @@ prototype for a C function), and tries to convert the arguments to valid types:: >>> printf(b"%d %d %d", 1, 2, 3) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: wrong type >>> printf(b"%s %d %f\n", b"X", 2, 3) X 2 3.000000 @@ -486,7 +486,7 @@ single character Python bytes object into a C char:: 'def' >>> strchr(b"abcdef", b"def") Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ArgumentError: argument 2: exceptions.TypeError: one character string expected >>> print(strchr(b"abcdef", b"x")) None @@ -512,7 +512,7 @@ useful to check for error return values and automatically raise an exception:: 486539264 >>> GetModuleHandle("something silly") # doctest: +WINDOWS Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "", line 3, in ValidHandle OSError: [Errno 126] The specified module could not be found. >>> @@ -583,7 +583,7 @@ Here is a simple example of a POINT structure, which contains two integers named 0 5 >>> POINT(1, 2, 3) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: too many initializers >>> @@ -786,7 +786,7 @@ new type:: >>> PI(42) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: expected c_long instead of int >>> PI(c_int(42)) @@ -862,7 +862,7 @@ but not instances of other types:: >>> bar.values = (c_byte * 4)() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance >>> @@ -913,7 +913,7 @@ work:: ... ("next", POINTER(cell))] ... Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "", line 2, in cell NameError: name 'cell' is not defined >>> diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 15b12f7aa786ea..587a0a09a94791 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -408,7 +408,7 @@ Simple example:: >>> [1, 2, 3].remove(42) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: list.remove(x): x not in list That doctest succeeds if :exc:`ValueError` is raised, with the ``list.remove(x): @@ -432,7 +432,7 @@ multi-line detail:: >>> raise ValueError('multi\n line\ndetail') Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: multi line detail @@ -591,7 +591,7 @@ doctest decides whether actual output matches an example's expected output: >>> (1, 2)[3] = 'moo' Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: object doesn't support item assignment passes under Python 2.3 and later Python versions with the flag specified, diff --git a/Doc/library/fpectl.rst b/Doc/library/fpectl.rst index e4b528cf0b0b6f..96607165ba4e3e 100644 --- a/Doc/library/fpectl.rst +++ b/Doc/library/fpectl.rst @@ -89,7 +89,7 @@ The following example demonstrates how to start up and test operation of the >>> import math >>> math.exp(1000) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in FloatingPointError: in math_1 diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index ba9e547317f9db..7bc729c28d7d90 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -76,7 +76,7 @@ The typical usage to inspect a crashed program is:: >>> import mymodule >>> mymodule.test() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in File "./mymodule.py", line 4, in test test2() File "./mymodule.py", line 3, in test2 diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst index 6cd8132f8a9870..51b0b66ebae497 100644 --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -158,7 +158,7 @@ Examples: 9 >>> unicodedata.decimal('a') Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: not a decimal >>> unicodedata.category('A') # 'L'etter, 'u'ppercase 'Lu' diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index d4d007330c7972..437a35062585a5 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -745,7 +745,7 @@ keyword arguments (and any ``**expression`` arguments -- see below). So:: 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2 diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index e134d5d62ea667..073444cf8b3985 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -784,7 +784,7 @@ using the :func:`next` built-in function; this example shows how it all works:: 'c' >>> next(it) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in next(it) StopIteration diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 12989b2a53069b..fbe4e924f0c5b9 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -472,7 +472,7 @@ Here's an example that fails due to this restriction:: ... >>> function(0, a=0) Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in TypeError: function() got multiple values for keyword argument 'a' When a final formal parameter of the form ``**name`` is present, it receives a diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst index 6140ece046b975..1a73ac9d05936a 100644 --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -261,7 +261,7 @@ it must be parenthesized. :: [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)] >>> # the tuple must be parenthesized, otherwise an error is raised >>> [x, x**2 for x in range(6)] - File "", line 1, in ? + File "", line 1, in [x, x**2 for x in range(6)] ^ SyntaxError: invalid syntax diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index dd9c7cd7315d6e..5add11a8a49b8b 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -361,7 +361,7 @@ attempts to use the file object will automatically fail. :: >>> f.close() >>> f.read() Traceback (most recent call last): - File "", line 1, in ? + File "", line 1, in ValueError: I/O operation on closed file It is good practice to use the :keyword:`with` keyword when dealing with file From 943861f09ab6bffcd1d97efcd0dd6c87c7f26800 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 4 May 2017 06:50:43 +0300 Subject: [PATCH 188/220] [3.5] bpo-30184: Add tests for invalid use of PyArg_ParseTupleAndKeywords. (GH-1316). (#1442) (cherry picked from commit 5f161fd86dd5bb936a1a2a13391b13b7e59ec201) --- Lib/test/test_capi.py | 34 +++++++++++++++++++++++++++------- Modules/_testcapimodule.c | 4 ++-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 042e5aaae35064..f4048583ed1173 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -487,9 +487,8 @@ def test_skipitem(self): # test the format unit when not skipped format = c + "i" try: - # (note: the format string must be bytes!) _testcapi.parse_tuple_and_keywords(tuple_1, dict_b, - format.encode("ascii"), keywords) + format, keywords) when_not_skipped = False except TypeError as e: s = "argument 1 (impossible)" @@ -501,7 +500,7 @@ def test_skipitem(self): optional_format = "|" + format try: _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b, - optional_format.encode("ascii"), keywords) + optional_format, keywords) when_skipped = False except RuntimeError as e: s = "impossible: '{}'".format(format) @@ -514,15 +513,36 @@ def test_skipitem(self): self.assertIs(when_skipped, when_not_skipped, message) def test_parse_tuple_and_keywords(self): - # parse_tuple_and_keywords error handling tests + # Test handling errors in the parse_tuple_and_keywords helper itself self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords, (), {}, 42, []) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', 42) + (), {}, '', 42) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', [''] * 42) + (), {}, '', [''] * 42) self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords, - (), {}, b'', [42]) + (), {}, '', [42]) + + def test_bad_use(self): + # Test handling invalid format and keywords in + # PyArg_ParseTupleAndKeywords() + self.assertRaises((TypeError, SystemError), _testcapi.parse_tuple_and_keywords, + (1,), {}, '||O', ['a']) + self.assertRaises((RuntimeError, SystemError), _testcapi.parse_tuple_and_keywords, + (1, 2), {}, '|O|O', ['a', 'b']) + self.assertRaises((TypeError, SystemError), _testcapi.parse_tuple_and_keywords, + (), {'a': 1}, '$$O', ['a']) + self.assertRaises((RuntimeError, SystemError), _testcapi.parse_tuple_and_keywords, + (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b']) + self.assertRaises((TypeError, SystemError), _testcapi.parse_tuple_and_keywords, + (), {'a': 1}, '$|O', ['a']) + self.assertRaises((RuntimeError, SystemError), _testcapi.parse_tuple_and_keywords, + (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b']) + self.assertRaises((RuntimeError, SystemError), _testcapi.parse_tuple_and_keywords, + (1,), {}, '|O', ['a', 'b']) + self.assertRaises((RuntimeError, SystemError), _testcapi.parse_tuple_and_keywords, + (1,), {}, '|OO', ['a']) + @unittest.skipUnless(threading, 'Threading required for this test.') class TestThreadState(unittest.TestCase): diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 060a92da4b0397..fabcaabe808795 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1548,7 +1548,7 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) { PyObject *sub_args; PyObject *sub_kwargs; - char *sub_format; + const char *sub_format; PyObject *sub_keywords; Py_ssize_t i, size; @@ -1561,7 +1561,7 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args) double buffers[8][4]; /* double ensures alignment where necessary */ - if (!PyArg_ParseTuple(args, "OOyO:parse_tuple_and_keywords", + if (!PyArg_ParseTuple(args, "OOsO:parse_tuple_and_keywords", &sub_args, &sub_kwargs, &sub_format, &sub_keywords)) return NULL; From 8a1c71053139f20348ea487c0c464694ed3c88c5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 4 May 2017 13:21:16 +0200 Subject: [PATCH 189/220] bpo-30225: Fix is_valid_fd() on macOS Tiger (#1443) (#1450) is_valid_fd() now uses fstat() instead of dup() on macOS to return 0 on a pipe when the other side of the pipe is closed. fstat() fails with EBADF in that case, whereas dup() succeed. (cherry picked from commit 1c4670ea0cc3d208121af11b9b973e6bb268e570) --- Python/pylifecycle.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 87dadc164c2645..422454c8730cbd 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -968,6 +968,14 @@ initsite(void) static int is_valid_fd(int fd) { +#ifdef __APPLE__ + /* bpo-30225: On macOS Tiger, when stdout is redirected to a pipe + and the other side of the pipe is closed, dup(1) succeed, whereas + fstat(1, &st) fails with EBADF. Prefer fstat() over dup() to detect + such error. */ + struct stat st; + return (fstat(fd, &st) == 0); +#else int fd2; if (fd < 0 || !_PyVerify_fd(fd)) return 0; @@ -977,6 +985,7 @@ is_valid_fd(int fd) close(fd2); _Py_END_SUPPRESS_IPH return fd2 >= 0; +#endif } /* returns Py_None if the fd is not valid */ From 7299088ccf5f72b8494063814b58a180b4250aa7 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 4 May 2017 17:16:48 +0200 Subject: [PATCH 190/220] [3.5] bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver (GH-1319) (#1455) * bpo-30185: avoid KeyboardInterrupt tracebacks in forkserver * Tweak comment. (cherry picked from commit 6dd4d734ed207ba16b017e38f8909de7ef187e29) --- Lib/multiprocessing/forkserver.py | 20 ++++++++++++++------ Misc/NEWS | 3 +++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py index ad01ede0e06f8c..1b4c7cbea08297 100644 --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -149,8 +149,15 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): util._close_stdin() - # ignoring SIGCHLD means no need to reap zombie processes - handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) + # ignoring SIGCHLD means no need to reap zombie processes; + # letting SIGINT through avoids KeyboardInterrupt tracebacks + handlers = { + signal.SIGCHLD: signal.SIG_IGN, + signal.SIGINT: signal.SIG_DFL, + } + old_handlers = {sig: signal.signal(sig, val) + for (sig, val) in handlers.items()} + with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ selectors.DefaultSelector() as selector: _forkserver._forkserver_address = listener.getsockname() @@ -175,7 +182,7 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): code = 1 if os.fork() == 0: try: - _serve_one(s, listener, alive_r, handler) + _serve_one(s, listener, alive_r, old_handlers) except Exception: sys.excepthook(*sys.exc_info()) sys.stderr.flush() @@ -186,11 +193,12 @@ def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): if e.errno != errno.ECONNABORTED: raise -def _serve_one(s, listener, alive_r, handler): - # close unnecessary stuff and reset SIGCHLD handler +def _serve_one(s, listener, alive_r, handlers): + # close unnecessary stuff and reset signal handlers listener.close() os.close(alive_r) - signal.signal(signal.SIGCHLD, handler) + for sig, val in handlers.items(): + signal.signal(sig, val) # receive fds from parent process fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) diff --git a/Misc/NEWS b/Misc/NEWS index 93bd30ffd374d9..1852d687f7393a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process + when Ctrl-C is received. + - bpo-28556: Various updates to typing module: add typing.NoReturn type, use WrapperDescriptorType, minor bug-fixes. Original PRs by Jim Fasarakis-Hilliard and Ivan Levkivskyi. From ab6b962ef241be97536573d7490ce1cfc74fde18 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 5 May 2017 02:19:59 +0200 Subject: [PATCH 191/220] bpo-23404: make touch becomes make regen-all (#1405) (#1461) (#1465) * bpo-23404: make touch becomes make regen-all (#1405) Don't rebuild generated files based on file modification time anymore, the action is now explicit. Replace "make touch" with "make regen-all". Changes: * Remove "make touch", Tools/hg/hgtouch.py and .hgtouch * Add a new "make regen-all" command to rebuild all generated files * Add subcommands to only generate specific files: - regen-ast: Include/Python-ast.h and Python/Python-ast.c - regen-grammar: Include/graminit.h and Python/graminit.c - regen-importlib: Python/importlib_external.h and Python/importlib.h - regen-opcode: Include/opcode.h - regen-opcode-targets: Python/opcode_targets.h - regen-typeslots: Objects/typeslots.inc * Rename PYTHON_FOR_GEN to PYTHON_FOR_REGEN * pgen is now only built by by "make regen-grammar" * Add $(srcdir)/ prefix to paths to source files to handle correctly compilation outside the source directory Note: $(PYTHON_FOR_REGEN) is no more used nor needed by "make" default target building Python. (cherry picked from commit a5c62a8e9f0de6c4133825a5710984a3cd5e102b) * bpo-30273: Update sysconfig (#1464) The AST_H_DIR variable was removed from Makefile.pre.in by the commit a5c62a8e9f0de6c4133825a5710984a3cd5e102b (bpo-23404). AST_H_DIR was hardcoded to "Include", so replace the removed variable by its content. Remove also ASDLGEN variable from sysconfig example since this variable was also removed. (cherry picked from commit b109a1d3360fc4bb87b9887264e3634632d392ca) (cherry picked from commit 9d02f562961efd12d3c8317a10916db7f77330cc) --- .hgtouch | 17 ---- Doc/library/sysconfig.rst | 1 - Lib/distutils/sysconfig.py | 2 +- Mac/BuildScript/build-installer.py | 3 - Makefile.pre.in | 149 ++++++++++++++--------------- Misc/NEWS | 4 + Tools/hg/hgtouch.py | 130 ------------------------- configure | 32 +++---- configure.ac | 13 +-- 9 files changed, 90 insertions(+), 261 deletions(-) delete mode 100644 .hgtouch delete mode 100644 Tools/hg/hgtouch.py diff --git a/.hgtouch b/.hgtouch deleted file mode 100644 index b9be0f11fdb829..00000000000000 --- a/.hgtouch +++ /dev/null @@ -1,17 +0,0 @@ -# -*- Makefile -*- -# Define dependencies of generated files that are checked into hg. -# The syntax of this file uses make rule dependencies, without actions - -Python/importlib.h: Lib/importlib/_bootstrap.py Programs/_freeze_importlib.c - -Include/opcode.h: Lib/opcode.py Tools/scripts/generate_opcode_h.py - -Include/Python-ast.h: Parser/Python.asdl Parser/asdl.py Parser/asdl_c.py -Python/Python-ast.c: Include/Python-ast.h - -Python/opcode_targets.h: Python/makeopcodetargets.py Lib/opcode.py - -Objects/typeslots.inc: Include/typeslots.h Objects/typeslots.py - -Include/graminit.h: Grammar/Grammar Parser/acceler.c Parser/grammar1.c Parser/listnode.c Parser/node.c Parser/parser.c Parser/bitset.c Parser/metagrammar.c Parser/firstsets.c Parser/grammar.c Parser/pgen.c Objects/obmalloc.c Python/dynamic_annotations.c Python/mysnprintf.c Python/pyctype.c Parser/tokenizer_pgen.c Parser/printgrammar.c Parser/parsetok_pgen.c Parser/pgenmain.c -Python/graminit.c: Include/graminit.h Grammar/Grammar Parser/acceler.c Parser/grammar1.c Parser/listnode.c Parser/node.c Parser/parser.c Parser/bitset.c Parser/metagrammar.c Parser/firstsets.c Parser/grammar.c Parser/pgen.c Objects/obmalloc.c Python/dynamic_annotations.c Python/mysnprintf.c Python/pyctype.c Parser/tokenizer_pgen.c Parser/printgrammar.c Parser/parsetok_pgen.c Parser/pgenmain.c diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index 02aaab3cf26f5e..4cbe23966bf1e8 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -255,7 +255,6 @@ You can use :mod:`sysconfig` as a script with Python's *-m* option: AIX_GENUINE_CPLUSPLUS = "0" AR = "ar" ARFLAGS = "rc" - ASDLGEN = "./Parser/asdl_c.py" ... This call will print in the standard output the information returned by diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 573724ddd778d1..4f321352151d56 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -97,7 +97,7 @@ def get_python_inc(plat_specific=0, prefix=None): if plat_specific: return base if _sys_home: - incdir = os.path.join(_sys_home, get_config_var('AST_H_DIR')) + incdir = os.path.join(_sys_home, 'Include') else: incdir = os.path.join(get_config_var('srcdir'), 'Include') return os.path.normpath(incdir) diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index c76c4f1a269708..fb112741e05a00 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1168,9 +1168,6 @@ def buildPython(): shellQuote(WORKDIR)[1:-1], shellQuote(WORKDIR)[1:-1])) - print("Running make touch") - runCommand("make touch") - print("Running make") runCommand("make") diff --git a/Makefile.pre.in b/Makefile.pre.in index f0450effad0f5a..04ef1a12019c15 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -224,7 +224,7 @@ LIBOBJS= @LIBOBJS@ PYTHON= python$(EXE) BUILDPYTHON= python$(BUILDEXE) -PYTHON_FOR_GEN=@PYTHON_FOR_GEN@ +PYTHON_FOR_REGEN=@PYTHON_FOR_REGEN@ PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ BUILD_GNU_TYPE= @build@ @@ -271,11 +271,6 @@ IO_OBJS= \ Modules/_io/stringio.o ########################################################################## -# Grammar -GRAMMAR_H= Include/graminit.h -GRAMMAR_C= Python/graminit.c -GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar - LIBFFI_INCLUDEDIR= @LIBFFI_INCLUDEDIR@ @@ -337,38 +332,9 @@ PARSER_HEADERS= \ PGENSRCS= $(PSRCS) $(PGSRCS) PGENOBJS= $(POBJS) $(PGOBJS) -########################################################################## -# opcode.h generation -OPCODE_H_DIR= $(srcdir)/Include -OPCODE_H_SCRIPT= $(srcdir)/Tools/scripts/generate_opcode_h.py -OPCODE_H= $(OPCODE_H_DIR)/opcode.h -OPCODE_H_GEN= $(PYTHON_FOR_GEN) $(OPCODE_H_SCRIPT) $(srcdir)/Lib/opcode.py $(OPCODE_H) -# -########################################################################## -# AST -AST_H_DIR= Include -AST_H= $(AST_H_DIR)/Python-ast.h -AST_C_DIR= Python -AST_C= $(AST_C_DIR)/Python-ast.c -AST_ASDL= $(srcdir)/Parser/Python.asdl - -ASDLGEN_FILES= $(srcdir)/Parser/asdl.py $(srcdir)/Parser/asdl_c.py -# Note that a build now requires Python to exist before the build starts. -# Use "hg touch" to fix up screwed up file mtimes in a checkout. -ASDLGEN= $(PYTHON_FOR_GEN) $(srcdir)/Parser/asdl_c.py - ########################################################################## # Python -OPCODETARGETS_H= \ - Python/opcode_targets.h - -OPCODETARGETGEN= \ - $(srcdir)/Python/makeopcodetargets.py - -OPCODETARGETGEN_FILES= \ - $(OPCODETARGETGEN) $(srcdir)/Lib/opcode.py - PYTHON_OBJS= \ Python/_warnings.o \ Python/Python-ast.o \ @@ -551,7 +517,8 @@ coverage-lcov: @echo "lcov report at $(COVERAGE_REPORT)/index.html" @echo -coverage-report: +# Force regeneration of parser and importlib +coverage-report: regen-grammar regen-importlib : # force rebuilding of parser and importlib @touch $(GRAMMAR_INPUT) @touch $(srcdir)/Lib/importlib/_bootstrap.py @@ -721,14 +688,24 @@ Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) -Python/importlib_external.h: @GENERATED_COMMENT@ $(srcdir)/Lib/importlib/_bootstrap_external.py Programs/_freeze_importlib +.PHONY: regen-importlib +regen-importlib: Programs/_freeze_importlib + # Regenerate Python/importlib_external.h + # from Lib/importlib/_bootstrap_external.py using _freeze_importlib ./Programs/_freeze_importlib \ - $(srcdir)/Lib/importlib/_bootstrap_external.py Python/importlib_external.h - -Python/importlib.h: @GENERATED_COMMENT@ $(srcdir)/Lib/importlib/_bootstrap.py Programs/_freeze_importlib + $(srcdir)/Lib/importlib/_bootstrap_external.py \ + $(srcdir)/Python/importlib_external.h + # Regenerate Python/importlib.h from Lib/importlib/_bootstrap.py + # using _freeze_importlib ./Programs/_freeze_importlib \ - $(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h + $(srcdir)/Lib/importlib/_bootstrap.py \ + $(srcdir)/Python/importlib.h + + +############################################################################ +# Regenerate all generated files +regen-all: regen-opcode regen-opcode-targets regen-typeslots regen-grammar regen-ast regen-importlib ############################################################################ # Special rules for object files @@ -787,15 +764,18 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(IO_OBJS): $(IO_H) -$(GRAMMAR_H): @GENERATED_COMMENT@ $(GRAMMAR_INPUT) $(PGEN) - @$(MKDIR_P) Include - $(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) -$(GRAMMAR_C): @GENERATED_COMMENT@ $(GRAMMAR_H) - touch $(GRAMMAR_C) - $(PGEN): $(PGENOBJS) $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) +.PHONY: regen-grammar +regen-grammar: $(PGEN) + # Regenerate Include/graminit.h and Python/graminit.c + # from Grammar/Grammar using pgen + @$(MKDIR_P) Include + $(PGEN) $(srcdir)/Grammar/Grammar \ + $(srcdir)/Include/graminit.h \ + $(srcdir)/Python/graminit.c + Parser/grammar.o: $(srcdir)/Parser/grammar.c \ $(srcdir)/Include/token.h \ $(srcdir)/Include/grammar.h @@ -807,18 +787,28 @@ Parser/printgrammar.o: $(srcdir)/Parser/printgrammar.c Parser/pgenmain.o: $(srcdir)/Include/parsetok.h -$(AST_H): $(AST_ASDL) $(ASDLGEN_FILES) - $(MKDIR_P) $(AST_H_DIR) - $(ASDLGEN) -h $(AST_H_DIR) $(AST_ASDL) - -$(AST_C): $(AST_H) $(AST_ASDL) $(ASDLGEN_FILES) - $(MKDIR_P) $(AST_C_DIR) - $(ASDLGEN) -c $(AST_C_DIR) $(AST_ASDL) - -$(OPCODE_H): $(srcdir)/Lib/opcode.py $(OPCODE_H_SCRIPT) - $(OPCODE_H_GEN) - -Python/compile.o Python/symtable.o Python/ast.o: $(GRAMMAR_H) $(AST_H) +.PHONY=regen-ast +regen-ast: + # Regenerate Include/Python-ast.h using Parser/asdl_c.py -h + $(MKDIR_P) $(srcdir)/Include + $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ + -h $(srcdir)/Include \ + $(srcdir)/Parser/Python.asdl + # Regenerate Python/Python-ast.c using Parser/asdl_c.py -c + $(MKDIR_P) $(srcdir)/Python + $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ + -c $(srcdir)/Python \ + $(srcdir)/Parser/Python.asdl + +.PHONY: regen-opcode +regen-opcode: + # Regenerate Include/opcode.h from Lib/opcode.py + # using Tools/scripts/generate_opcode_h.py + $(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/generate_opcode_h.py \ + $(srcdir)/Lib/opcode.py \ + $(srcdir)/Include/opcode.h + +Python/compile.o Python/symtable.o Python/ast.o: $(srcdir)/Include/graminit.h $(srcdir)/Include/Python-ast.h Python/getplatform.o: $(srcdir)/Python/getplatform.c $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c @@ -867,16 +857,26 @@ Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c $(UNICODE_DEPS) Objects/dictobject.o: $(srcdir)/Objects/stringlib/eq.h Objects/setobject.o: $(srcdir)/Objects/stringlib/eq.h -$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES) - $(PYTHON_FOR_GEN) $(OPCODETARGETGEN) $(OPCODETARGETS_H) +.PHONY: regen-opcode-targets +regen-opcode-targets: + # Regenerate Python/opcode_targets.h from Lib/opcode.py + # using Python/makeopcodetargets.py + $(PYTHON_FOR_REGEN) $(srcdir)/Python/makeopcodetargets.py \ + $(srcdir)/Python/opcode_targets.h -Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h +Python/ceval.o: $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/ceval_gil.h -Python/frozen.o: Python/importlib.h Python/importlib_external.h +Python/frozen.o: $(srcdir)/Python/importlib.h $(srcdir)/Python/importlib_external.h Objects/typeobject.o: Objects/typeslots.inc -Objects/typeslots.inc: $(srcdir)/Include/typeslots.h $(srcdir)/Objects/typeslots.py - $(PYTHON_FOR_GEN) $(srcdir)/Objects/typeslots.py < $(srcdir)/Include/typeslots.h Objects/typeslots.inc + +.PHONY: regen-typeslots +regen-typeslots: + # Regenerate Objects/typeslots.inc from Include/typeslotsh + # using Objects/typeslots.py + $(PYTHON_FOR_REGEN) $(srcdir)/Objects/typeslots.py \ + < $(srcdir)/Include/typeslots.h \ + $(srcdir)/Objects/typeslots.inc ############################################################################ # Header files @@ -929,7 +929,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/node.h \ $(srcdir)/Include/object.h \ $(srcdir)/Include/objimpl.h \ - $(OPCODE_H) \ + $(srcdir)/Include/opcode.h \ $(srcdir)/Include/osdefs.h \ $(srcdir)/Include/patchlevel.h \ $(srcdir)/Include/pgen.h \ @@ -970,7 +970,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/weakrefobject.h \ pyconfig.h \ $(PARSER_HEADERS) \ - $(AST_H) + $(srcdir)/Include/Python-ast.h $(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) @@ -1551,9 +1551,12 @@ recheck: $(SHELL) config.status --recheck $(SHELL) config.status -# Rebuild the configure script from configure.ac; also rebuild pyconfig.h.in +# Regenerate configure and pyconfig.h.in +.PHONY: autoconf autoconf: + # Regenerate the configure script from configure.ac using autoconf (cd $(srcdir); autoconf -Wall) + # Regenerate pyconfig.h.in from configure.ac using autoheader (cd $(srcdir); autoheader -Wall) # Create a tags file for vi @@ -1570,14 +1573,6 @@ TAGS:: etags Include/*.h; \ for i in $(SRCDIRS); do etags -a $$i/*.[ch]; done -# This fixes up the mtimes of checked-in generated files, assuming that they -# only *appear* to be outdated because of checkout order. -# This is run while preparing a source release tarball, and can be run manually -# to avoid bootstrap issues. -touch: - cd $(srcdir); \ - hg --config extensions.touch=Tools/hg/hgtouch.py touch -v - # Sanitation targets -- clean leaves libraries, executables and tags # files, which clobber removes as well pycremoval: @@ -1695,7 +1690,7 @@ Python/thread.o: @THREADHEADERS@ .PHONY: maninstall libinstall inclinstall libainstall sharedinstall .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure .PHONY: frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools -.PHONY: frameworkaltinstallunixtools recheck autoconf clean clobber distclean +.PHONY: frameworkaltinstallunixtools recheck clean clobber distclean .PHONY: smelly funny patchcheck touch altmaninstall commoninstall .PHONY: gdbhooks diff --git a/Misc/NEWS b/Misc/NEWS index 1852d687f7393a..8a42a23989fff6 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -203,6 +203,10 @@ Documentation Build ----- +- bpo-23404: Don't regenerate generated files based on file modification time + anymore: the action is now explicit. Replace ``make touch`` with + ``make regen-all``. + - bpo-29643: Fix ``--enable-optimization`` didn't work. Tests diff --git a/Tools/hg/hgtouch.py b/Tools/hg/hgtouch.py deleted file mode 100644 index 119d81214826f6..00000000000000 --- a/Tools/hg/hgtouch.py +++ /dev/null @@ -1,130 +0,0 @@ -"""Bring time stamps of generated checked-in files into the right order - -A versioned configuration file .hgtouch specifies generated files, in the -syntax of make rules. - - output: input1 input2 - -In addition to the dependency syntax, #-comments are supported. -""" -from __future__ import with_statement -import errno -import os -import time - -def parse_config(repo): - try: - fp = repo.wfile(".hgtouch") - except IOError, e: - if e.errno != errno.ENOENT: - raise - return {} - result = {} - with fp: - for line in fp: - # strip comments - line = line.split('#')[0].strip() - if ':' not in line: - continue - outputs, inputs = line.split(':', 1) - outputs = outputs.split() - inputs = inputs.split() - for o in outputs: - try: - result[o].extend(inputs) - except KeyError: - result[o] = inputs - return result - -def check_rule(ui, repo, modified, basedir, output, inputs): - """Verify that the output is newer than any of the inputs. - Return (status, stamp), where status is True if the update succeeded, - and stamp is the newest time stamp assigned to any file (might be in - the future). - - If basedir is nonempty, it gives a directory in which the tree is to - be checked. - """ - f_output = repo.wjoin(os.path.join(basedir, output)) - try: - o_time = os.stat(f_output).st_mtime - except OSError: - ui.warn("Generated file %s does not exist\n" % output) - return False, 0 - youngest = 0 # youngest dependency - backdate = None - backdate_source = None - for i in inputs: - f_i = repo.wjoin(os.path.join(basedir, i)) - try: - i_time = os.stat(f_i).st_mtime - except OSError: - ui.warn(".hgtouch input file %s does not exist\n" % i) - return False, 0 - if i in modified: - # input is modified. Need to backdate at least to i_time - if backdate is None or backdate > i_time: - backdate = i_time - backdate_source = i - continue - youngest = max(i_time, youngest) - if backdate is not None: - ui.warn("Input %s for file %s locally modified\n" % (backdate_source, output)) - # set to 1s before oldest modified input - backdate -= 1 - os.utime(f_output, (backdate, backdate)) - return False, 0 - if youngest >= o_time: - ui.note("Touching %s\n" % output) - youngest += 1 - os.utime(f_output, (youngest, youngest)) - return True, youngest - else: - # Nothing to update - return True, 0 - -def do_touch(ui, repo, basedir): - if basedir: - if not os.path.isdir(repo.wjoin(basedir)): - ui.warn("Abort: basedir %r does not exist\n" % basedir) - return - modified = [] - else: - modified = repo.status()[0] - dependencies = parse_config(repo) - success = True - tstamp = 0 # newest time stamp assigned - # try processing all rules in topological order - hold_back = {} - while dependencies: - output, inputs = dependencies.popitem() - # check whether any of the inputs is generated - for i in inputs: - if i in dependencies: - hold_back[output] = inputs - continue - _success, _tstamp = check_rule(ui, repo, modified, basedir, output, inputs) - success = success and _success - tstamp = max(tstamp, _tstamp) - # put back held back rules - dependencies.update(hold_back) - hold_back = {} - now = time.time() - if tstamp > now: - # wait until real time has passed the newest time stamp, to - # avoid having files dated in the future - time.sleep(tstamp-now) - if hold_back: - ui.warn("Cyclic dependency involving %s\n" % (' '.join(hold_back.keys()))) - return False - return success - -def touch(ui, repo, basedir): - "touch generated files that are older than their sources after an update." - do_touch(ui, repo, basedir) - -cmdtable = { - "touch": (touch, - [('b', 'basedir', '', 'base dir of the tree to apply touching')], - "hg touch [-b BASEDIR]") -} diff --git a/configure b/configure index a6d83f266008c9..2091da7fb1bd51 100755 --- a/configure +++ b/configure @@ -747,9 +747,8 @@ UNIVERSALSDK CONFIG_ARGS SOVERSION VERSION -GENERATED_COMMENT PYTHON_FOR_BUILD -PYTHON_FOR_GEN +PYTHON_FOR_REGEN host_os host_vendor host_cpu @@ -3010,11 +3009,11 @@ do set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PYTHON_FOR_GEN+:} false; then : +if ${ac_cv_prog_PYTHON_FOR_REGEN+:} false; then : $as_echo_n "(cached) " >&6 else - if test -n "$PYTHON_FOR_GEN"; then - ac_cv_prog_PYTHON_FOR_GEN="$PYTHON_FOR_GEN" # Let the user override the test. + if test -n "$PYTHON_FOR_REGEN"; then + ac_cv_prog_PYTHON_FOR_REGEN="$PYTHON_FOR_REGEN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -3023,7 +3022,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_PYTHON_FOR_GEN="$ac_prog" + ac_cv_prog_PYTHON_FOR_REGEN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -3033,25 +3032,20 @@ IFS=$as_save_IFS fi fi -PYTHON_FOR_GEN=$ac_cv_prog_PYTHON_FOR_GEN -if test -n "$PYTHON_FOR_GEN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_GEN" >&5 -$as_echo "$PYTHON_FOR_GEN" >&6; } +PYTHON_FOR_REGEN=$ac_cv_prog_PYTHON_FOR_REGEN +if test -n "$PYTHON_FOR_REGEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_FOR_REGEN" >&5 +$as_echo "$PYTHON_FOR_REGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$PYTHON_FOR_GEN" && break + test -n "$PYTHON_FOR_REGEN" && break done -test -n "$PYTHON_FOR_GEN" || PYTHON_FOR_GEN="not-found" +test -n "$PYTHON_FOR_REGEN" || PYTHON_FOR_REGEN="python3" -if test "$PYTHON_FOR_GEN" = not-found; then - PYTHON_FOR_GEN='@echo "Cannot generate $@, python not found !" && \ - echo "To skip re-generation of $@ run or ." && \ - echo "Otherwise, set python in PATH and run configure or run ." && false &&' -fi if test "$cross_compiling" = yes; then @@ -3072,18 +3066,14 @@ $as_echo_n "checking for python interpreter for cross build... " >&6; } $as_echo "$interp" >&6; } PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/$(PLATDIR) '$interp fi - # Used to comment out stuff for rebuilding generated files - GENERATED_COMMENT='#' elif test "$cross_compiling" = maybe; then as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5 else PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' - GENERATED_COMMENT='' fi - if test "$prefix" != "/"; then prefix=`echo "$prefix" | sed -e 's/\/$//g'` fi diff --git a/configure.ac b/configure.ac index 22ac805a66a3f6..e1731dbc222078 100644 --- a/configure.ac +++ b/configure.ac @@ -56,13 +56,8 @@ AC_SUBST(host) # pybuilddir.txt will be created by --generate-posix-vars in the Makefile rm -f pybuilddir.txt -AC_CHECK_PROGS(PYTHON_FOR_GEN, python$PACKAGE_VERSION python3 python, not-found) -if test "$PYTHON_FOR_GEN" = not-found; then - PYTHON_FOR_GEN='@echo "Cannot generate $@, python not found !" && \ - echo "To skip re-generation of $@ run or ." && \ - echo "Otherwise, set python in PATH and run configure or run ." && false &&' -fi -AC_SUBST(PYTHON_FOR_GEN) +AC_CHECK_PROGS(PYTHON_FOR_REGEN, python$PACKAGE_VERSION python3 python, python3) +AC_SUBST(PYTHON_FOR_REGEN) if test "$cross_compiling" = yes; then AC_MSG_CHECKING([for python interpreter for cross build]) @@ -80,16 +75,12 @@ if test "$cross_compiling" = yes; then AC_MSG_RESULT($interp) PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/$(PLATDIR) '$interp fi - # Used to comment out stuff for rebuilding generated files - GENERATED_COMMENT='#' elif test "$cross_compiling" = maybe; then AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH]) else PYTHON_FOR_BUILD='./$(BUILDPYTHON) -E' - GENERATED_COMMENT='' fi AC_SUBST(PYTHON_FOR_BUILD) -AC_SUBST(GENERATED_COMMENT) dnl Ensure that if prefix is specified, it does not end in a slash. If dnl it does, we get path names containing '//' which is both ugly and From ee2294860e224c2b08cc6847d3c9a0ec3875c3d8 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 5 May 2017 10:40:47 +0300 Subject: [PATCH 192/220] [3.5] bpo-30243: Fixed the possibility of a crash in _json. (GH-1420) (#1470) It was possible to get a core dump by using uninitialized _json objects. Now __new__ methods create initialized objects. __init__ methods are removed.. (cherry picked from commit 76a3e51a403bc84ed536921866c86dd7d07aaa7e) --- Misc/NEWS | 4 +++ Modules/_json.c | 86 ++++++++++++------------------------------------- 2 files changed, 24 insertions(+), 66 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 8a42a23989fff6..8ea2fd3c88ccdc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Extension Modules Library ------- +- bpo-30243: Removed the __init__ methods of _json's scanner and encoder. + Misusing them could cause memory leaks or crashes. Now scanner and encoder + objects are completely initialized in the __new__ methods. + - bpo-30185: Avoid KeyboardInterrupt tracebacks in forkserver helper process when Ctrl-C is received. diff --git a/Modules/_json.c b/Modules/_json.c index 8cbf2e405869e0..446795e2299a72 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -89,16 +89,12 @@ static PyObject * _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx); static PyObject * scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds); static void scanner_dealloc(PyObject *self); static int scanner_clear(PyObject *self); static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds); -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds); static void encoder_dealloc(PyObject *self); static int @@ -1203,38 +1199,21 @@ static PyObject * scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyScannerObject *s; - s = (PyScannerObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->strict = NULL; - s->object_hook = NULL; - s->object_pairs_hook = NULL; - s->parse_float = NULL; - s->parse_int = NULL; - s->parse_constant = NULL; - } - return (PyObject *)s; -} - -static int -scanner_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* Initialize Scanner object */ PyObject *ctx; static char *kwlist[] = {"context", NULL}; - PyScannerObject *s; - - assert(PyScanner_Check(self)); - s = (PyScannerObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx)) - return -1; + return NULL; - if (s->memo == NULL) { - s->memo = PyDict_New(); - if (s->memo == NULL) - goto bail; + s = (PyScannerObject *)type->tp_alloc(type, 0); + if (s == NULL) { + return NULL; } + s->memo = PyDict_New(); + if (s->memo == NULL) + goto bail; + /* All of these will fail "gracefully" so we don't need to verify them */ s->strict = PyObject_GetAttrString(ctx, "strict"); if (s->strict == NULL) @@ -1255,16 +1234,11 @@ scanner_init(PyObject *self, PyObject *args, PyObject *kwds) if (s->parse_constant == NULL) goto bail; - return 0; + return (PyObject *)s; bail: - Py_CLEAR(s->strict); - Py_CLEAR(s->object_hook); - Py_CLEAR(s->object_pairs_hook); - Py_CLEAR(s->parse_float); - Py_CLEAR(s->parse_int); - Py_CLEAR(s->parse_constant); - return -1; + Py_DECREF(s); + return NULL; } PyDoc_STRVAR(scanner_doc, "JSON scanner object"); @@ -1306,7 +1280,7 @@ PyTypeObject PyScannerType = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - scanner_init, /* tp_init */ + 0, /* tp_init */ 0,/* PyType_GenericAlloc, */ /* tp_alloc */ scanner_new, /* tp_new */ 0,/* PyObject_GC_Del, */ /* tp_free */ @@ -1315,25 +1289,6 @@ PyTypeObject PyScannerType = { static PyObject * encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyEncoderObject *s; - s = (PyEncoderObject *)type->tp_alloc(type, 0); - if (s != NULL) { - s->markers = NULL; - s->defaultfn = NULL; - s->encoder = NULL; - s->indent = NULL; - s->key_separator = NULL; - s->item_separator = NULL; - s->sort_keys = NULL; - s->skipkeys = NULL; - } - return (PyObject *)s; -} - -static int -encoder_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - /* initialize Encoder object */ static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", NULL}; PyEncoderObject *s; @@ -1341,22 +1296,23 @@ encoder_init(PyObject *self, PyObject *args, PyObject *kwds) PyObject *item_separator, *sort_keys, *skipkeys; int allow_nan; - assert(PyEncoder_Check(self)); - s = (PyEncoderObject *)self; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOUUOOp:make_encoder", kwlist, &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator, &sort_keys, &skipkeys, &allow_nan)) - return -1; + return NULL; if (markers != Py_None && !PyDict_Check(markers)) { PyErr_Format(PyExc_TypeError, "make_encoder() argument 1 must be dict or None, " "not %.200s", Py_TYPE(markers)->tp_name); - return -1; + return NULL; } + s = (PyEncoderObject *)type->tp_alloc(type, 0); + if (s == NULL) + return NULL; + s->markers = markers; s->defaultfn = defaultfn; s->encoder = encoder; @@ -1383,7 +1339,7 @@ encoder_init(PyObject *self, PyObject *args, PyObject *kwds) Py_INCREF(s->item_separator); Py_INCREF(s->sort_keys); Py_INCREF(s->skipkeys); - return 0; + return (PyObject *)s; } static PyObject * @@ -1914,7 +1870,7 @@ PyTypeObject PyEncoderType = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - encoder_init, /* tp_init */ + 0, /* tp_init */ 0, /* tp_alloc */ encoder_new, /* tp_new */ 0, /* tp_free */ @@ -1957,10 +1913,8 @@ PyInit__json(void) PyObject *m = PyModule_Create(&jsonmodule); if (!m) return NULL; - PyScannerType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyScannerType) < 0) goto fail; - PyEncoderType.tp_new = PyType_GenericNew; if (PyType_Ready(&PyEncoderType) < 0) goto fail; Py_INCREF((PyObject*)&PyScannerType); From 0c9aa6ffd318c04ce23997b4704477d4a4d82829 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 5 May 2017 10:08:05 +0200 Subject: [PATCH 193/220] bpo-30264: ExpatParser closes the source on error (#1451) (#1475) ExpatParser.parse() of xml.sax.xmlreader now always closes the source: close the file object or the urllib object if source is a string (not an open file-like object). The change fixes a ResourceWarning on parsing error. Add test_parse_close_source() unit test. (cherry picked from commit ef9c0e732fc50aefbdd7c5a80e04e14b31684e66) --- Lib/test/test_sax.py | 24 ++++++++++++++++++------ Lib/xml/sax/expatreader.py | 33 ++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index 2411895d9d12b1..2eb62905ffa882 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -4,6 +4,7 @@ from xml.sax import make_parser, ContentHandler, \ SAXException, SAXReaderNotAvailable, SAXParseException import unittest +from unittest import mock try: make_parser() except SAXReaderNotAvailable: @@ -175,12 +176,8 @@ def test_parse_bytes(self): with self.assertRaises(SAXException): self.check_parse(BytesIO(xml_bytes(self.data, 'iso-8859-1', None))) make_xml_file(self.data, 'iso-8859-1', None) - with support.check_warnings(('unclosed file', ResourceWarning)): - # XXX Failed parser leaks an opened file. - with self.assertRaises(SAXException): - self.check_parse(TESTFN) - # Collect leaked file. - gc.collect() + with self.assertRaises(SAXException): + self.check_parse(TESTFN) with open(TESTFN, 'rb') as f: with self.assertRaises(SAXException): self.check_parse(f) @@ -194,6 +191,21 @@ def test_parse_InputSource(self): input.setEncoding('iso-8859-1') self.check_parse(input) + def test_parse_close_source(self): + builtin_open = open + fileobj = None + + def mock_open(*args): + nonlocal fileobj + fileobj = builtin_open(*args) + return fileobj + + with mock.patch('xml.sax.saxutils.open', side_effect=mock_open): + make_xml_file(self.data, 'iso-8859-1', None) + with self.assertRaises(SAXException): + self.check_parse(TESTFN) + self.assertTrue(fileobj.closed) + def check_parseString(self, s): from xml.sax import parseString result = StringIO() diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 98b5ca953983c7..421358fa5bc7f0 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -105,9 +105,16 @@ def parse(self, source): source = saxutils.prepare_input_source(source) self._source = source - self.reset() - self._cont_handler.setDocumentLocator(ExpatLocator(self)) - xmlreader.IncrementalParser.parse(self, source) + try: + self.reset() + self._cont_handler.setDocumentLocator(ExpatLocator(self)) + xmlreader.IncrementalParser.parse(self, source) + except: + # bpo-30264: Close the source on error to not leak resources: + # xml.sax.parse() doesn't give access to the underlying parser + # to the caller + self._close_source() + raise def prepareParser(self, source): if source.getSystemId() is not None: @@ -213,6 +220,17 @@ def feed(self, data, isFinal = 0): # FIXME: when to invoke error()? self._err_handler.fatalError(exc) + def _close_source(self): + source = self._source + try: + file = source.getCharacterStream() + if file is not None: + file.close() + finally: + file = source.getByteStream() + if file is not None: + file.close() + def close(self): if (self._entity_stack or self._parser is None or isinstance(self._parser, _ClosedParser)): @@ -232,14 +250,7 @@ def close(self): parser.ErrorColumnNumber = self._parser.ErrorColumnNumber parser.ErrorLineNumber = self._parser.ErrorLineNumber self._parser = parser - try: - file = self._source.getCharacterStream() - if file is not None: - file.close() - finally: - file = self._source.getByteStream() - if file is not None: - file.close() + self._close_source() def _reset_cont_handler(self): self._parser.ProcessingInstructionHandler = \ From c8faabce6ef318f3b425c6defd846e274d61e2ef Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 6 May 2017 15:11:20 +0300 Subject: [PATCH 194/220] [3.5] Revert bpo-26293 for zipfile breakage. See also bpo-29094. (GH-1484). (#1486) (cherry picked from commit 3763ea865cee5bbabcce11cd577811135e0fc747) --- Lib/zipfile.py | 27 +++++++++++++-------------- Misc/NEWS | 2 ++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 048f60a708e092..56a2479fb3850a 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1028,7 +1028,6 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True): # set the modified flag so central directory gets written # even if no files are added to the archive self._didModify = True - self._start_disk = 0 try: self.start_dir = self.fp.tell() except (AttributeError, OSError): @@ -1054,7 +1053,7 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True): # set the modified flag so central directory gets written # even if no files are added to the archive self._didModify = True - self.start_dir = self._start_disk = self.fp.tell() + self.start_dir = self.fp.tell() else: raise RuntimeError("Mode must be 'r', 'w', 'x', or 'a'") except: @@ -1098,18 +1097,17 @@ def _RealGetContents(self): offset_cd = endrec[_ECD_OFFSET] # offset of central directory self._comment = endrec[_ECD_COMMENT] # archive comment - # self._start_disk: Position of the start of ZIP archive - # It is zero, unless ZIP was concatenated to another file - self._start_disk = endrec[_ECD_LOCATION] - size_cd - offset_cd + # "concat" is zero, unless zip was concatenated to another file + concat = endrec[_ECD_LOCATION] - size_cd - offset_cd if endrec[_ECD_SIGNATURE] == stringEndArchive64: # If Zip64 extension structures are present, account for them - self._start_disk -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) if self.debug > 2: - inferred = self._start_disk + offset_cd - print("given, inferred, offset", offset_cd, inferred, self._start_disk) + inferred = concat + offset_cd + print("given, inferred, offset", offset_cd, inferred, concat) # self.start_dir: Position of start of central directory - self.start_dir = offset_cd + self._start_disk + self.start_dir = offset_cd + concat fp.seek(self.start_dir, 0) data = fp.read(size_cd) fp = io.BytesIO(data) @@ -1149,7 +1147,7 @@ def _RealGetContents(self): t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) x._decodeExtra() - x.header_offset = x.header_offset + self._start_disk + x.header_offset = x.header_offset + concat self.filelist.append(x) self.NameToInfo[x.filename] = x @@ -1629,10 +1627,11 @@ def _write_end_record(self): file_size = zinfo.file_size compress_size = zinfo.compress_size - header_offset = zinfo.header_offset - self._start_disk - if header_offset > ZIP64_LIMIT: - extra.append(header_offset) + if zinfo.header_offset > ZIP64_LIMIT: + extra.append(zinfo.header_offset) header_offset = 0xffffffff + else: + header_offset = zinfo.header_offset extra_data = zinfo.extra min_version = 0 @@ -1679,7 +1678,7 @@ def _write_end_record(self): # Write end-of-zip-archive record centDirCount = len(self.filelist) centDirSize = pos2 - self.start_dir - centDirOffset = self.start_dir - self._start_disk + centDirOffset = self.start_dir requires_zip64 = None if centDirCount > ZIP_FILECOUNT_LIMIT: requires_zip64 = "Files count" diff --git a/Misc/NEWS b/Misc/NEWS index 8ea2fd3c88ccdc..1ec6a097604887 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,8 @@ Extension Modules Library ------- +- Revert bpo-26293 for zipfile breakage. See also bpo-29094. + - bpo-30243: Removed the __init__ methods of _json's scanner and encoder. Misusing them could cause memory leaks or crashes. Now scanner and encoder objects are completely initialized in the __new__ methods. From f5f7870d9322b46ab87c45b2c4c46f6b10ecbd70 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Tue, 9 May 2017 12:17:09 +0800 Subject: [PATCH 195/220] bpo-29990: Fix range checking in GB18030 decoder (#1495) (#1508) When decoding a 4-byte GB18030 sequence, the first and third byte cannot exceed 0xFE. --- Lib/test/test_codecencodings_cn.py | 6 ++++++ Misc/NEWS | 2 ++ Modules/cjkcodecs/_codecs_cn.c | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_codecencodings_cn.py b/Lib/test/test_codecencodings_cn.py index d0e3a15d162370..f135bb26e7b044 100644 --- a/Lib/test/test_codecencodings_cn.py +++ b/Lib/test/test_codecencodings_cn.py @@ -49,6 +49,12 @@ class Test_GB18030(multibytecodec_support.TestBase, unittest.TestCase): (b"abc\x84\x32\x80\x80def", "replace", 'abc\ufffd2\ufffd\ufffddef'), (b"abc\x81\x30\x81\x30def", "strict", 'abc\x80def'), (b"abc\x86\x30\x81\x30def", "replace", 'abc\ufffd0\ufffd0def'), + # issue29990 + (b"\xff\x30\x81\x30", "strict", None), + (b"\x81\x30\xff\x30", "strict", None), + (b"abc\x81\x39\xff\x39\xc1\xc4", "replace", "abc\ufffd\x39\ufffd\x39\u804a"), + (b"abc\xab\x36\xff\x30def", "replace", 'abc\ufffd\x36\ufffd\x30def'), + (b"abc\xbf\x38\xff\x32\xc1\xc4", "ignore", "abc\x38\x32\u804a"), ) has_iso10646 = True diff --git a/Misc/NEWS b/Misc/NEWS index 1ec6a097604887..06e464ffc89d80 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,8 @@ Extension Modules Library ------- +- bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma Lin. + - Revert bpo-26293 for zipfile breakage. See also bpo-29094. - bpo-30243: Removed the __init__ methods of _json's scanner and encoder. diff --git a/Modules/cjkcodecs/_codecs_cn.c b/Modules/cjkcodecs/_codecs_cn.c index 1a070f2f393219..bda175c55d1323 100644 --- a/Modules/cjkcodecs/_codecs_cn.c +++ b/Modules/cjkcodecs/_codecs_cn.c @@ -279,7 +279,9 @@ DECODER(gb18030) REQUIRE_INBUF(4); c3 = INBYTE3; c4 = INBYTE4; - if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39) + if (c < 0x81 || c > 0xFE || + c3 < 0x81 || c3 > 0xFE || + c4 < 0x30 || c4 > 0x39) return 1; c -= 0x81; c2 -= 0x30; c3 -= 0x81; c4 -= 0x30; From 8489409bbfabb2ddc30ed55c9f4d679a3710ebe4 Mon Sep 17 00:00:00 2001 From: torsava Date: Tue, 9 May 2017 17:12:35 +0200 Subject: [PATCH 196/220] [3.5] bpo-29243: Fix Makefile with respect to --enable-optimizations (GH-1478) (#1520) * bpo-29243: Fix Makefile with respect to --enable-optimizations When using the Profile Guided Optimization (./configure --enable-optimizations) Python is built not only during `make` but rebuilt again during `make test`, `make install` and others. This patch fixes the issue. Note that this fix produces no change at all in the Makefile if configure is run witout --enable-optimizations. * !squash. (cherry picked from commit a1054c3b0037d4c2a5492e79fc193f36245366c7) --- Makefile.pre.in | 14 +++++++------- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index 04ef1a12019c15..144c1f8629bcd5 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -984,7 +984,7 @@ TESTTIMEOUT= 3600 # Run a basic set of regression tests. # This excludes some tests that are particularly resource-intensive. -test: all platform +test: @DEF_MAKE_RULE@ platform $(TESTRUNNER) $(TESTOPTS) # Run the full test suite twice - once without .pyc files, and once with. @@ -994,7 +994,7 @@ test: all platform # the bytecode read from a .pyc file had the bug, sometimes the directly # generated bytecode. This is sometimes a very shy bug needing a lot of # sample data. -testall: all platform +testall: @DEF_MAKE_RULE@ platform -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f $(TESTPYTHON) -E $(srcdir)/Lib/compileall.py -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f @@ -1003,7 +1003,7 @@ testall: all platform # Run the test suite for both architectures in a Universal build on OSX. # Must be run on an Intel box. -testuniversal: all platform +testuniversal: @DEF_MAKE_RULE@ platform if [ `arch` != 'i386' ];then \ echo "This can only be used on OSX/i386" ;\ exit 1 ;\ @@ -1026,7 +1026,7 @@ QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multiprocessing_forkserver \ test_mailbox test_socket test_poll \ test_select test_zipfile test_concurrent_futures -quicktest: all platform +quicktest: @DEF_MAKE_RULE@ platform $(TESTRUNNER) $(QUICKTESTOPTS) @@ -1378,7 +1378,7 @@ LIBPL= @LIBPL@ # pkgconfig directory LIBPC= $(LIBDIR)/pkgconfig -libainstall: all python-config +libainstall: @DEF_MAKE_RULE@ python-config @for i in $(LIBDIR) $(LIBPL) $(LIBPC); \ do \ if test ! -d $(DESTDIR)$$i; then \ @@ -1639,7 +1639,7 @@ distclean: clobber -exec rm -f {} ';' # Check for smelly exported symbols (not starting with Py/_Py) -smelly: all +smelly: @DEF_MAKE_RULE@ nm -p $(LIBRARY) | \ sed -n "/ [TDB] /s/.* //p" | grep -v "^_*Py" | sort -u; \ @@ -1677,7 +1677,7 @@ funny: -o -print # Perform some verification checks on any modified files. -patchcheck: all +patchcheck: @DEF_MAKE_RULE@ $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py # Dependencies diff --git a/Misc/ACKS b/Misc/ACKS index babd4950da6797..2d2436c9c3b8c1 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1096,6 +1096,7 @@ Jason Orendorff Douglas Orr William Orr Michele Orrù +Tomáš Orsava Oleg Oshmyan Denis S. Otkidach Peter Otten diff --git a/Misc/NEWS b/Misc/NEWS index 06e464ffc89d80..889386dba05de4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -211,6 +211,10 @@ Documentation Build ----- +- bpo-29243: Prevent unnecessary rebuilding of Python during ``make test``, + ``make install`` and some other make targets when configured with + ``--enable-optimizations``. + - bpo-23404: Don't regenerate generated files based on file modification time anymore: the action is now explicit. Replace ``make touch`` with ``make regen-all``. From 9721729952d5844505fda01efd1c4149acb59220 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 10 May 2017 02:38:09 +0200 Subject: [PATCH 197/220] test_eintr: less verbose, the test is now stable (#1521) Backport the change from the master branch. --- Lib/test/test_eintr.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_eintr.py b/Lib/test/test_eintr.py index aabad835a0a802..25f86d31de3548 100644 --- a/Lib/test/test_eintr.py +++ b/Lib/test/test_eintr.py @@ -1,7 +1,5 @@ import os import signal -import subprocess -import sys import unittest from test import support @@ -16,14 +14,8 @@ def test_all(self): # Run the tester in a sub-process, to make sure there is only one # thread (for reliable signal delivery). tester = support.findfile("eintr_tester.py", subdir="eintrdata") - - if support.verbose: - args = [sys.executable, tester] - with subprocess.Popen(args) as proc: - exitcode = proc.wait() - self.assertEqual(exitcode, 0) - else: - script_helper.assert_python_ok(tester) + # use -u to try to get the full output if the test hangs or crash + script_helper.assert_python_ok("-u", tester) if __name__ == "__main__": From 639e295650a51894412c9d976958792010d3bcf8 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 10 May 2017 19:11:09 +0800 Subject: [PATCH 198/220] =?UTF-8?q?bpo-30281:=20Fix=20the=20default=20valu?= =?UTF-8?q?e=20for=20stop=20in=20PySlice=5FUnpack()=20(#1530)=20(#1480?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Objects/sliceobject.c | 8 +++++--- Python/ceval.c | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 6a690213d14518..32599476bba0c0 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -197,6 +197,8 @@ PySlice_Unpack(PyObject *_r, PySliceObject *r = (PySliceObject*)_r; /* this is harder to get right than you might think */ + assert(PY_SSIZE_T_MIN + 1 <= -PY_SSIZE_T_MAX); + if (r->step == Py_None) { *step = 1; } @@ -217,14 +219,14 @@ PySlice_Unpack(PyObject *_r, } if (r->start == Py_None) { - *start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;; + *start = *step < 0 ? PY_SSIZE_T_MAX : 0; } else { if (!_PyEval_SliceIndex(r->start, start)) return -1; } if (r->stop == Py_None) { - *stop = *step < 0 ? -PY_SSIZE_T_MAX : PY_SSIZE_T_MAX; + *stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX; } else { if (!_PyEval_SliceIndex(r->stop, stop)) return -1; @@ -258,7 +260,7 @@ PySlice_AdjustIndices(Py_ssize_t length, *stop = (step < 0) ? -1 : 0; } } - else if (*stop >= length) { + else if (*stop >= length) { *stop = (step < 0) ? length - 1 : length; } diff --git a/Python/ceval.c b/Python/ceval.c index 3070a90b43dbfb..47c5eff64f235e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -5095,7 +5095,7 @@ ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk) /* Extract a slice index from a PyLong or an object with the nb_index slot defined, and store in *pi. Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX, - and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1. + and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN. Return 0 on error, 1 on success. */ int From dab10f4f5b52c6de1aac3a8b5dc87d2eb0223a6c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 10 May 2017 14:13:37 +0200 Subject: [PATCH 199/220] [3.5] bpo-30320, bpo-25277: backport test_eintr enhancements from master to 3.5 (#1532) * bpo-30320: test_eintr now uses pthread_sigmask() (#1523) Rewrite sigwaitinfo() and sigtimedwait() unit tests for EINTR using pthread_sigmask() to fix a race condition between the child and the parent process. Remove the pipe which was used as a weak workaround against the race condition. sigtimedwait() is now tested with a child process sending a signal instead of testing the timeout feature which is more unstable (especially regarding to clock resolution depending on the platform). (cherry picked from commit 211a392cc15f9a7b1b8ce65d8f6c9f8237d1b77f) * test_eintr: Fix ResourceWarning warnings (cherry picked from commit c50cccfcc3b3a9ef3fe7a78b7e7271930dc24aee) * test_eintr: remove unused import * bpo-25277: Add a watchdog to test_eintr Set a timeout of 10 minutes in test_eintr using faulthandler. --- Lib/test/eintrdata/eintr_tester.py | 69 ++++++++++++++++-------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py index 81b6277a0401ff..ad68bd799fa7cb 100644 --- a/Lib/test/eintrdata/eintr_tester.py +++ b/Lib/test/eintrdata/eintr_tester.py @@ -9,7 +9,7 @@ """ import contextlib -import io +import faulthandler import os import select import signal @@ -50,6 +50,10 @@ def setUpClass(cls): signal.setitimer(signal.ITIMER_REAL, cls.signal_delay, cls.signal_period) + # Issue #25277: Use faulthandler to try to debug a hang on FreeBSD + if hasattr(faulthandler, 'dump_traceback_later'): + faulthandler.dump_traceback_later(10 * 60, exit=True) + @classmethod def stop_alarm(cls): signal.setitimer(signal.ITIMER_REAL, 0, 0) @@ -58,6 +62,8 @@ def stop_alarm(cls): def tearDownClass(cls): cls.stop_alarm() signal.signal(signal.SIGALRM, cls.orig_handler) + if hasattr(faulthandler, 'cancel_dump_traceback_later'): + faulthandler.cancel_dump_traceback_later() def subprocess(self, *args, **kw): cmd_args = (sys.executable, '-c') + args @@ -77,6 +83,9 @@ def _test_wait_multiple(self, wait_func): processes = [self.new_sleep_process() for _ in range(num)] for _ in range(num): wait_func() + # Call the Popen method to avoid a ResourceWarning + for proc in processes: + proc.wait() def test_wait(self): self._test_wait_multiple(os.wait) @@ -88,6 +97,8 @@ def test_wait3(self): def _test_wait_single(self, wait_func): proc = self.new_sleep_process() wait_func(proc.pid) + # Call the Popen method to avoid a ResourceWarning + proc.wait() def test_waitpid(self): self._test_wait_single(lambda pid: os.waitpid(pid, 0)) @@ -358,59 +369,55 @@ def test_sleep(self): @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") +# bpo-30320: Need pthread_sigmask() to block the signal, otherwise the test +# is vulnerable to a race condition between the child and the parent processes. +@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), + 'need signal.pthread_sigmask()') class SignalEINTRTest(EINTRBaseTest): """ EINTR tests for the signal module. """ - @unittest.skipUnless(hasattr(signal, 'sigtimedwait'), - 'need signal.sigtimedwait()') - def test_sigtimedwait(self): - t0 = time.monotonic() - signal.sigtimedwait([signal.SIGUSR1], self.sleep_time) - dt = time.monotonic() - t0 - self.assertGreaterEqual(dt, self.sleep_time) - - @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'), - 'need signal.sigwaitinfo()') - def test_sigwaitinfo(self): - # Issue #25277, #25868: give a few milliseconds to the parent process - # between os.write() and signal.sigwaitinfo() to works around a race - # condition - self.sleep_time = 0.100 - + def check_sigwait(self, wait_func): signum = signal.SIGUSR1 pid = os.getpid() old_handler = signal.signal(signum, lambda *args: None) self.addCleanup(signal.signal, signum, old_handler) - rpipe, wpipe = os.pipe() - code = '\n'.join(( 'import os, time', 'pid = %s' % os.getpid(), 'signum = %s' % int(signum), 'sleep_time = %r' % self.sleep_time, - 'rpipe = %r' % rpipe, - 'os.read(rpipe, 1)', - 'os.close(rpipe)', 'time.sleep(sleep_time)', 'os.kill(pid, signum)', )) + old_mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum]) + self.addCleanup(signal.pthread_sigmask, signal.SIG_UNBLOCK, [signum]) + t0 = time.monotonic() - proc = self.subprocess(code, pass_fds=(rpipe,)) - os.close(rpipe) + proc = self.subprocess(code) with kill_on_error(proc): - # sync child-parent - os.write(wpipe, b'x') - os.close(wpipe) + wait_func(signum) + dt = time.monotonic() - t0 + + self.assertEqual(proc.wait(), 0) - # parent + @unittest.skipUnless(hasattr(signal, 'sigwaitinfo'), + 'need signal.sigwaitinfo()') + def test_sigwaitinfo(self): + def wait_func(signum): signal.sigwaitinfo([signum]) - dt = time.monotonic() - t0 - self.assertEqual(proc.wait(), 0) - self.assertGreaterEqual(dt, self.sleep_time) + self.check_sigwait(wait_func) + + @unittest.skipUnless(hasattr(signal, 'sigtimedwait'), + 'need signal.sigwaitinfo()') + def test_sigtimedwait(self): + def wait_func(signum): + signal.sigtimedwait([signum], 120.0) + + self.check_sigwait(wait_func) @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") From 5e94dedcddf5e09164bf20f18a3c701eeb96c71e Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Fri, 12 May 2017 14:34:40 +0900 Subject: [PATCH 200/220] bpo-30048: asyncio: fix Task.cancel() was ignored. (GH-1547) * bpo-30048: asyncio: fix Task.cancel() was ignored. (GH-1097) when there are no more `await` or `yield (from)` before return in coroutine, cancel was ignored. example: async def coro(): asyncio.Task.current_task().cancel() return 42 ... res = await coro() # should raise CancelledError (cherry picked from commit 991adca012f5e106c2d4040ce619c696ba6f9c46) * fix test --- Lib/asyncio/tasks.py | 7 ++++++- Lib/test/test_asyncio/test_tasks.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index b6bd53cef1aa41..89d0989c614a56 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -240,7 +240,12 @@ def _step(self, exc=None): else: result = coro.throw(exc) except StopIteration as exc: - self.set_result(exc.value) + if self._must_cancel: + # Task is cancelled right before coro stops. + self._must_cancel = False + self.set_exception(futures.CancelledError()) + else: + self.set_result(exc.value) except futures.CancelledError: super().cancel() # I.e., Future.cancel(self). except Exception as exc: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index 9872926739f01c..b3d0653e82e573 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -573,6 +573,24 @@ def task(): self.assertFalse(t._must_cancel) # White-box test. self.assertFalse(t.cancel()) + def test_cancel_at_end(self): + """coroutine end right after task is cancelled""" + loop = asyncio.new_event_loop() + self.set_event_loop(loop) + + @asyncio.coroutine + def task(): + t.cancel() + self.assertTrue(t._must_cancel) # White-box test. + return 12 + + t = asyncio.Task(task(), loop=loop) + self.assertRaises( + asyncio.CancelledError, loop.run_until_complete, t) + self.assertTrue(t.done()) + self.assertFalse(t._must_cancel) # White-box test. + self.assertFalse(t.cancel()) + def test_stop_while_run_in_complete(self): def gen(): diff --git a/Misc/NEWS b/Misc/NEWS index 889386dba05de4..41fe80f44c3f12 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is + running coroutine and the coroutine returned without any more ``await``. + - bpo-29990: Fix range checking in GB18030 decoder. Original patch by Ma Lin. - Revert bpo-26293 for zipfile breakage. See also bpo-29094. From 4ee34e144f6c8263edaf5951d4fd80562a02361d Mon Sep 17 00:00:00 2001 From: Mariatta Date: Sat, 13 May 2017 09:45:14 -0700 Subject: [PATCH 201/220] [3.5] bpo-30178: Indent methods and attributes of MimeType class (GH-1306) (#1571) (cherry picked from commit c71168090df435c1eb8c03005b11df764cd7ebd6) --- Doc/library/mimetypes.rst | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/Doc/library/mimetypes.rst b/Doc/library/mimetypes.rst index 464248c3ea7990..67b7a7178534d3 100644 --- a/Doc/library/mimetypes.rst +++ b/Doc/library/mimetypes.rst @@ -186,78 +186,78 @@ than one MIME-type database; it provides an interface similar to the one of the loaded "on top" of the default database. -.. attribute:: MimeTypes.suffix_map + .. attribute:: MimeTypes.suffix_map - Dictionary mapping suffixes to suffixes. This is used to allow recognition of - encoded files for which the encoding and the type are indicated by the same - extension. For example, the :file:`.tgz` extension is mapped to :file:`.tar.gz` - to allow the encoding and type to be recognized separately. This is initially a - copy of the global :data:`suffix_map` defined in the module. + Dictionary mapping suffixes to suffixes. This is used to allow recognition of + encoded files for which the encoding and the type are indicated by the same + extension. For example, the :file:`.tgz` extension is mapped to :file:`.tar.gz` + to allow the encoding and type to be recognized separately. This is initially a + copy of the global :data:`suffix_map` defined in the module. -.. attribute:: MimeTypes.encodings_map + .. attribute:: MimeTypes.encodings_map - Dictionary mapping filename extensions to encoding types. This is initially a - copy of the global :data:`encodings_map` defined in the module. + Dictionary mapping filename extensions to encoding types. This is initially a + copy of the global :data:`encodings_map` defined in the module. -.. attribute:: MimeTypes.types_map + .. attribute:: MimeTypes.types_map - Tuple containing two dictionaries, mapping filename extensions to MIME types: - the first dictionary is for the non-standards types and the second one is for - the standard types. They are initialized by :data:`common_types` and - :data:`types_map`. + Tuple containing two dictionaries, mapping filename extensions to MIME types: + the first dictionary is for the non-standards types and the second one is for + the standard types. They are initialized by :data:`common_types` and + :data:`types_map`. -.. attribute:: MimeTypes.types_map_inv + .. attribute:: MimeTypes.types_map_inv - Tuple containing two dictionaries, mapping MIME types to a list of filename - extensions: the first dictionary is for the non-standards types and the - second one is for the standard types. They are initialized by - :data:`common_types` and :data:`types_map`. + Tuple containing two dictionaries, mapping MIME types to a list of filename + extensions: the first dictionary is for the non-standards types and the + second one is for the standard types. They are initialized by + :data:`common_types` and :data:`types_map`. -.. method:: MimeTypes.guess_extension(type, strict=True) + .. method:: MimeTypes.guess_extension(type, strict=True) - Similar to the :func:`guess_extension` function, using the tables stored as part - of the object. + Similar to the :func:`guess_extension` function, using the tables stored as part + of the object. -.. method:: MimeTypes.guess_type(url, strict=True) + .. method:: MimeTypes.guess_type(url, strict=True) - Similar to the :func:`guess_type` function, using the tables stored as part of - the object. + Similar to the :func:`guess_type` function, using the tables stored as part of + the object. -.. method:: MimeTypes.guess_all_extensions(type, strict=True) + .. method:: MimeTypes.guess_all_extensions(type, strict=True) - Similar to the :func:`guess_all_extensions` function, using the tables stored - as part of the object. + Similar to the :func:`guess_all_extensions` function, using the tables stored + as part of the object. -.. method:: MimeTypes.read(filename, strict=True) + .. method:: MimeTypes.read(filename, strict=True) - Load MIME information from a file named *filename*. This uses :meth:`readfp` to - parse the file. + Load MIME information from a file named *filename*. This uses :meth:`readfp` to + parse the file. - If *strict* is ``True``, information will be added to list of standard types, - else to the list of non-standard types. + If *strict* is ``True``, information will be added to list of standard types, + else to the list of non-standard types. -.. method:: MimeTypes.readfp(fp, strict=True) + .. method:: MimeTypes.readfp(fp, strict=True) - Load MIME type information from an open file *fp*. The file must have the format of - the standard :file:`mime.types` files. + Load MIME type information from an open file *fp*. The file must have the format of + the standard :file:`mime.types` files. - If *strict* is ``True``, information will be added to the list of standard - types, else to the list of non-standard types. + If *strict* is ``True``, information will be added to the list of standard + types, else to the list of non-standard types. -.. method:: MimeTypes.read_windows_registry(strict=True) + .. method:: MimeTypes.read_windows_registry(strict=True) - Load MIME type information from the Windows registry. Availability: Windows. + Load MIME type information from the Windows registry. Availability: Windows. - If *strict* is ``True``, information will be added to the list of standard - types, else to the list of non-standard types. + If *strict* is ``True``, information will be added to the list of standard + types, else to the list of non-standard types. - .. versionadded:: 3.2 + .. versionadded:: 3.2 From 9b7fe9986ff60b702ae63b00dd06557781b0b48e Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Sat, 13 May 2017 13:56:13 -0700 Subject: [PATCH 202/220] [3.5] Move Codecov's configuration file under .github (GH-1494) (#1575) (cherry picked from commit cbddf58c797f850a5b06f317a4bb7ab69c6e9715) --- .codecov.yml => .github/codecov.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .codecov.yml => .github/codecov.yml (100%) diff --git a/.codecov.yml b/.github/codecov.yml similarity index 100% rename from .codecov.yml rename to .github/codecov.yml From f3291eeb90da2ddb37efea30dfc9406983b0f681 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Sun, 14 May 2017 18:31:32 +0300 Subject: [PATCH 203/220] bpo-30358: Document sort argument of profile.runctx() (GH-1566) (cherry picked from commit 99776296230ddd8429ebad2d07854b8c27ea10ab) --- Doc/library/profile.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/profile.rst b/Doc/library/profile.rst index b4b1479e2ceba4..5796e3acb6a797 100644 --- a/Doc/library/profile.rst +++ b/Doc/library/profile.rst @@ -215,11 +215,11 @@ functions: and gathers profiling statistics from the execution. If no file name is present, then this function automatically creates a :class:`~pstats.Stats` - instance and prints a simple profiling report. If the sort value is specified + instance and prints a simple profiling report. If the sort value is specified, it is passed to this :class:`~pstats.Stats` instance to control how the results are sorted. -.. function:: runctx(command, globals, locals, filename=None) +.. function:: runctx(command, globals, locals, filename=None, sort=-1) This function is similar to :func:`run`, with added arguments to supply the globals and locals dictionaries for the *command* string. This routine From 51ab4ada8fc99c24d434a533693375169c097006 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 15 May 2017 13:17:13 +0800 Subject: [PATCH 204/220] bpo-30110: fix resource leak in test_asyncio.test_events (#1413) (#1585) --- Lib/test/test_asyncio/test_events.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index 802763bd11ff61..492a84a2313baf 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -2194,8 +2194,10 @@ def tearDown(self): def test_get_event_loop_new_process(self): async def main(): pool = concurrent.futures.ProcessPoolExecutor() - return await self.loop.run_in_executor( + result = await self.loop.run_in_executor( pool, _test_get_event_loop_new_process__sub_proc) + pool.shutdown() + return result self.unpatch_get_running_loop() From dd2a09cf98845b1460f0e049ad0ffeeb5c6c6476 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Mon, 15 May 2017 13:17:41 +0800 Subject: [PATCH 205/220] bpo-30242: resolve some undefined behaviours in struct (#1418) (#1587) --- Modules/_struct.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Modules/_struct.c b/Modules/_struct.c index f965541a5bbd71..22731295679a9d 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -519,7 +519,7 @@ np_ubyte(char *p, PyObject *v, const formatdef *f) "ubyte format requires 0 <= number <= 255"); return -1; } - *p = (char)x; + *(unsigned char *)p = (unsigned char)x; return 0; } @@ -850,6 +850,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -862,7 +863,7 @@ bp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffL); x >>= 8; } while (i > 0); return 0; @@ -873,6 +874,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -883,7 +885,7 @@ bp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - p[--i] = (char)x; + q[--i] = (unsigned char)(x & 0xffUL); x >>= 8; } while (i > 0); return 0; @@ -1070,6 +1072,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) { long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_long(v, &x) < 0) return -1; i = f->size; @@ -1082,7 +1085,7 @@ lp_int(char *p, PyObject *v, const formatdef *f) #endif } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffL); x >>= 8; } while (--i > 0); return 0; @@ -1093,6 +1096,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) { unsigned long x; Py_ssize_t i; + unsigned char *q = (unsigned char *)p; if (get_ulong(v, &x) < 0) return -1; i = f->size; @@ -1103,7 +1107,7 @@ lp_uint(char *p, PyObject *v, const formatdef *f) RANGE_ERROR(x, f, 1, maxint - 1); } do { - *p++ = (char)x; + *q++ = (unsigned char)(x & 0xffUL); x >>= 8; } while (--i > 0); return 0; From 72e5aa1ef812358b3b113e784e7365fec13dfd69 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 15 May 2017 22:41:03 -0700 Subject: [PATCH 206/220] bpo-29651 - Cover edge case of square brackets in urllib docs (#1128) (#1597) (cherry picked from commit f6e863d868a621594df2a8abe072b5d4766e7137) --- Doc/library/urllib.parse.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index 499b2110c46f9d..6f722a88975c51 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -117,6 +117,9 @@ or on combining URL components into a URL string. See section :ref:`urlparse-result-object` for more information on the result object. + Unmatched square brackets in the :attr:`netloc` attribute will raise a + :exc:`ValueError`. + .. versionchanged:: 3.2 Added IPv6 URL parsing capabilities. @@ -230,6 +233,9 @@ or on combining URL components into a URL string. See section :ref:`urlparse-result-object` for more information on the result object. + Unmatched square brackets in the :attr:`netloc` attribute will raise a + :exc:`ValueError`. + .. function:: urlunsplit(parts) From 24b5ed230df65f6a1f9d8dd0c4409377576113d9 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 16 May 2017 18:16:45 +0300 Subject: [PATCH 207/220] [3.5] bpo-30375: Correct the stacklevel of regex compiling warnings. (GH-1595) (#1605) Warnings emitted when compile a regular expression now always point to the line in the user code. Previously they could point into inners of the re module if emitted from inside of groups or conditionals.. (cherry picked from commit c7ac7280c321b3c1679fe5f657a6be0f86adf173) --- Lib/sre_parse.py | 32 ++++++++++++++++---------------- Lib/test/test_re.py | 8 ++++++-- Misc/NEWS | 4 ++++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py index 4ff50d1006a607..df947842e847dc 100644 --- a/Lib/sre_parse.py +++ b/Lib/sre_parse.py @@ -309,7 +309,7 @@ def isname(name): return False return True -def _class_escape(source, escape): +def _class_escape(source, escape, nested): # handle escape code inside character class code = ESCAPES.get(escape) if code: @@ -353,13 +353,13 @@ def _class_escape(source, escape): if c in ASCIILETTERS: import warnings warnings.warn('bad escape %s' % escape, - DeprecationWarning, stacklevel=8) + DeprecationWarning, stacklevel=nested + 6) return LITERAL, ord(escape[1]) except ValueError: pass raise source.error("bad escape %s" % escape, len(escape)) -def _escape(source, escape, state): +def _escape(source, escape, state, nested): # handle escape code in expression code = CATEGORIES.get(escape) if code: @@ -420,13 +420,13 @@ def _escape(source, escape, state): if c in ASCIILETTERS: import warnings warnings.warn('bad escape %s' % escape, - DeprecationWarning, stacklevel=8) + DeprecationWarning, stacklevel=nested + 6) return LITERAL, ord(escape[1]) except ValueError: pass raise source.error("bad escape %s" % escape, len(escape)) -def _parse_sub(source, state, nested=True): +def _parse_sub(source, state, nested): # parse an alternation: a|b|c items = [] @@ -434,7 +434,7 @@ def _parse_sub(source, state, nested=True): sourcematch = source.match start = source.tell() while True: - itemsappend(_parse(source, state)) + itemsappend(_parse(source, state, nested + 1)) if not sourcematch("|"): break @@ -476,10 +476,10 @@ def _parse_sub(source, state, nested=True): subpattern.append((BRANCH, (None, items))) return subpattern -def _parse_sub_cond(source, state, condgroup): - item_yes = _parse(source, state) +def _parse_sub_cond(source, state, condgroup, nested): + item_yes = _parse(source, state, nested + 1) if source.match("|"): - item_no = _parse(source, state) + item_no = _parse(source, state, nested + 1) if source.next == "|": raise source.error("conditional backref with more than two branches") else: @@ -488,7 +488,7 @@ def _parse_sub_cond(source, state, condgroup): subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) return subpattern -def _parse(source, state): +def _parse(source, state, nested): # parse a simple pattern subpattern = SubPattern(state) @@ -521,7 +521,7 @@ def _parse(source, state): continue if this[0] == "\\": - code = _escape(source, this, state) + code = _escape(source, this, state, nested + 1) subpatternappend(code) elif this not in SPECIAL_CHARS: @@ -546,7 +546,7 @@ def _parse(source, state): if this == "]" and set != start: break elif this[0] == "\\": - code1 = _class_escape(source, this) + code1 = _class_escape(source, this, nested + 1) else: code1 = LITERAL, _ord(this) if sourcematch("-"): @@ -562,7 +562,7 @@ def _parse(source, state): setappend((LITERAL, _ord("-"))) break if that[0] == "\\": - code2 = _class_escape(source, that) + code2 = _class_escape(source, that, nested + 1) else: code2 = LITERAL, _ord(that) if code1[0] != LITERAL or code2[0] != LITERAL: @@ -713,7 +713,7 @@ def _parse(source, state): lookbehindgroups = state.lookbehindgroups if lookbehindgroups is None: state.lookbehindgroups = state.groups - p = _parse_sub(source, state) + p = _parse_sub(source, state, nested + 1) if dir < 0: if lookbehindgroups is None: state.lookbehindgroups = None @@ -773,9 +773,9 @@ def _parse(source, state): except error as err: raise source.error(err.msg, len(name) + 1) from None if condgroup: - p = _parse_sub_cond(source, state, condgroup) + p = _parse_sub_cond(source, state, condgroup, nested + 1) else: - p = _parse_sub(source, state) + p = _parse_sub(source, state, nested + 1) if not source.match(")"): raise source.error("missing ), unterminated subpattern", source.tell() - start) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 9acd5abbfd7776..839bf275af3537 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -638,14 +638,18 @@ def test_other_escapes(self): re.purge() # for warnings for c in 'ceghijklmopqyzCEFGHIJKLMNOPQRTVXY': with self.subTest(c): - with self.assertWarns(DeprecationWarning): + with self.assertWarns(DeprecationWarning) as warns: self.assertEqual(re.fullmatch('\\%c' % c, c).group(), c) self.assertIsNone(re.match('\\%c' % c, 'a')) + self.assertRegex(str(warns.warnings[0].message), 'bad escape') + self.assertEqual(warns.warnings[0].filename, __file__) for c in 'ceghijklmopqyzABCEFGHIJKLMNOPQRTVXYZ': with self.subTest(c): - with self.assertWarns(DeprecationWarning): + with self.assertWarns(DeprecationWarning) as warns: self.assertEqual(re.fullmatch('[\\%c]' % c, c).group(), c) self.assertIsNone(re.match('[\\%c]' % c, 'a')) + self.assertRegex(str(warns.warnings[0].message), 'bad escape') + self.assertEqual(warns.warnings[0].filename, __file__) def test_string_boundaries(self): # See http://bugs.python.org/issue10713 diff --git a/Misc/NEWS b/Misc/NEWS index 41fe80f44c3f12..6b4b401aa62615 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Extension Modules Library ------- +- bpo-30375: Warnings emitted when compile a regular expression now always + point to the line in the user code. Previously they could point into inners + of the re module if emitted from inside of groups or conditionals. + - bpo-30048: Fixed ``Task.cancel()`` can be ignored when the task is running coroutine and the coroutine returned without any more ``await``. From 27dfbf0b4745e76f3c3d9c672c53438699c3f97f Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Tue, 16 May 2017 08:36:38 -0700 Subject: [PATCH 208/220] Remove unused variable in test_urllibnet. (#1598) (#1599) (cherry picked from commit 1bd7d299bd2a91f8267f97a413568ab8fe7fdfbb) --- Lib/test/test_urllibnet.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_urllibnet.py b/Lib/test/test_urllibnet.py index 8379f1a512e94f..b9b1eaaad47eeb 100644 --- a/Lib/test/test_urllibnet.py +++ b/Lib/test/test_urllibnet.py @@ -12,6 +12,7 @@ support.requires('network') + class URLTimeoutTest(unittest.TestCase): # XXX this test doesn't seem to test anything useful. @@ -26,7 +27,7 @@ def tearDown(self): def testURLread(self): with support.transient_internet("www.example.com"): f = urllib.request.urlopen("http://www.example.com/") - x = f.read() + f.read() class urlopenNetworkTests(unittest.TestCase): @@ -189,6 +190,7 @@ def test_data_header(self): def test_reporthook(self): records = [] + def recording_reporthook(blocks, block_size, total_size): records.append((blocks, block_size, total_size)) From 083f13e34c0b9f9ed4ed64fed3989d4af97843b3 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 17 May 2017 00:29:42 +0300 Subject: [PATCH 209/220] [3.5] bpo-30380: Fix Sphinx 1.6.1 warnings. (GH-1613) (GH-1615) --- Doc/howto/urllib2.rst | 10 +++++----- Doc/library/pyexpat.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/xml.dom.minidom.rst | 2 +- Doc/library/xml.etree.elementtree.rst | 2 +- Doc/tools/susp-ignored.csv | 10 +++++----- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 18b5c6556be1c9..8d383e03ee8a28 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -34,8 +34,8 @@ handling common situations - like basic authentication, cookies, proxies and so on. These are provided by objects called handlers and openers. urllib.request supports fetching URLs for many "URL schemes" (identified by the string -before the ":" in URL - for example "ftp" is the URL scheme of -"ftp://python.org/") using their associated network protocols (e.g. FTP, HTTP). +before the ``":"`` in URL - for example ``"ftp"`` is the URL scheme of +``"ftp://python.org/"``) using their associated network protocols (e.g. FTP, HTTP). This tutorial focuses on the most common case, HTTP. For straightforward situations *urlopen* is very easy to use. But as soon as you @@ -511,10 +511,10 @@ than the URL you pass to .add_password() will also match. :: ``top_level_url`` is in fact *either* a full URL (including the 'http:' scheme component and the hostname and optionally the port number) -e.g. "http://example.com/" *or* an "authority" (i.e. the hostname, -optionally including the port number) e.g. "example.com" or "example.com:8080" +e.g. ``"http://example.com/"`` *or* an "authority" (i.e. the hostname, +optionally including the port number) e.g. ``"example.com"`` or ``"example.com:8080"`` (the latter example includes a port number). The authority, if present, must -NOT contain the "userinfo" component - for example "joe:password@example.com" is +NOT contain the "userinfo" component - for example ``"joe:password@example.com"`` is not correct. diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 075a8b5139b196..e43b9aecd86835 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -869,7 +869,7 @@ The ``errors`` module has the following attributes: .. rubric:: Footnotes -.. [#] The encoding string included in XML output should conform to the +.. [1] The encoding string included in XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not. See https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and https://www.iana.org/assignments/character-sets/character-sets.xhtml. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 6b23b3eb610657..85fafa757ea50a 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -829,7 +829,7 @@ restrictions imposed by *s*. The ``in`` and ``not in`` operations have the same priorities as the comparison operations. The ``+`` (concatenation) and ``*`` (repetition) -operations have the same priority as the corresponding numeric operations. +operations have the same priority as the corresponding numeric operations. [3]_ .. index:: triple: operations on; sequence; types diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 2e9e814693df57..40470e8736e7e4 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -248,7 +248,7 @@ utility to most DOM users. .. rubric:: Footnotes -.. [#] The encoding name included in the XML output should conform to +.. [1] The encoding name included in the XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not valid in an XML document's declaration, even though Python accepts it as an encoding name. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index b54eace41188b0..7d814ad406eb1b 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -1192,7 +1192,7 @@ Exceptions .. rubric:: Footnotes -.. [#] The encoding string included in XML output should conform to the +.. [1] The encoding string included in XML output should conform to the appropriate standards. For example, "UTF-8" is valid, but "UTF8" is not. See https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl and https://www.iana.org/assignments/character-sets/character-sets.xhtml. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index c1dcf42a28afa8..8883f5317a4937 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -82,7 +82,7 @@ howto/pyporting,,::,Programming Language :: Python :: 2 howto/pyporting,,::,Programming Language :: Python :: 3 howto/regex,,::, howto/regex,,:foo,(?:foo) -howto/urllib2,,:password,"for example ""joe:password@example.com""" +howto/urllib2,,:password,"""joe:password@example.com""" library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," library/bisect,32,:hi,all(val >= x for val in a[i:hi]) library/bisect,42,:hi,all(val > x for val in a[i:hi]) @@ -272,8 +272,8 @@ whatsnew/3.2,,:feed,>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe: whatsnew/3.2,,:gz,">>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:" whatsnew/3.2,,:location,zope9-location = ${zope9:location} whatsnew/3.2,,:prefix,zope-conf = ${custom:prefix}/etc/zope.conf -whatsnew/changelog,,:gz,": TarFile opened with external fileobj and ""w:gz"" mode didn't" -whatsnew/changelog,,::,": Use ""127.0.0.1"" or ""::1"" instead of ""localhost"" as much as" +whatsnew/changelog,,:gz,": TarFile opened with external fileobj and " +whatsnew/changelog,,::,::1 library/re,,`,!#$%&'*+-.^_`|~: library/re,,`,\!\#\$\%\&\'\*\+\-\.\^_\`\|\~\: library/tarfile,149,:xz,'x:xz' @@ -288,8 +288,8 @@ library/xml.etree.elementtree,,:actor,"for actor in root.findall('real_person:ac library/xml.etree.elementtree,,:name,"name = actor.find('real_person:name', ns)" library/xml.etree.elementtree,,:character,"for char in actor.findall('role:character', ns):" library/zipapp,31,:main,"$ python -m zipapp myapp -m ""myapp:main""" -library/zipapp,82,:fn,"argument should have the form ""pkg.mod:fn"", where ""pkg.mod"" is a" -library/zipapp,155,:callable,"""pkg.module:callable"" and the archive will be run by importing" +library/zipapp,,:fn,"pkg.mod:fn" +library/zipapp,,:callable,"pkg.module:callable" library/stdtypes,,::,>>> m[::2].tolist() library/sys,,`,# ``wrapper`` creates a ``wrap(coro)`` coroutine: tutorial/venv,77,:c7b9645a6f35,"Python 3.4.3+ (3.4:c7b9645a6f35+, May 22 2015, 09:31:25)" From 77606957e71ce477d2c5569718f0fc36f05c6f59 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Tue, 16 May 2017 14:40:33 -0700 Subject: [PATCH 210/220] bpo-30380: Pin the version of Sphinx used to build the documentation (GH-1612) (GH-1618) --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5fee6cd7673324..fe90bad626ce83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,9 +37,11 @@ matrix: - TESTING=docs before_script: - cd Doc - - make venv + # Sphinx is pinned so that new versions that introduce new warnings won't suddenly cause build failures. + # (Updating the version is fine as long as no warnings are raised by doing so.) + - python -m pip install sphinx~=1.6.1 script: - - make check suspicious html PYTHON="./venv/bin/python" SPHINXBUILD="./venv/bin/python -m sphinx" SPHINXOPTS="-q -W" + - make check suspicious html SPHINXOPTS="-q -W" - os: linux language: c compiler: gcc From c9ba45d1b71d86321e5422e8a2cbe6e52aaba6f4 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 16:02:35 -0700 Subject: [PATCH 211/220] bpo-30329: Catch Windows error 10022 on shutdown() (#1538) (#1621) Catch the Windows socket WSAEINVAL error (code 10022) in imaplib and poplib on shutdown(SHUT_RDWR): An invalid operation was attempted This error occurs sometimes on SSL connections. (cherry picked from commit 83a2c2879839da2e10037f5e4af1bd1dafbf1a52) --- Lib/imaplib.py | 9 ++++++--- Lib/poplib.py | 9 ++++++--- Misc/NEWS | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 2f7e9331fbc86c..ef2c6f814c5716 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -310,9 +310,12 @@ def shutdown(self): self.file.close() try: self.sock.shutdown(socket.SHUT_RDWR) - except OSError as e: - # The server might already have closed the connection - if e.errno != errno.ENOTCONN: + except OSError as exc: + # The server might already have closed the connection. + # On Windows, this may result in WSAEINVAL (error 10022): + # An invalid operation was attempted. + if (exc.errno != errno.ENOTCONN + and getattr(exc, 'winerror', 0) != 10022): raise finally: self.sock.close() diff --git a/Lib/poplib.py b/Lib/poplib.py index f6723904e859e1..516b6f060d2884 100644 --- a/Lib/poplib.py +++ b/Lib/poplib.py @@ -288,9 +288,12 @@ def close(self): if sock is not None: try: sock.shutdown(socket.SHUT_RDWR) - except OSError as e: - # The server might already have closed the connection - if e.errno != errno.ENOTCONN: + except OSError as exc: + # The server might already have closed the connection. + # On Windows, this may result in WSAEINVAL (error 10022): + # An invalid operation was attempted. + if (exc.errno != errno.ENOTCONN + and getattr(exc, 'winerror', 0) != 10022): raise finally: sock.close() diff --git a/Misc/NEWS b/Misc/NEWS index 6b4b401aa62615..16cb60c9e32a30 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,10 @@ Extension Modules Library ------- +- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error + (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. + This error occurs sometimes on SSL connections. + - bpo-30375: Warnings emitted when compile a regular expression now always point to the line in the user code. Previously they could point into inners of the re module if emitted from inside of groups or conditionals. From aeb644714d37fb974e3acdf7daef031461e1283f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 17:05:29 -0700 Subject: [PATCH 212/220] bpo-30357: test_thread now uses threading_cleanup() (#1592) (#1623) test_thread: setUp() now uses support.threading_setup() and support.threading_cleanup() to wait until threads complete to avoid random side effects on following tests. Co-Authored-By: Grzegorz Grzywacz (cherry picked from commit 79ef7f8e88a4972c4aecf95cfc5cd934f1861e08) --- Lib/test/test_thread.py | 4 ++++ Misc/ACKS | 1 + Misc/NEWS | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index ef3059b68674b4..3909b75ccd4647 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -20,6 +20,7 @@ def verbose_print(arg): with _print_mutex: print(arg) + class BasicThreadTest(unittest.TestCase): def setUp(self): @@ -31,6 +32,9 @@ def setUp(self): self.running = 0 self.next_ident = 0 + key = support.threading_setup() + self.addCleanup(support.threading_cleanup, *key) + class ThreadRunningTests(BasicThreadTest): diff --git a/Misc/ACKS b/Misc/ACKS index 2d2436c9c3b8c1..3d9414b6b78316 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -543,6 +543,7 @@ Eric Groo Daniel Andrade Groppe Dag Gruneau Filip Gruszczyński +Grzegorz Grzywacz Thomas Guettler Yuyang Guo Anuj Gupta diff --git a/Misc/NEWS b/Misc/NEWS index 16cb60c9e32a30..9386cb4b33f766 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -235,6 +235,11 @@ Build Tests ----- +- bpo-30357: test_thread: setUp() now uses support.threading_setup() and + support.threading_cleanup() to wait until threads complete to avoid + random side effects on following tests. Initial patch written by Grzegorz + Grzywacz. + - bpo-28087: Skip test_asyncore and test_eintr poll failures on macOS. Skip some tests of select.poll when running on macOS due to unresolved issues with the underlying system poll function on some macOS versions. From f01c0ec9fe571e8afd50d2f5180db3c0d7b613af Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 16 May 2017 17:59:24 -0700 Subject: [PATCH 213/220] bpo-30273: update distutils.sysconfig for venv's created from Python (#1515) (#1626) compiled out-of-tree (builddir != srcdir). (see also bpo-15366) (cherry picked from commit dbdea629e2e0e4bd8845aa55041e0a0ca4172cf3) --- Lib/distutils/sysconfig.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index 4f321352151d56..bd19ebf5158b09 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -93,14 +93,11 @@ def get_python_inc(plat_specific=0, prefix=None): # the build directory may not be the source directory, we # must use "srcdir" from the makefile to find the "Include" # directory. - base = _sys_home or project_base if plat_specific: - return base - if _sys_home: - incdir = os.path.join(_sys_home, 'Include') + return _sys_home or project_base else: incdir = os.path.join(get_config_var('srcdir'), 'Include') - return os.path.normpath(incdir) + return os.path.normpath(incdir) python_dir = 'python' + get_python_version() + build_flags return os.path.join(prefix, "include", python_dir) elif os.name == "nt": From 9081b36f330964faa4dee3af03228d2ca7c71835 Mon Sep 17 00:00:00 2001 From: Xiang Zhang Date: Wed, 17 May 2017 22:02:55 +0800 Subject: [PATCH 214/220] bpo-30301: Fix AttributeError when using SimpleQueue.empty() (#1601) (#1627) Under *spawn* and *forkserver* start methods, SimpleQueue.empty() could raise AttributeError due to not setting _poll in __setstate__. --- Lib/multiprocessing/queues.py | 1 + Lib/test/_test_multiprocessing.py | 36 +++++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 40 insertions(+) diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 786a303b33705a..40ae10a88c1508 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -337,6 +337,7 @@ def __getstate__(self): def __setstate__(self, state): (self._reader, self._writer, self._rlock, self._wlock) = state + self._poll = self._reader.poll def get(self): with self._rlock: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index e41845b404307e..040212889486ec 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3868,6 +3868,42 @@ def test_semaphore_tracker(self): self.assertRegex(err, expected) self.assertRegex(err, 'semaphore_tracker: %r: \[Errno' % name1) +class TestSimpleQueue(unittest.TestCase): + + @classmethod + def _test_empty(cls, queue, child_can_start, parent_can_continue): + child_can_start.wait() + # issue 30301, could fail under spawn and forkserver + try: + queue.put(queue.empty()) + queue.put(queue.empty()) + finally: + parent_can_continue.set() + + def test_empty(self): + queue = multiprocessing.SimpleQueue() + child_can_start = multiprocessing.Event() + parent_can_continue = multiprocessing.Event() + + proc = multiprocessing.Process( + target=self._test_empty, + args=(queue, child_can_start, parent_can_continue) + ) + proc.daemon = True + proc.start() + + self.assertTrue(queue.empty()) + + child_can_start.set() + parent_can_continue.wait() + + self.assertFalse(queue.empty()) + self.assertEqual(queue.get(), True) + self.assertEqual(queue.get(), False) + self.assertTrue(queue.empty()) + + proc.join() + # # Mixins # diff --git a/Misc/NEWS b/Misc/NEWS index 9386cb4b33f766..a7a8d79cff1990 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under + *spawn* and *forkserver* start methods. + - bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. This error occurs sometimes on SSL connections. From f5633e02433a81a6d0f14fc1c3294e752f4ac1a3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 May 2017 14:49:43 -0700 Subject: [PATCH 215/220] bpo-30387: Fix warning in test_threading (#1634) (#1637) test_is_alive_after_fork() now joins directly the thread to avoid the following warning added by bpo-30357: Warning -- threading_cleanup() failed to cleanup 0 threads after 2 sec (count: 0, dangling: 21) Use also a different exit code to catch generic exit code 1. (cherry picked from commit f8d05b3a24e745ab4a974b891ac1389e2f11ce4d) --- Lib/test/test_threading.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 83a99023d7a8ae..edae526d76587c 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -470,13 +470,15 @@ def test_is_alive_after_fork(self): for i in range(20): t = threading.Thread(target=lambda: None) t.start() - self.addCleanup(t.join) pid = os.fork() if pid == 0: - os._exit(1 if t.is_alive() else 0) + os._exit(11 if t.is_alive() else 10) else: + t.join() + pid, status = os.waitpid(pid, 0) - self.assertEqual(0, status) + self.assertTrue(os.WIFEXITED(status)) + self.assertEqual(10, os.WEXITSTATUS(status)) def test_main_thread(self): main = threading.main_thread() From 9503dd1e1865bb873a1f72f63ae384bba8462c5e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 18 May 2017 22:12:57 -0700 Subject: [PATCH 216/220] bpo-27103: regrtest disables -W if -R is used (#1660) Workaround for a regrtest bug. --- Lib/test/regrtest.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index d7ca07b6647986..6cb9d5ae0e3fc5 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -425,6 +425,11 @@ def _parse_args(args, **kwargs): ns.use_resources.append(r) if ns.random_seed is not None: ns.randomize = True + if ns.huntrleaks and ns.verbose3: + ns.verbose3 = False + print("WARNING: Disable --verbose3 because it's incompatible with " + "--huntrleaks: see http://bugs.python.org/issue27103", + file=sys.stderr) return ns From 4a86fe9d3f5e7af6f019ae22536eec228f04e22e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 20 May 2017 10:23:58 +0300 Subject: [PATCH 217/220] [3.5] bpo-25794: Fix `type.__setattr__()` for non-interned attribute names. (GH-1652) (#1674) Based on patch by Eryk Sun. (cherry picked from commit d896985bb2de49046f9b6879e906d1e4db255e23) --- Lib/test/test_class.py | 27 +++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Objects/typeobject.c | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 4d554a397b4a51..ecc01f277954d5 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -568,5 +568,32 @@ class B(A): a = A(hash(A.f)^(-1)) hash(a.f) + def testSetattrWrapperNameIntern(self): + # Issue #25794: __setattr__ should intern the attribute name + class A: + pass + + def add(self, other): + return 'summa' + + name = str(b'__add__', 'ascii') # shouldn't be optimized + self.assertIsNot(name, '__add__') # not interned + type.__setattr__(A, name, add) + self.assertEqual(A() + 1, 'summa') + + name2 = str(b'__add__', 'ascii') + self.assertIsNot(name2, '__add__') + self.assertIsNot(name2, name) + type.__delattr__(A, name2) + with self.assertRaises(TypeError): + A() + 1 + + def testSetattrNonStringName(self): + class A: + pass + + with self.assertRaises(TypeError): + type.__setattr__(A, b'x', None) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index a7a8d79cff1990..dc7cbcb724d3b9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-25794: Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + - bpo-29935: Fixed error messages in the index() method of tuple, list and deque when pass indices of wrong type. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 7b76e5cd4d40dc..3f526b429b1eb4 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -3020,6 +3020,7 @@ type_getattro(PyTypeObject *type, PyObject *name) static int type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) { + int res; if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { PyErr_Format( PyExc_TypeError, @@ -3027,9 +3028,35 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) type->tp_name); return -1; } - if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0) - return -1; - return update_slot(type, name); + if (PyUnicode_Check(name)) { + if (PyUnicode_CheckExact(name)) { + if (PyUnicode_READY(name) == -1) + return -1; + Py_INCREF(name); + } + else { + name = _PyUnicode_Copy(name); + if (name == NULL) + return -1; + } + PyUnicode_InternInPlace(&name); + if (!PyUnicode_CHECK_INTERNED(name)) { + PyErr_SetString(PyExc_MemoryError, + "Out of memory interning an attribute name"); + Py_DECREF(name); + return -1; + } + } + else { + /* Will fail in _PyObject_GenericSetAttrWithDict. */ + Py_INCREF(name); + } + res = PyObject_GenericSetAttr((PyObject *)type, name, value); + if (res == 0) { + res = update_slot(type, name); + } + Py_DECREF(name); + return res; } extern void @@ -6849,7 +6876,7 @@ init_slotdefs(void) /* 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) + if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) Py_FatalError("Out of memory interning slotdef names"); } slotdefs_initialized = 1; @@ -6874,6 +6901,9 @@ update_slot(PyTypeObject *type, PyObject *name) slotdef **pp; int offset; + assert(PyUnicode_CheckExact(name)); + assert(PyUnicode_CHECK_INTERNED(name)); + /* Clear the VALID_VERSION flag of 'type' and all its subclasses. This could possibly be unified with the update_subclasses() recursion below, but carefully: @@ -6884,7 +6914,6 @@ update_slot(PyTypeObject *type, PyObject *name) init_slotdefs(); pp = ptrs; for (p = slotdefs; p->name; p++) { - /* XXX assume name is interned! */ if (p->name_strobj == name) *pp++ = p; } From 2f7f533cf6fb57fcedcbc7bd454ac59fbaf2c655 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 20 May 2017 13:06:47 +0300 Subject: [PATCH 218/220] [3.5] bpo-27945: Fixed various segfaults with dict. (GH-1657) (#1678) Based on patches by Duane Griffin and Tim Mitchell. (cherry picked from commit 753bca3934a7618a4fa96e107ad1c5c18633a683) --- Lib/test/test_dict.py | 86 +++++++++++++++++++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++ Objects/dictobject.c | 80 +++++++++++++++++++++++++--------------- 4 files changed, 142 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index b85d333dcbe49c..f59490ab76162c 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -976,6 +976,92 @@ def test_free_after_iterating(self): support.check_free_after_iterating(self, lambda d: iter(d.values()), dict) 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. + class X(): + def __del__(self): + dict_b.clear() + + def __eq__(self, other): + dict_a.clear() + return True + + def __hash__(self): + return 13 + + dict_a = {X(): 0} + dict_b = {X(): X()} + self.assertTrue(dict_a == dict_b) + + def test_fromkeys_operator_modifying_dict_operand(self): + # test fix for seg fault reported in issue 27945 part 4a. + class X(int): + def __hash__(self): + return 13 + + def __eq__(self, other): + if len(d) > 1: + d.clear() + return False + + d = {} # this is required to exist so that d can be constructed! + d = {X(1): 1, X(2): 2} + try: + dict.fromkeys(d) # shouldn't crash + except RuntimeError: # implementation defined + pass + + def test_fromkeys_operator_modifying_set_operand(self): + # test fix for seg fault reported in issue 27945 part 4b. + class X(int): + def __hash__(self): + return 13 + + def __eq__(self, other): + if len(d) > 1: + d.clear() + return False + + d = {} # this is required to exist so that d can be constructed! + d = {X(1), X(2)} + try: + dict.fromkeys(d) # shouldn't crash + except RuntimeError: # implementation defined + pass + + def test_dictitems_contains_use_after_free(self): + class X: + def __eq__(self, other): + d.clear() + return NotImplemented + + d = {0: set()} + (0, X()) in d.items() + + def test_init_use_after_free(self): + class X: + def __hash__(self): + pair[:] = [] + return 13 + + pair = [X(), 123] + dict([pair]) + + def test_oob_indexing_dictiter_iternextitem(self): + class X(int): + def __del__(self): + d.clear() + + d = {i: X(i) for i in range(8)} + + def iter_and_mutate(): + for result in d.items(): + if result[0] == 2: + d[2] = None # free d[2] --> X(2).__del__ was called + + self.assertRaises(RuntimeError, iter_and_mutate) + + from test import mapping_tests class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): diff --git a/Misc/ACKS b/Misc/ACKS index 3d9414b6b78316..d91d9c1ee0d641 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -534,6 +534,7 @@ Tim Graham Kim Gräsman Nathaniel Gray Eddy De Greef +Duane Griffin Grant Griffin Andrea Griffini Duncan Grisby diff --git a/Misc/NEWS b/Misc/NEWS index dc7cbcb724d3b9..43e7748e48f142 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Release date: XXXX-XX-XX Core and Builtins ----------------- +- bpo-27945: Fixed various segfaults with dict when input collections are + mutated during searching, inserting or comparing. Based on patches by + Duane Griffin and Tim Mitchell. + - bpo-25794: Fixed type.__setattr__() and type.__delattr__() for non-interned attribute names. Based on patch by Eryk Sun. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index e277ab87e7bfae..ff77beeed7c243 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -787,56 +787,61 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) PyDictKeyEntry *ep; assert(key != dummy); + Py_INCREF(key); + Py_INCREF(value); if (mp->ma_values != NULL && !PyUnicode_CheckExact(key)) { if (insertion_resize(mp) < 0) - return -1; + goto Fail; } ep = mp->ma_keys->dk_lookup(mp, key, hash, &value_addr); - if (ep == NULL) { - return -1; - } + if (ep == NULL) + goto Fail; + assert(PyUnicode_CheckExact(key) || mp->ma_keys->dk_lookup == lookdict); - Py_INCREF(value); MAINTAIN_TRACKING(mp, key, value); old_value = *value_addr; if (old_value != NULL) { assert(ep->me_key != NULL && ep->me_key != dummy); *value_addr = value; Py_DECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ + Py_DECREF(key); } else { if (ep->me_key == NULL) { - Py_INCREF(key); if (mp->ma_keys->dk_usable <= 0) { /* Need to resize. */ - if (insertion_resize(mp) < 0) { - Py_DECREF(key); - Py_DECREF(value); - return -1; - } + if (insertion_resize(mp) < 0) + goto Fail; ep = find_empty_slot(mp, key, hash, &value_addr); } + mp->ma_used++; + *value_addr = value; mp->ma_keys->dk_usable--; assert(mp->ma_keys->dk_usable >= 0); ep->me_key = key; ep->me_hash = hash; + assert(ep->me_key != NULL && ep->me_key != dummy); } else { + mp->ma_used++; + *value_addr = value; if (ep->me_key == dummy) { - Py_INCREF(key); ep->me_key = key; ep->me_hash = hash; Py_DECREF(dummy); } else { assert(_PyDict_HasSplitTable(mp)); + Py_DECREF(key); } } - mp->ma_used++; - *value_addr = value; - assert(ep->me_key != NULL && ep->me_key != dummy); } return 0; + +Fail: + Py_DECREF(value); + Py_DECREF(key); + return -1; } /* @@ -2057,11 +2062,18 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override) /* Update/merge with this (key, value) pair. */ key = PySequence_Fast_GET_ITEM(fast, 0); value = PySequence_Fast_GET_ITEM(fast, 1); + Py_INCREF(key); + Py_INCREF(value); if (override || PyDict_GetItem(d, key) == NULL) { int status = PyDict_SetItem(d, key, value); - if (status < 0) + if (status < 0) { + Py_DECREF(key); + Py_DECREF(value); goto Fail; + } } + Py_DECREF(key); + Py_DECREF(value); Py_DECREF(fast); Py_DECREF(item); } @@ -2320,14 +2332,15 @@ dict_equal(PyDictObject *a, PyDictObject *b) bval = NULL; else bval = *vaddr; - Py_DECREF(key); if (bval == NULL) { + Py_DECREF(key); Py_DECREF(aval); if (PyErr_Occurred()) return -1; return 0; } cmp = PyObject_RichCompareBool(aval, bval, Py_EQ); + Py_DECREF(key); Py_DECREF(aval); if (cmp <= 0) /* error or not equal */ return cmp; @@ -3152,7 +3165,7 @@ PyTypeObject PyDictIterValue_Type = { static PyObject *dictiter_iternextitem(dictiterobject *di) { - PyObject *key, *value, *result = di->di_result; + PyObject *key, *value, *result; Py_ssize_t i, mask, offset; PyDictObject *d = di->di_dict; PyObject **value_ptr; @@ -3188,22 +3201,27 @@ static PyObject *dictiter_iternextitem(dictiterobject *di) if (i > mask) goto fail; - if (result->ob_refcnt == 1) { + di->len--; + key = d->ma_keys->dk_entries[i].me_key; + value = *value_ptr; + Py_INCREF(key); + Py_INCREF(value); + result = di->di_result; + if (Py_REFCNT(result) == 1) { + PyObject *oldkey = PyTuple_GET_ITEM(result, 0); + PyObject *oldvalue = PyTuple_GET_ITEM(result, 1); + PyTuple_SET_ITEM(result, 0, key); /* steals reference */ + PyTuple_SET_ITEM(result, 1, value); /* steals reference */ Py_INCREF(result); - Py_DECREF(PyTuple_GET_ITEM(result, 0)); - Py_DECREF(PyTuple_GET_ITEM(result, 1)); + Py_DECREF(oldkey); + Py_DECREF(oldvalue); } else { result = PyTuple_New(2); if (result == NULL) return NULL; + PyTuple_SET_ITEM(result, 0, key); /* steals reference */ + PyTuple_SET_ITEM(result, 1, value); /* steals reference */ } - di->len--; - key = d->ma_keys->dk_entries[i].me_key; - value = *value_ptr; - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(result, 0, key); /* steals reference */ - PyTuple_SET_ITEM(result, 1, value); /* steals reference */ return result; fail: @@ -3696,6 +3714,7 @@ dictitems_iter(_PyDictViewObject *dv) static int dictitems_contains(_PyDictViewObject *dv, PyObject *obj) { + int result; PyObject *key, *value, *found; if (dv->dv_dict == NULL) return 0; @@ -3709,7 +3728,10 @@ dictitems_contains(_PyDictViewObject *dv, PyObject *obj) return -1; return 0; } - return PyObject_RichCompareBool(value, found, Py_EQ); + Py_INCREF(found); + result = PyObject_RichCompareBool(value, found, Py_EQ); + Py_DECREF(found); + return result; } static PySequenceMethods dictitems_as_sequence = { From a2a822614c64b01b0cf5c0ee63a96b3ad4561a85 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 20 May 2017 23:22:55 -0700 Subject: [PATCH 219/220] bpo-29976: urllib.parse clarify '' in scheme values. (GH-984) (GH-1693) (cherry picked from commit 906f5330b9c9a74cad1cf27fddaf77e99dff9edd) --- Lib/urllib/parse.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py index 50641ba69bc83b..5746a4ee019baa 100644 --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -38,29 +38,37 @@ "DefragResult", "ParseResult", "SplitResult", "DefragResultBytes", "ParseResultBytes", "SplitResultBytes"] -# A classification of schemes ('' means apply by default) -uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap', +# A classification of schemes. +# The empty string classifies URLs with no scheme specified, +# being the default value returned by “urlsplit” and “urlparse”. + +uses_relative = ['', 'ftp', 'http', 'gopher', 'nntp', 'imap', 'wais', 'file', 'https', 'shttp', 'mms', - 'prospero', 'rtsp', 'rtspu', '', 'sftp', + 'prospero', 'rtsp', 'rtspu', 'sftp', 'svn', 'svn+ssh', 'ws', 'wss'] -uses_netloc = ['ftp', 'http', 'gopher', 'nntp', 'telnet', + +uses_netloc = ['', 'ftp', 'http', 'gopher', 'nntp', 'telnet', 'imap', 'wais', 'file', 'mms', 'https', 'shttp', - 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', '', + 'snews', 'prospero', 'rtsp', 'rtspu', 'rsync', 'svn', 'svn+ssh', 'sftp', 'nfs', 'git', 'git+ssh', 'ws', 'wss'] -uses_params = ['ftp', 'hdl', 'prospero', 'http', 'imap', + +uses_params = ['', 'ftp', 'hdl', 'prospero', 'http', 'imap', 'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips', - 'mms', '', 'sftp', 'tel'] + 'mms', 'sftp', 'tel'] # These are not actually used anymore, but should stay for backwards # compatibility. (They are undocumented, but have a public-looking name.) + non_hierarchical = ['gopher', 'hdl', 'mailto', 'news', 'telnet', 'wais', 'imap', 'snews', 'sip', 'sips'] -uses_query = ['http', 'wais', 'imap', 'https', 'shttp', 'mms', - 'gopher', 'rtsp', 'rtspu', 'sip', 'sips', ''] -uses_fragment = ['ftp', 'hdl', 'http', 'gopher', 'news', + +uses_query = ['', 'http', 'wais', 'imap', 'https', 'shttp', 'mms', + 'gopher', 'rtsp', 'rtspu', 'sip', 'sips'] + +uses_fragment = ['', 'ftp', 'hdl', 'http', 'gopher', 'news', 'nntp', 'wais', 'https', 'shttp', 'snews', - 'file', 'prospero', ''] + 'file', 'prospero'] # Characters valid in scheme names scheme_chars = ('abcdefghijklmnopqrstuvwxyz' From bc75b72d393bc40c3243d7099db6c2c39fe632aa Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 21 May 2017 10:35:58 +0300 Subject: [PATCH 220/220] [3.5] bpo-30415: Add new tests for the fnmatch module. (GH-1684) (#1695) (cherry picked from commit 8175547) --- Lib/test/test_fnmatch.py | 64 ++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_fnmatch.py b/Lib/test/test_fnmatch.py index fa37f90c27e9a5..e37e4f5d479737 100644 --- a/Lib/test/test_fnmatch.py +++ b/Lib/test/test_fnmatch.py @@ -1,18 +1,19 @@ """Test cases for the fnmatch module.""" import unittest +import os from fnmatch import fnmatch, fnmatchcase, translate, filter class FnmatchTestCase(unittest.TestCase): - def check_match(self, filename, pattern, should_match=1, fn=fnmatch): + def check_match(self, filename, pattern, should_match=True, fn=fnmatch): if should_match: self.assertTrue(fn(filename, pattern), "expected %r to match pattern %r" % (filename, pattern)) else: - self.assertTrue(not fn(filename, pattern), + self.assertFalse(fn(filename, pattern), "expected %r not to match pattern %r" % (filename, pattern)) @@ -26,15 +27,15 @@ def test_fnmatch(self): check('abc', '*') check('abc', 'ab[cd]') check('abc', 'ab[!de]') - check('abc', 'ab[de]', 0) - check('a', '??', 0) - check('a', 'b', 0) + check('abc', 'ab[de]', False) + check('a', '??', False) + check('a', 'b', False) # these test that '\' is handled correctly in character sets; # see SF bug #409651 check('\\', r'[\]') check('a', r'[!\]') - check('\\', r'[!\]', 0) + check('\\', r'[!\]', False) # test that filenames with newlines in them are handled correctly. # http://bugs.python.org/issue6665 @@ -51,14 +52,38 @@ def test_mix_bytes_str(self): def test_fnmatchcase(self): check = self.check_match - check('AbC', 'abc', 0, fnmatchcase) - check('abc', 'AbC', 0, fnmatchcase) + check('abc', 'abc', True, fnmatchcase) + check('AbC', 'abc', False, fnmatchcase) + check('abc', 'AbC', False, fnmatchcase) + check('AbC', 'AbC', True, fnmatchcase) + + check('usr/bin', 'usr/bin', True, fnmatchcase) + check('usr\\bin', 'usr/bin', False, fnmatchcase) + check('usr/bin', 'usr\\bin', False, fnmatchcase) + check('usr\\bin', 'usr\\bin', True, fnmatchcase) def test_bytes(self): self.check_match(b'test', b'te*') self.check_match(b'test\xff', b'te*\xff') self.check_match(b'foo\nbar', b'foo*') + def test_case(self): + ignorecase = os.path.normcase('ABC') == os.path.normcase('abc') + check = self.check_match + check('abc', 'abc') + check('AbC', 'abc', ignorecase) + check('abc', 'AbC', ignorecase) + check('AbC', 'AbC') + + def test_sep(self): + normsep = os.path.normcase('\\') == os.path.normcase('/') + check = self.check_match + check('usr/bin', 'usr/bin') + check('usr\\bin', 'usr/bin', normsep) + check('usr/bin', 'usr\\bin', normsep) + check('usr\\bin', 'usr\\bin') + + class TranslateTestCase(unittest.TestCase): def test_translate(self): @@ -75,7 +100,28 @@ def test_translate(self): class FilterTestCase(unittest.TestCase): def test_filter(self): - self.assertEqual(filter(['a', 'b'], 'a'), ['a']) + self.assertEqual(filter(['Python', 'Ruby', 'Perl', 'Tcl'], 'P*'), + ['Python', 'Perl']) + self.assertEqual(filter([b'Python', b'Ruby', b'Perl', b'Tcl'], b'P*'), + [b'Python', b'Perl']) + + def test_mix_bytes_str(self): + self.assertRaises(TypeError, filter, ['test'], b'*') + self.assertRaises(TypeError, filter, [b'test'], '*') + + def test_case(self): + ignorecase = os.path.normcase('P') == os.path.normcase('p') + self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.p*'), + ['Test.py', 'Test.PL'] if ignorecase else ['Test.py']) + self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.P*'), + ['Test.py', 'Test.PL'] if ignorecase else ['Test.PL']) + + def test_sep(self): + normsep = os.path.normcase('\\') == os.path.normcase('/') + self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr/*'), + ['usr/bin', 'usr\\lib'] if normsep else ['usr/bin']) + self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr\\*'), + ['usr/bin', 'usr\\lib'] if normsep else ['usr\\lib']) if __name__ == "__main__":