commit 6d6343ca6b8279662e7f39d50d78af527c9e4b72460442ee9fd45e36d5da4962 Author: Matej Cepl Date: Mon Jul 13 06:10:55 2020 +0000 osc copypac from project:devel:languages:python:Factory package:python38 revision:14 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python39?expand=0&rev=1 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/CVE-2019-5010-null-defer-x509-cert-DOS.patch b/CVE-2019-5010-null-defer-x509-cert-DOS.patch new file mode 100644 index 0000000..e0ec246 --- /dev/null +++ b/CVE-2019-5010-null-defer-x509-cert-DOS.patch @@ -0,0 +1,59 @@ +From a37f52436f9aa4b9292878b72f3ff1480e2606c3 Mon Sep 17 00:00:00 2001 +From: Christian Heimes +Date: Tue, 15 Jan 2019 23:47:42 +0100 +Subject: [PATCH] bpo-35746: Fix segfault in ssl's cert parser (GH-11569) + +Fix a NULL pointer deref in ssl module. The cert parser did not handle CRL +distribution points with empty DP or URI correctly. A malicious or buggy +certificate can result into segfault. + +Signed-off-by: Christian Heimes + + + +https://bugs.python.org/issue35746 +--- + Lib/test/talos-2019-0758.pem | 22 +++++++++++++++++++ + Lib/test/test_ssl.py | 22 +++++++++++++++++++ + .../2019-01-15-18-16-05.bpo-35746.nMSd0j.rst | 3 +++ + Modules/_ssl.c | 4 ++++ + 4 files changed, 51 insertions(+) + create mode 100644 Lib/test/talos-2019-0758.pem + create mode 100644 Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst + +--- a/Lib/test/test_ssl.py ++++ b/Lib/test/test_ssl.py +@@ -467,6 +467,27 @@ class BasicSocketTests(unittest.TestCase + } + ) + ++ def test_parse_cert_CVE_2019_5010(self): ++ p = ssl._ssl._test_decode_cert(TALOS_INVALID_CRLDP) ++ if support.verbose: ++ sys.stdout.write("\n" + pprint.pformat(p) + "\n") ++ self.assertEqual( ++ p, ++ { ++ 'issuer': ( ++ (('countryName', 'UK'),), (('commonName', 'cody-ca'),)), ++ 'notAfter': 'Jun 14 18:00:58 2028 GMT', ++ 'notBefore': 'Jun 18 18:00:58 2018 GMT', ++ 'serialNumber': '02', ++ 'subject': ((('countryName', 'UK'),), ++ (('commonName', ++ 'codenomicon-vm-2.test.lal.cisco.com'),)), ++ 'subjectAltName': ( ++ ('DNS', 'codenomicon-vm-2.test.lal.cisco.com'),), ++ 'version': 3 ++ } ++ ) ++ + def test_parse_cert_CVE_2013_4238(self): + p = ssl._ssl._test_decode_cert(NULLBYTECERT) + if support.verbose: +--- /dev/null ++++ b/Misc/NEWS.d/next/Security/2019-01-15-18-16-05.bpo-35746.nMSd0j.rst +@@ -0,0 +1,3 @@ ++[CVE-2019-5010] Fix a NULL pointer deref in ssl module. The cert parser did ++not handle CRL distribution points with empty DP or URI correctly. A ++malicious or buggy certificate can result into segfault. diff --git a/F00102-lib64.patch b/F00102-lib64.patch new file mode 100644 index 0000000..18ac3ba --- /dev/null +++ b/F00102-lib64.patch @@ -0,0 +1,236 @@ +From 81904771db8b112c8617a111e989b68e55af7a9c Mon Sep 17 00:00:00 2001 +From: David Malcolm +Date: Wed, 13 Jan 2010 21:25:18 +0000 +Subject: [PATCH] 00102: Change the various install paths to use /usr/lib64/ + instead or /usr/lib/ +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Only used when "%{_lib}" == "lib64". + +Co-authored-by: David Malcolm +Co-authored-by: Thomas Spura +Co-authored-by: Slavek Kabrda +Co-authored-by: Matej Stuchlik +Co-authored-by: Tomas Orsava +Co-authored-by: Charalampos Stratakis +Co-authored-by: Petr Viktorin +Co-authored-by: Miro HronĨok +Co-authored-by: Iryna Shcherbina +--- + Lib/distutils/command/install.py | 4 ++-- + Lib/distutils/sysconfig.py | 6 +++++- + Lib/distutils/tests/test_install.py | 3 ++- + Lib/site.py | 4 ++++ + Lib/sysconfig.py | 12 ++++++------ + Lib/test/test_site.py | 4 ++-- + Makefile.pre.in | 2 +- + Modules/getpath.c | 6 +++--- + configure | 4 ++-- + configure.ac | 4 ++-- + setup.py | 6 +++--- + 11 files changed, 32 insertions(+), 23 deletions(-) + +--- a/Lib/distutils/command/install.py ++++ b/Lib/distutils/command/install.py +@@ -30,14 +30,14 @@ WINDOWS_SCHEME = { + INSTALL_SCHEMES = { + 'unix_prefix': { + 'purelib': '$base/lib/python$py_version_short/site-packages', +- 'platlib': '$platbase/lib/python$py_version_short/site-packages', ++ 'platlib': '$platbase/lib64/python$py_version_short/site-packages', + 'headers': '$base/include/python$py_version_short$abiflags/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', + }, + 'unix_home': { + 'purelib': '$base/lib/python', +- 'platlib': '$base/lib/python', ++ 'platlib': '$base/lib64/python', + 'headers': '$base/include/python/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -146,8 +146,12 @@ def get_python_lib(plat_specific=0, stan + prefix = plat_specific and EXEC_PREFIX or PREFIX + + if os.name == "posix": ++ if plat_specific or standard_lib: ++ lib = "lib64" ++ else: ++ lib = "lib" + libpython = os.path.join(prefix, +- "lib", "python" + get_python_version()) ++ lib, "python" + get_python_version()) + if standard_lib: + return libpython + else: +--- a/Lib/distutils/tests/test_install.py ++++ b/Lib/distutils/tests/test_install.py +@@ -57,8 +57,9 @@ class InstallTestCase(support.TempdirMan + self.assertEqual(got, expected) + + libdir = os.path.join(destination, "lib", "python") ++ platlibdir = os.path.join(destination, "lib", "python") + check_path(cmd.install_lib, libdir) +- check_path(cmd.install_platlib, libdir) ++ check_path(cmd.install_platlib, platlibdir) + check_path(cmd.install_purelib, libdir) + check_path(cmd.install_headers, + os.path.join(destination, "include", "python", "foopkg")) +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -335,11 +335,15 @@ def getsitepackages(prefixes=None): + seen.add(prefix) + + if os.sep == '/': ++ sitepackages.append(os.path.join(prefix, "lib64", ++ "python" + sys.version[:3], ++ "site-packages")) + sitepackages.append(os.path.join(prefix, "lib", + "python%d.%d" % sys.version_info[:2], + "site-packages")) + else: + sitepackages.append(prefix) ++ sitepackages.append(os.path.join(prefix, "lib64", "site-packages")) + sitepackages.append(os.path.join(prefix, "lib", "site-packages")) + return sitepackages + +--- a/Lib/sysconfig.py ++++ b/Lib/sysconfig.py +@@ -20,10 +20,10 @@ __all__ = [ + + _INSTALL_SCHEMES = { + 'posix_prefix': { +- 'stdlib': '{installed_base}/lib/python{py_version_short}', +- 'platstdlib': '{platbase}/lib/python{py_version_short}', ++ 'stdlib': '{installed_base}/lib64/python{py_version_short}', ++ 'platstdlib': '{platbase}/lib64/python{py_version_short}', + 'purelib': '{base}/lib/python{py_version_short}/site-packages', +- 'platlib': '{platbase}/lib/python{py_version_short}/site-packages', ++ 'platlib': '{platbase}/lib64/python{py_version_short}/site-packages', + 'include': + '{installed_base}/include/python{py_version_short}{abiflags}', + 'platinclude': +@@ -62,10 +62,10 @@ _INSTALL_SCHEMES = { + 'data': '{userbase}', + }, + 'posix_user': { +- 'stdlib': '{userbase}/lib/python{py_version_short}', +- 'platstdlib': '{userbase}/lib/python{py_version_short}', ++ 'stdlib': '{userbase}/lib64/python{py_version_short}', ++ 'platstdlib': '{userbase}/lib64/python{py_version_short}', + 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', +- 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', ++ 'platlib': '{userbase}/lib64/python{py_version_short}/site-packages', + 'include': '{userbase}/include/python{py_version_short}', + 'scripts': '{userbase}/bin', + 'data': '{userbase}', +--- a/Lib/test/test_site.py ++++ b/Lib/test/test_site.py +@@ -266,8 +266,8 @@ class HelperFunctionsTests(unittest.Test + dirs = site.getsitepackages() + if os.sep == '/': + # OS X, Linux, FreeBSD, etc +- self.assertEqual(len(dirs), 1) +- wanted = os.path.join('xoxo', 'lib', ++ self.assertEqual(len(dirs), 2) ++ wanted = os.path.join('xoxo', 'lib64', + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + self.assertEqual(dirs[0], wanted) +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -143,7 +143,7 @@ LIBDIR= @libdir@ + MANDIR= @mandir@ + INCLUDEDIR= @includedir@ + CONFINCLUDEDIR= $(exec_prefix)/include +-SCRIPTDIR= $(prefix)/lib ++SCRIPTDIR= $(prefix)/lib64 + ABIFLAGS= @ABIFLAGS@ + + # Detailed destination directories +--- a/Modules/getpath.c ++++ b/Modules/getpath.c +@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *c + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } +- status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); ++ status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calc + return PATHLEN_ERR(); + } + } +- status = joinpath(zip_path, L"lib/python00.zip", zip_path_len); ++ status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculat + if (!calculate->exec_prefix) { + return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + } +- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len); ++ calculate->lib_python = Py_DecodeLocale("lib64/python" VERSION, &len); + if (!calculate->lib_python) { + return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + } +--- a/configure ++++ b/configure +@@ -15188,9 +15188,9 @@ fi + + + if test x$PLATFORM_TRIPLET = x; then +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" ++ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}" + else +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" ++ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + fi + + +--- a/configure.ac ++++ b/configure.ac +@@ -4674,9 +4674,9 @@ fi + dnl define LIBPL after ABIFLAGS and LDVERSION is defined. + AC_SUBST(PY_ENABLE_SHARED) + if test x$PLATFORM_TRIPLET = x; then +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" ++ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}" + else +- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" ++ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + fi + AC_SUBST(LIBPL) + +--- a/setup.py ++++ b/setup.py +@@ -649,7 +649,7 @@ class PyBuildExt(build_ext): + # directories (i.e. '.' and 'Include') must be first. See issue + # 10520. + if not CROSS_COMPILING: +- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') ++ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + # only change this for cross builds for 3.3, issues on Mageia + if CROSS_COMPILING: +@@ -953,11 +953,11 @@ class PyBuildExt(build_ext): + elif curses_library: + readline_libs.append(curses_library) + elif self.compiler.find_library_file(self.lib_dirs + +- ['/usr/lib/termcap'], ++ ['/usr/lib64/termcap'], + 'termcap'): + readline_libs.append('termcap') + self.add(Extension('readline', ['readline.c'], +- library_dirs=['/usr/lib/termcap'], ++ library_dirs=['/usr/lib64/termcap'], + extra_link_args=readline_extra_link_args, + libraries=readline_libs)) + else: diff --git a/F00251-change-user-install-location.patch b/F00251-change-user-install-location.patch new file mode 100644 index 0000000..99d06be --- /dev/null +++ b/F00251-change-user-install-location.patch @@ -0,0 +1,64 @@ +From 910f38d9768d39d4d31426743ae4081ed1ab66b6 Mon Sep 17 00:00:00 2001 +From: Michal Cyprian +Date: Mon, 26 Jun 2017 16:32:56 +0200 +Subject: [PATCH] 00251: Change user install location + +Set values of prefix and exec_prefix in distutils install command +to /usr/local if executable is /usr/bin/python* and RPM build +is not detected to make pip and distutils install into separate location. + +Fedora Change: https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe +--- + Lib/distutils/command/install.py | 15 +++++++++++++-- + Lib/site.py | 9 ++++++++- + 2 files changed, 21 insertions(+), 3 deletions(-) + +diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py +index ae4f915669..0e4fd5b74a 100644 +--- a/Lib/distutils/command/install.py ++++ b/Lib/distutils/command/install.py +@@ -418,8 +418,19 @@ class install(Command): + raise DistutilsOptionError( + "must not supply exec-prefix without prefix") + +- self.prefix = os.path.normpath(sys.prefix) +- self.exec_prefix = os.path.normpath(sys.exec_prefix) ++ # self.prefix is set to sys.prefix + /local/ ++ # if neither RPM build nor virtual environment is ++ # detected to make pip and distutils install packages ++ # into the separate location. ++ if (not (hasattr(sys, 'real_prefix') or ++ sys.prefix != sys.base_prefix) and ++ 'RPM_BUILD_ROOT' not in os.environ): ++ addition = "/local" ++ else: ++ addition = "" ++ ++ self.prefix = os.path.normpath(sys.prefix) + addition ++ self.exec_prefix = os.path.normpath(sys.exec_prefix) + addition + + else: + if self.exec_prefix is None: +diff --git a/Lib/site.py b/Lib/site.py +index 22d53fa562..9513526109 100644 +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -348,7 +348,14 @@ def getsitepackages(prefixes=None): + return sitepackages + + def addsitepackages(known_paths, prefixes=None): +- """Add site-packages to sys.path""" ++ """Add site-packages to sys.path ++ ++ '/usr/local' is included in PREFIXES if RPM build is not detected ++ to make packages installed into this location visible. ++ ++ """ ++ if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ: ++ PREFIXES.insert(0, "/usr/local") + for sitedir in getsitepackages(prefixes): + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) +-- +2.21.0 + diff --git a/OBS_dev-shm.patch b/OBS_dev-shm.patch new file mode 100644 index 0000000..32a508c --- /dev/null +++ b/OBS_dev-shm.patch @@ -0,0 +1,175 @@ +From 0edba4a774f8fc6867d49ebd2d9c6831901e30dd Mon Sep 17 00:00:00 2001 +From: Victor Stinner +Date: Wed, 17 Jun 2020 17:53:48 +0200 +Subject: [PATCH] bpo-38377: Add + support.skip_if_broken_multiprocessing_synchronize() + +On Linux, skip tests using multiprocessing if the current user cannot +create a file in /dev/shm/ directory. Add the +skip_if_broken_multiprocessing_synchronize() function to the +test.support module. +--- + Doc/library/test.rst | 8 +++++++ + Lib/test/_test_multiprocessing.py | 2 +- + Lib/test/support/__init__.py | 22 +++++++++++++++++++ + Lib/test/test_asyncio/test_events.py | 4 ++-- + Lib/test/test_concurrent_futures.py | 2 +- + Lib/test/test_logging.py | 8 +++---- + .../test_multiprocessing_main_handling.py | 2 +- + Lib/test/test_venv.py | 8 ++++--- + .../2020-06-17-18-00-21.bpo-38377.jfg4TH.rst | 4 ++++ + 9 files changed, 48 insertions(+), 12 deletions(-) + create mode 100644 Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst + +--- a/Doc/library/test.rst ++++ b/Doc/library/test.rst +@@ -1282,6 +1282,14 @@ The :mod:`test.support` module defines t + + .. versionadded:: 3.6 + ++.. function:: skip_if_broken_multiprocessing_synchronize() ++ ++ Skip tests if the :mod:`multiprocessing.synchronize` module is missing, if ++ there is no available semaphore implementation, or if creating a lock raises ++ an :exc:`OSError`. ++ ++ .. versionadded:: 3.10 ++ + + The :mod:`test.support` module defines the following classes: + +--- a/Lib/test/_test_multiprocessing.py ++++ b/Lib/test/_test_multiprocessing.py +@@ -31,7 +31,7 @@ from test import support + # Skip tests if _multiprocessing wasn't built. + _multiprocessing = test.support.import_module('_multiprocessing') + # Skip tests if sem_open implementation is broken. +-test.support.import_module('multiprocessing.synchronize') ++support.skip_if_broken_multiprocessing_synchronize() + import threading + + import multiprocessing.connection +--- a/Lib/test/support/__init__.py ++++ b/Lib/test/support/__init__.py +@@ -3350,3 +3350,25 @@ class catch_threading_exception: + del self.exc_value + del self.exc_traceback + del self.thread ++ ++def skip_if_broken_multiprocessing_synchronize(): ++ """ ++ Skip tests if the multiprocessing.synchronize module is missing, if there ++ is no available semaphore implementation, or if creating a lock raises an ++ OSError. ++ """ ++ ++ # Skip tests if the _multiprocessing extension is missing. ++ import_module('_multiprocessing') ++ ++ # Skip tests if there is no available semaphore implementation: ++ # multiprocessing.synchronize requires _multiprocessing.SemLock. ++ synchronize = import_module('multiprocessing.synchronize') ++ ++ try: ++ # bpo-38377: On Linux, creating a semaphore is the current user ++ # does not have the permission to create a file in /dev/shm. ++ # Create a semaphore to check permissions. ++ synchronize.Lock(ctx=None) ++ except OSError as exc: ++ raise unittest.SkipTest(f"broken multiprocessing SemLock: {exc!r}") +--- a/Lib/test/test_asyncio/test_events.py ++++ b/Lib/test/test_asyncio/test_events.py +@@ -2635,10 +2635,10 @@ class GetEventLoopTestsMixin: + if sys.platform != 'win32': + + def test_get_event_loop_new_process(self): +- # Issue bpo-32126: The multiprocessing module used by ++ # bpo-32126: The multiprocessing module used by + # ProcessPoolExecutor is not functional when the + # multiprocessing.synchronize module cannot be imported. +- support.import_module('multiprocessing.synchronize') ++ support.skip_if_broken_multiprocessing_synchronize() + + async def main(): + pool = concurrent.futures.ProcessPoolExecutor() +--- a/Lib/test/test_concurrent_futures.py ++++ b/Lib/test/test_concurrent_futures.py +@@ -3,7 +3,7 @@ import test.support + # Skip tests if _multiprocessing wasn't built. + test.support.import_module('_multiprocessing') + # Skip tests if sem_open implementation is broken. +-test.support.import_module('multiprocessing.synchronize') ++test.support.skip_if_broken_multiprocessing_synchronize() + + from test.support.script_helper import assert_python_ok + +--- a/Lib/test/test_logging.py ++++ b/Lib/test/test_logging.py +@@ -3621,9 +3621,9 @@ if hasattr(logging.handlers, 'QueueListe + + @patch.object(logging.handlers.QueueListener, 'handle') + def test_handle_called_with_mp_queue(self, mock_handle): +- # Issue 28668: The multiprocessing (mp) module is not functional ++ # bpo-28668: The multiprocessing (mp) module is not functional + # when the mp.synchronize module cannot be imported. +- support.import_module('multiprocessing.synchronize') ++ support.skip_if_broken_multiprocessing_synchronize() + for i in range(self.repeat): + log_queue = multiprocessing.Queue() + self.setup_and_log(log_queue, '%s_%s' % (self.id(), i)) +@@ -3647,9 +3647,9 @@ if hasattr(logging.handlers, 'QueueListe + indicates that messages were not registered on the queue until + _after_ the QueueListener stopped. + """ +- # Issue 28668: The multiprocessing (mp) module is not functional ++ # bpo-28668: The multiprocessing (mp) module is not functional + # when the mp.synchronize module cannot be imported. +- support.import_module('multiprocessing.synchronize') ++ support.skip_if_broken_multiprocessing_synchronize() + for i in range(self.repeat): + queue = multiprocessing.Queue() + self.setup_and_log(queue, '%s_%s' %(self.id(), i)) +--- a/Lib/test/test_multiprocessing_main_handling.py ++++ b/Lib/test/test_multiprocessing_main_handling.py +@@ -23,7 +23,7 @@ import multiprocessing + AVAILABLE_START_METHODS = set(multiprocessing.get_all_start_methods()) + + # Issue #22332: Skip tests if sem_open implementation is broken. +-support.import_module('multiprocessing.synchronize') ++support.skip_if_broken_multiprocessing_synchronize() + + verbose = support.verbose + +--- a/Lib/test/test_venv.py ++++ b/Lib/test/test_venv.py +@@ -16,7 +16,8 @@ import sys + import tempfile + from test.support import (captured_stdout, captured_stderr, requires_zlib, + can_symlink, EnvironmentVarGuard, rmtree, +- import_module) ++ import_module, ++ skip_if_broken_multiprocessing_synchronize) + import threading + import unittest + import venv +@@ -324,10 +325,11 @@ class BasicTest(BaseTest): + """ + Test that the multiprocessing is able to spawn. + """ +- # Issue bpo-36342: Instanciation of a Pool object imports the ++ # bpo-36342: Instantiation of a Pool object imports the + # multiprocessing.synchronize module. Skip the test if this module + # cannot be imported. +- import_module('multiprocessing.synchronize') ++ skip_if_broken_multiprocessing_synchronize() ++ + rmtree(self.env_dir) + self.run_with_capture(venv.create, self.env_dir) + envpy = os.path.join(os.path.realpath(self.env_dir), +--- /dev/null ++++ b/Misc/NEWS.d/next/Tests/2020-06-17-18-00-21.bpo-38377.jfg4TH.rst +@@ -0,0 +1,4 @@ ++On Linux, skip tests using multiprocessing if the current user cannot create ++a file in ``/dev/shm/`` directory. Add the ++:func:`~test.support.skip_if_broken_multiprocessing_synchronize` function to ++the :mod:`test.support` module. diff --git a/PACKAGING-NOTES b/PACKAGING-NOTES new file mode 100644 index 0000000..e28c88c --- /dev/null +++ b/PACKAGING-NOTES @@ -0,0 +1,26 @@ +Notes for packagers of Python3 +============================== + +0. Faster build turnaround +-------------------------- + +By default, python builds with profile-guided optimization. This needs +an additional run of the test suite and it is generally slow. +PGO build takes around 50 minutes. + +For development, use "--without profileopt" option to disable PGO. This +shortens the build time to ~5 minutes including test suite. + +1. import_failed.map +---------------------- + +This is a mechanism installed as part of python3-base, that places shim modules +on python's path (through a generated zzzz-import-failed-hooks.pth file, so that +it is imported as much at the end as makes sense; and an _import_failed subdir +of /usr/lib/pythonX.Y). Then when the user tries to import a module that is part +of a subpackage, the ImportError will contain a helpful message telling them +which missing subpackage to install. + +This can sometimes cause problems on non-standard configurations, if the pth +gets included too early (for instance if you are using a script to include all +pths by hand in some strange order). Just something to look out for. diff --git a/Python-3.8.3.tar.xz b/Python-3.8.3.tar.xz new file mode 100644 index 0000000..e233455 --- /dev/null +++ b/Python-3.8.3.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfab5ec723c218082fe3d5d7ae17ecbdebffa9a1aea4d64aa3a2ecdd2e795864 +size 17912964 diff --git a/Python-3.8.3.tar.xz.asc b/Python-3.8.3.tar.xz.asc new file mode 100644 index 0000000..7025888 --- /dev/null +++ b/Python-3.8.3.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEE4/8oOcBIslwITevpsmmV4xAlBWgFAl68Z1QACgkQsmmV4xAl +BWhdxQ/+PUi0er9eBEaWNaatCsEDXnBvrCs1OooL3WWJ2GC5zf3buMwj2pFOZf9D +YFFGdomhYhvRnyQCJQSXuWJXQaafzKAl1tvkgS2ycOnLvCJ/qw71SqorQxkMGK1m +TYZyLEapNkXrfDXRHfGybuVlNsHw9++abpEITqwucTWm9LiHZoF/zdK+JX/5RYQ0 +bfb8819DMZEyCsF+S8Jo6ZNyEIQyQxidFFt5HbMllFwsgzu37P8RqGSIoVNFJ8n9 +f7BWfXAIyGr7pIlJ+3qBYDXOeOx8iwIUxGu3Gbmiri+dlxz28Iei4mxPYHG4ji5B +3zMsqKcaVAMHzKuAwdF5ZbUg0DRRJweNoiDOsfKp0CI814pXmOLH0zi9OiLrxBzj +7v9H3dAPMC2f2zAFdNcjYVBRovCxIork/Lj3+6jGn67+8oV+eb23gnN5YpDAFAAu +ybtrt6fEi0uVJuxUl+MO5HkSmH3sLggVDskvuWPFLiuahcbSuiZoCvlB+osO9J0H +el/3Awv5TjckY/EVDt1T61aYLX0CHNcb8c/CjAf0OSd/96WxV3svtusllqcSYwiC +NxBRf0klpGn0Tpa+9hTAMc4dEKILgao1KsKiI8dj8YY3HcE0Lb3y9UdFcIDLCeqn +Sk5turYyKak7apZTY31/0eqqCUl/RlZwpmxVUUNViwR5F2ZPeAQ= +=jF/G +-----END PGP SIGNATURE----- diff --git a/README.SUSE b/README.SUSE new file mode 100644 index 0000000..0053bcf --- /dev/null +++ b/README.SUSE @@ -0,0 +1,43 @@ +Python 3 in SUSE +============== + +* Subpackages * + +Python 3 is split into several subpackages, based on external dependencies. +The main package 'python3' has soft dependencies on all subpackages needed to +assemble the standard library; however, these might not all be installed by default. + +If you attempt to import a module that is currently not installed, an ImportError is thrown, +with instructions to install the missing subpackage. Installing the subpackage might result +in installing libraries that the subpackage requires to function. + + +* ensurepip * + +The 'ensurepip' module from Python 3 standard library (PEP 453) is supposed to deploy +a bundled copy of the pip installer. This makes no sense in a managed distribution like SUSE. +Instead, you need to install package 'python3-pip'. Usually this will be installed automatically +with 'python3'. + +Using 'ensurepip' when pip is not installed will result in an ImportError with instructions +to install 'python3-pip'. + + +* Documentation * + +You can find documentation in seprarate packages: python3-doc and +python3-doc-pdf. These contan following documents: + + Tutorial, What's New in Python, Global Module Index, Library Reference, + Macintosh Module Reference, Installing Python Modules, Distributing Python + Modules, Language Reference, Extending and Embedding, Python/C API, + Documenting Python + +The python3-doc package constains many text files from source tarball. + + +* Interactive mode * + +Interactive mode is by default enhanced with of history and command completion. +If you don't like these features, you can unset the PYTHONSTARTUP variable +in your .profile or disable it system wide in /etc/profile.d/python.sh. diff --git a/SUSE-FEDORA-multilib.patch b/SUSE-FEDORA-multilib.patch new file mode 100644 index 0000000..48f09de --- /dev/null +++ b/SUSE-FEDORA-multilib.patch @@ -0,0 +1,396 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -4671,12 +4671,26 @@ else + LIBPYTHON='' + fi + ++# platsubdir must be defined before LIBPL definition ++AC_MSG_CHECKING(for custom platsubdir) ++AC_ARG_WITH(custom-platsubdir, ++ [AS_HELP_STRING([--with-custom-platsubdir=], ++ [set the platsubdir name to a custom string])], ++ [], ++ [with_custom_platsubdir=yes]) ++AS_CASE($with_custom_platsubdir, ++ [yes],[platsubdir=`basename ${libdir}`], ++ [no],[platsubdir=lib], ++ [platsubdir=$with_custom_platsubdir]) ++AC_MSG_RESULT($platsubdir) ++AC_SUBST(platsubdir) ++ + dnl define LIBPL after ABIFLAGS and LDVERSION is defined. + AC_SUBST(PY_ENABLE_SHARED) + if test x$PLATFORM_TRIPLET = x; then +- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}" ++ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}" + else +- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" ++ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + fi + AC_SUBST(LIBPL) + +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -137,13 +137,16 @@ exec_prefix= @exec_prefix@ + # Install prefix for data files + datarootdir= @datarootdir@ + ++# Name of "lib" directory under prefix ++platsubdir= @platsubdir@ ++ + # Expanded directories + BINDIR= @bindir@ + LIBDIR= @libdir@ + MANDIR= @mandir@ + INCLUDEDIR= @includedir@ + CONFINCLUDEDIR= $(exec_prefix)/include +-SCRIPTDIR= $(prefix)/lib64 ++SCRIPTDIR= @libdir@ + ABIFLAGS= @ABIFLAGS@ + + # Detailed destination directories +@@ -754,6 +757,7 @@ Modules/getpath.o: $(srcdir)/Modules/get + -DEXEC_PREFIX='"$(exec_prefix)"' \ + -DVERSION='"$(VERSION)"' \ + -DVPATH='"$(VPATH)"' \ ++ -DPLATLIBDIR='"$(platsubdir)"' \ + -o $@ $(srcdir)/Modules/getpath.c + + Programs/python.o: $(srcdir)/Programs/python.c +--- a/Modules/getpath.c ++++ b/Modules/getpath.c +@@ -55,12 +55,12 @@ + * pybuilddir.txt. If the landmark is found, we're done. + * + * For the remaining steps, the prefix landmark will always be +- * lib/python$VERSION/os.py and the exec_prefix will always be +- * lib/python$VERSION/lib-dynload, where $VERSION is Python's version +- * number as supplied by the Makefile. Note that this means that no more +- * build directory checking is performed; if the first step did not find +- * the landmarks, the assumption is that python is running from an +- * installed setup. ++ * $lib/python$VERSION/os.py and the exec_prefix will always be ++ * $lib/python$VERSION/lib-dynload, where $VERSION is Python's version ++ * number and $lib is PLATLIBDIR as supplied by the Makefile. Note that ++ * this means that no more build directory checking is performed; if the ++ * first step did not find the landmarks, the assumption is that python ++ * is running from an installed setup. + * + * Step 2. See if the $PYTHONHOME environment variable points to the + * installed location of the Python libraries. If $PYTHONHOME is set, then +@@ -86,7 +86,7 @@ + * containing the shared library modules is appended. The environment + * variable $PYTHONPATH is inserted in front of it all. Finally, the + * prefix and exec_prefix globals are tweaked so they reflect the values +- * expected by other code, by stripping the "lib/python$VERSION/..." stuff ++ * expected by other code, by stripping the "$lib/python$VERSION/..." stuff + * off. If either points to the build directory, the globals are reset to + * the corresponding preprocessor variables (so sys.prefix will reflect the + * installation location, even though sys.path points into the build +@@ -105,8 +105,8 @@ extern "C" { + #endif + + +-#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) +-#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" ++#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) || !defined(PLATLIBDIR) ++#error "PREFIX, EXEC_PREFIX, VERSION, VPATH, and PLATLIBDIR must be constant defined" + #endif + + #ifndef LANDMARK +@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *c + if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) { + return PATHLEN_ERR(); + } +- status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len); ++ status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calc + return PATHLEN_ERR(); + } + } +- status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len); ++ status = joinpath(zip_path, L"lib/python00.zip", zip_path_len); + if (_PyStatus_EXCEPTION(status)) { + return status; + } +@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculat + if (!calculate->exec_prefix) { + return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + } +- calculate->lib_python = Py_DecodeLocale("lib64/python" VERSION, &len); ++ calculate->lib_python = Py_DecodeLocale(PLATLIBDIR "/python" VERSION, &len); + if (!calculate->lib_python) { + return DECODE_LOCALE_ERR("EXEC_PREFIX define", len); + } +--- a/Lib/distutils/command/install.py ++++ b/Lib/distutils/command/install.py +@@ -30,14 +30,14 @@ WINDOWS_SCHEME = { + INSTALL_SCHEMES = { + 'unix_prefix': { + 'purelib': '$base/lib/python$py_version_short/site-packages', +- 'platlib': '$platbase/lib64/python$py_version_short/site-packages', ++ 'platlib': '$platbase/$platsubdir/python$py_version_short/site-packages', + 'headers': '$base/include/python$py_version_short$abiflags/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', + }, + 'unix_home': { + 'purelib': '$base/lib/python', +- 'platlib': '$base/lib64/python', ++ 'platlib': '$base/lib/python', + 'headers': '$base/include/python/$dist_name', + 'scripts': '$base/bin', + 'data' : '$base', +@@ -281,7 +281,7 @@ class install(Command): + # about needing recursive variable expansion (shudder). + + py_version = sys.version.split()[0] +- (prefix, exec_prefix) = get_config_vars('prefix', 'exec_prefix') ++ (prefix, exec_prefix, platsubdir) = get_config_vars('prefix', 'exec_prefix', 'platsubdir') + try: + abiflags = sys.abiflags + except AttributeError: +@@ -298,6 +298,7 @@ class install(Command): + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + 'abiflags': abiflags, ++ 'platsubdir': platsubdir, + } + + if HAS_USER_SITE: +@@ -419,12 +420,11 @@ class install(Command): + "must not supply exec-prefix without prefix") + + # self.prefix is set to sys.prefix + /local/ +- # if neither RPM build nor virtual environment is +- # detected to make pip and distutils install packages +- # into the separate location. +- if (not (hasattr(sys, 'real_prefix') or +- sys.prefix != sys.base_prefix) and +- 'RPM_BUILD_ROOT' not in os.environ): ++ # if the executable is /usr/bin/python* and RPM build ++ # is not detected to make pip and distutils install into ++ # the separate location. ++ if (sys.executable.startswith("/usr/bin/python") ++ and 'RPM_BUILD_ROOT' not in os.environ): + addition = "/local" + else: + addition = "" +--- a/Lib/distutils/sysconfig.py ++++ b/Lib/distutils/sysconfig.py +@@ -146,12 +146,9 @@ def get_python_lib(plat_specific=0, stan + prefix = plat_specific and EXEC_PREFIX or PREFIX + + if os.name == "posix": +- if plat_specific or standard_lib: +- lib = "lib64" +- else: +- lib = "lib" ++ libdir = plat_specific and get_config_var("platsubdir") or "lib" + libpython = os.path.join(prefix, +- lib, "python" + get_python_version()) ++ libdir, "python" + get_python_version()) + if standard_lib: + return libpython + else: +--- a/Lib/sysconfig.py ++++ b/Lib/sysconfig.py +@@ -20,10 +20,10 @@ __all__ = [ + + _INSTALL_SCHEMES = { + 'posix_prefix': { +- 'stdlib': '{installed_base}/lib64/python{py_version_short}', +- 'platstdlib': '{platbase}/lib64/python{py_version_short}', ++ 'stdlib': '{installed_base}/{platsubdir}/python{py_version_short}', ++ 'platstdlib': '{platbase}/{platsubdir}/python{py_version_short}', + 'purelib': '{base}/lib/python{py_version_short}/site-packages', +- 'platlib': '{platbase}/lib64/python{py_version_short}/site-packages', ++ 'platlib': '{platbase}/{platsubdir}/python{py_version_short}/site-packages', + 'include': + '{installed_base}/include/python{py_version_short}{abiflags}', + 'platinclude': +@@ -62,10 +62,10 @@ _INSTALL_SCHEMES = { + 'data': '{userbase}', + }, + 'posix_user': { +- 'stdlib': '{userbase}/lib64/python{py_version_short}', +- 'platstdlib': '{userbase}/lib64/python{py_version_short}', ++ 'stdlib': '{userbase}/lib/python{py_version_short}', ++ 'platstdlib': '{userbase}/lib/python{py_version_short}', + 'purelib': '{userbase}/lib/python{py_version_short}/site-packages', +- 'platlib': '{userbase}/lib64/python{py_version_short}/site-packages', ++ 'platlib': '{userbase}/lib/python{py_version_short}/site-packages', + 'include': '{userbase}/include/python{py_version_short}', + 'scripts': '{userbase}/bin', + 'data': '{userbase}', +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -335,12 +335,18 @@ def getsitepackages(prefixes=None): + seen.add(prefix) + + if os.sep == '/': +- sitepackages.append(os.path.join(prefix, "lib64", ++ from sysconfig import get_config_var ++ platsubdir = get_config_var("platsubdir") ++ sitepackages.append(os.path.join(prefix, platsubdir, + "python" + sys.version[:3], + "site-packages")) +- sitepackages.append(os.path.join(prefix, "lib", ++ sitepackages.append(os.path.join(prefix, platsubdir, + "python%d.%d" % sys.version_info[:2], + "site-packages")) ++ if platsubdir != "lib": ++ sitepackages.append(os.path.join(prefix, "lib", ++ "python%d.%d" % sys.version_info[:2], ++ "site-packages")) + else: + sitepackages.append(prefix) + sitepackages.append(os.path.join(prefix, "lib64", "site-packages")) +@@ -348,14 +354,7 @@ def getsitepackages(prefixes=None): + return sitepackages + + def addsitepackages(known_paths, prefixes=None): +- """Add site-packages to sys.path +- +- '/usr/local' is included in PREFIXES if RPM build is not detected +- to make packages installed into this location visible. +- +- """ +- if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ: +- PREFIXES.insert(0, "/usr/local") ++ """Add site-packages to sys.path""" + for sitedir in getsitepackages(prefixes): + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) +--- a/Lib/test/test_site.py ++++ b/Lib/test/test_site.py +@@ -266,8 +266,11 @@ class HelperFunctionsTests(unittest.Test + dirs = site.getsitepackages() + if os.sep == '/': + # OS X, Linux, FreeBSD, etc +- self.assertEqual(len(dirs), 2) +- wanted = os.path.join('xoxo', 'lib64', ++ self.assertTrue(len(dirs) in (1,2,3), ++ "dirs = {} has len not in (1,2,3).".format(dirs)) ++ ++ platsubdir = sysconfig.get_config_var('platsubdir') ++ wanted = os.path.join('xoxo', platsubdir, + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + self.assertEqual(dirs[0], wanted) +--- a/Lib/test/test_sysconfig.py ++++ b/Lib/test/test_sysconfig.py +@@ -243,6 +243,7 @@ class TestSysConfig(unittest.TestCase): + # is similar to the global posix_prefix one + base = get_config_var('base') + user = get_config_var('userbase') ++ platsubdir = get_config_var("platsubdir") + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) +@@ -257,8 +258,19 @@ class TestSysConfig(unittest.TestCase): + # before comparing + global_path = global_path.replace(sys.base_prefix, sys.prefix) + base = base.replace(sys.base_prefix, sys.prefix) ++ ++ if platsubdir != "lib": ++ platbase = os.path.join(base, platsubdir) ++ purebase = os.path.join(base, "lib") ++ userlib = os.path.join(user, "lib") ++ # replace platbase first because usually purebase is a prefix of platbase ++ # /usr/lib is prefix of /usr/lib64 and would get replaced first ++ modified_path = global_path.replace(platbase, userlib, 1).replace(purebase, userlib, 1) ++ else: ++ modified_path = global_path.replace(base, user, 1) ++ + user_path = get_path(name, 'posix_user') +- self.assertEqual(user_path, global_path.replace(base, user, 1)) ++ self.assertEqual(user_path, modified_path) + + def test_main(self): + # just making sure _main() runs and returns things in the stdout +--- a/configure ++++ b/configure +@@ -15188,9 +15188,9 @@ fi + + + if test x$PLATFORM_TRIPLET = x; then +- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}" ++ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}" + else +- LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" ++ LIBPL='$(prefix)'"/${platsubdir}/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" + fi + + +--- a/setup.py ++++ b/setup.py +@@ -649,7 +649,7 @@ class PyBuildExt(build_ext): + # directories (i.e. '.' and 'Include') must be first. See issue + # 10520. + if not CROSS_COMPILING: +- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64') ++ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + # only change this for cross builds for 3.3, issues on Mageia + if CROSS_COMPILING: +@@ -953,11 +953,11 @@ class PyBuildExt(build_ext): + elif curses_library: + readline_libs.append(curses_library) + elif self.compiler.find_library_file(self.lib_dirs + +- ['/usr/lib64/termcap'], ++ ['/usr/lib/termcap'], + 'termcap'): + readline_libs.append('termcap') + self.add(Extension('readline', ['readline.c'], +- library_dirs=['/usr/lib64/termcap'], ++ library_dirs=['/usr/lib/termcap'], + extra_link_args=readline_extra_link_args, + libraries=readline_libs)) + else: +--- a/Lib/test/test_embed.py ++++ b/Lib/test/test_embed.py +@@ -10,6 +10,7 @@ import re + import shutil + import subprocess + import sys ++import sysconfig + import tempfile + import textwrap + +@@ -1070,12 +1071,13 @@ class InitConfigTests(EmbeddingTestsMixi + return config['config']['module_search_paths'] + else: + ver = sys.version_info ++ platsubdir = sysconfig.get_config_var('platsubdir') + return [ + os.path.join(prefix, 'lib', + f'python{ver.major}{ver.minor}.zip'), +- os.path.join(prefix, 'lib', ++ os.path.join(prefix, platsubdir, + f'python{ver.major}.{ver.minor}'), +- os.path.join(exec_prefix, 'lib', ++ os.path.join(exec_prefix, platsubdir, + f'python{ver.major}.{ver.minor}', 'lib-dynload'), + ] + +@@ -1180,13 +1182,15 @@ class InitConfigTests(EmbeddingTestsMixi + def test_init_pyvenv_cfg(self): + # Test path configuration with pyvenv.cfg configuration file + ++ platsubdir = sysconfig.get_config_var('platsubdir') ++ + with self.tmpdir_with_python() as tmpdir, \ + tempfile.TemporaryDirectory() as pyvenv_home: + ver = sys.version_info + + if not MS_WINDOWS: + lib_dynload = os.path.join(pyvenv_home, +- 'lib', ++ platsubdir, + f'python{ver.major}.{ver.minor}', + 'lib-dynload') + os.makedirs(lib_dynload) diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..1d50bc4 --- /dev/null +++ b/_multibuild @@ -0,0 +1,4 @@ + + base + doc + diff --git a/baselibs.conf b/baselibs.conf new file mode 100644 index 0000000..45da3e6 --- /dev/null +++ b/baselibs.conf @@ -0,0 +1,3 @@ +python38-base +python38 +libpython3_8-1_0 diff --git a/bpo-31046_ensurepip_honours_prefix.patch b/bpo-31046_ensurepip_honours_prefix.patch new file mode 100644 index 0000000..4ee1a3c --- /dev/null +++ b/bpo-31046_ensurepip_honours_prefix.patch @@ -0,0 +1,163 @@ +From 5754521af1d51aa8e445cba07a093bbc0c88596d Mon Sep 17 00:00:00 2001 +From: Zackery Spytz +Date: Mon, 16 Dec 2019 18:24:08 -0700 +Subject: [PATCH] bpo-31046: ensurepip does not honour the value of $(prefix) + +Co-Authored-By: Xavier de Gaye +--- + Doc/library/ensurepip.rst | 9 +++++++-- + Lib/ensurepip/__init__.py | 18 +++++++++++++----- + Lib/test/test_ensurepip.py | 11 +++++++++++ + Makefile.pre.in | 4 ++-- + .../2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst | 1 + + 5 files changed, 34 insertions(+), 9 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst + +--- a/Doc/library/ensurepip.rst ++++ b/Doc/library/ensurepip.rst +@@ -56,8 +56,9 @@ is at least as recent as the one bundled + By default, ``pip`` is installed into the current virtual environment + (if one is active) or into the system site packages (if there is no + active virtual environment). The installation location can be controlled +-through two additional command line options: ++through some additional command line options: + ++* ``--prefix ``: Installs ``pip`` using the given directory prefix. + * ``--root ``: Installs ``pip`` relative to the given root directory + rather than the root of the currently active virtual environment (if any) + or the default root for the current Python installation. +@@ -89,7 +90,7 @@ Module API + Returns a string specifying the bundled version of pip that will be + installed when bootstrapping an environment. + +-.. function:: bootstrap(root=None, upgrade=False, user=False, \ ++.. function:: bootstrap(root=None, prefix=None, upgrade=False, user=False, \ + altinstall=False, default_pip=False, \ + verbosity=0) + +@@ -99,6 +100,8 @@ Module API + If *root* is ``None``, then installation uses the default install location + for the current environment. + ++ *prefix* specifies the directory prefix to use when installing. ++ + *upgrade* indicates whether or not to upgrade an existing installation + of an earlier version of ``pip`` to the bundled version. + +@@ -119,6 +122,8 @@ Module API + *verbosity* controls the level of output to :data:`sys.stdout` from the + bootstrapping operation. + ++ .. versionchanged:: 3.9 the *prefix* parameter was added. ++ + .. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap + + .. note:: +--- a/Lib/ensurepip/__init__.py ++++ b/Lib/ensurepip/__init__.py +@@ -46,27 +46,27 @@ def _disable_pip_configuration_settings( + os.environ['PIP_CONFIG_FILE'] = os.devnull + + +-def bootstrap(*, root=None, upgrade=False, user=False, ++def bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). ++ and directory prefix). + + Note that calling this function will alter both sys.path and os.environ. + """ + # Discard the return value +- _bootstrap(root=root, upgrade=upgrade, user=user, ++ _bootstrap(root=root, prefix=prefix, upgrade=upgrade, user=user, + altinstall=altinstall, default_pip=default_pip, + verbosity=verbosity) + + +-def _bootstrap(*, root=None, upgrade=False, user=False, ++def _bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). Returns pip command status code. ++ and directory prefix). Returns pip command status code. + + Note that calling this function will alter both sys.path and os.environ. + """ +@@ -109,6 +109,8 @@ def _bootstrap(*, root=None, upgrade=Fal + args = ["install", "--no-index", "--find-links", tmpdir] + if root: + args += ["--root", root] ++ if prefix: ++ args += ["--prefix", prefix] + if upgrade: + args += ["--upgrade"] + if user: +@@ -181,6 +183,11 @@ def _main(argv=None): + help="Install everything relative to this alternate root directory.", + ) + parser.add_argument( ++ "--prefix", ++ default=None, ++ help="Install everything using this prefix.", ++ ) ++ parser.add_argument( + "--altinstall", + action="store_true", + default=False, +@@ -199,6 +206,7 @@ def _main(argv=None): + + return _bootstrap( + root=args.root, ++ prefix=args.prefix, + upgrade=args.upgrade, + user=args.user, + verbosity=args.verbosity, +--- a/Lib/test/test_ensurepip.py ++++ b/Lib/test/test_ensurepip.py +@@ -61,6 +61,17 @@ class TestBootstrap(EnsurepipMixin, unit + unittest.mock.ANY, + ) + ++ def test_bootstrapping_with_prefix(self): ++ ensurepip.bootstrap(prefix="/foo/bar/") ++ self.run_pip.assert_called_once_with( ++ [ ++ "install", "--no-index", "--find-links", ++ unittest.mock.ANY, "--prefix", "/foo/bar/", ++ "setuptools", "pip", ++ ], ++ unittest.mock.ANY, ++ ) ++ + def test_bootstrapping_with_user(self): + ensurepip.bootstrap(user=True) + +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -1188,7 +1188,7 @@ install: @FRAMEWORKINSTALLFIRST@ commoni + install|*) ensurepip="" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + altinstall: commoninstall +@@ -1198,7 +1198,7 @@ altinstall: commoninstall + install|*) ensurepip="--altinstall" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + commoninstall: check-clean-src @FRAMEWORKALTINSTALLFIRST@ \ +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst +@@ -0,0 +1 @@ ++A directory prefix can now be specified when using :mod:`ensurepip`. diff --git a/bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch b/bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch new file mode 100644 index 0000000..b92feba --- /dev/null +++ b/bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch @@ -0,0 +1,152 @@ +From 2c096b513273a758b446405d9e5efe4860af1036 Mon Sep 17 00:00:00 2001 +From: Elvis Pranskevichus +Date: Thu, 27 Sep 2018 13:05:14 -0400 +Subject: [PATCH] bpo-34022: Stop forcing of hash-based invalidation with + SOURCE_DATE_EPOCH + +Unconditional forcing of ``CHECKED_HASH`` invalidation was introduced in +3.7.0 in bpo-29708. The change is bad, as it unconditionally overrides +*invalidation_mode*, even if it was passed as an explicit argument to +``py_compile.compile()`` or ``compileall``. An environment variable +should *never* override an explicit argument to a library function. +That change leads to multiple test failures if the ``SOURCE_DATE_EPOCH`` +environment variable is set. + +This changes ``py_compile.compile()`` to only look at +``SOURCE_DATE_EPOCH`` if no explicit *invalidation_mode* was specified. +I also made various relevant tests run with explicit control over the +value of ``SOURCE_DATE_EPOCH``. + +While looking at this, I noticed that ``zipimport`` does not work +with hash-based .pycs _at all_, though I left the fixes for +subsequent commits. +--- + Doc/library/compileall.rst | 11 ++-- + Doc/library/py_compile.rst | 13 ++-- + Lib/compileall.py | 20 ++++-- + Lib/py_compile.py | 13 +++- + Lib/test/test_compileall.py | 50 ++++++++++++-- + .../test_importlib/source/test_file_loader.py | 15 +++++ + Lib/test/test_py_compile.py | 66 +++++++++++++++++-- + .../2018-09-27-13-14-15.bpo-34022.E2cl0r.rst | 3 + + 8 files changed, 161 insertions(+), 30 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2018-09-27-13-14-15.bpo-34022.E2cl0r.rst + +--- a/Doc/library/py_compile.rst ++++ b/Doc/library/py_compile.rst +@@ -92,6 +92,11 @@ byte-code cache files in the directory c + .. versionchanged:: 3.8 + The *quiet* parameter was added. + ++ .. versionchanged:: 3.7.2 ++ The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer ++ overrides the value of the *invalidation_mode* argument, and determines ++ its default value instead. ++ + + .. class:: PycInvalidationMode + +--- a/Lib/test/test_compileall.py ++++ b/Lib/test/test_compileall.py +@@ -209,6 +209,21 @@ class CompileallTestsWithoutSourceEpoch( + pass + + ++ ++class CompileallTestsWithSourceEpoch(CompileallTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=True): ++ pass ++ ++ ++class CompileallTestsWithoutSourceEpoch(CompileallTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=False): ++ pass ++ ++ + class EncodingTest(unittest.TestCase): + """Issue 6716: compileall should escape source code when printing errors + to stdout.""" +@@ -579,6 +594,21 @@ class CommandLineTestsBase: + + + class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=True): ++ pass ++ ++ ++class CommmandLineTestsNoSourceEpoch(CommandLineTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=False): ++ pass ++ ++ ++ ++class CommmandLineTestsWithSourceEpoch(CommandLineTestsBase, + unittest.TestCase, + metaclass=SourceDateEpochTestMeta, + source_date_epoch=True): +--- a/Lib/test/test_importlib/source/test_file_loader.py ++++ b/Lib/test/test_importlib/source/test_file_loader.py +@@ -22,6 +22,9 @@ from test.support import make_legacy_pyc + from test.test_py_compile import without_source_date_epoch + from test.test_py_compile import SourceDateEpochTestMeta + ++from test.test_py_compile import without_source_date_epoch ++from test.test_py_compile import SourceDateEpochTestMeta ++ + + class SimpleTest(abc.LoaderTests): + +@@ -363,6 +366,17 @@ class SimpleTest(abc.LoaderTests): + + + class SourceDateEpochTestMeta(SourceDateEpochTestMeta, ++ type(Source_SimpleTest)): ++ pass ++ ++ ++class SourceDateEpoch_SimpleTest(Source_SimpleTest, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=True): ++ pass ++ ++ ++class SourceDateEpochTestMeta(SourceDateEpochTestMeta, + type(Source_SimpleTest)): + pass + +--- a/Lib/test/test_py_compile.py ++++ b/Lib/test/test_py_compile.py +@@ -216,5 +216,19 @@ class PyCompileTestsWithoutSourceEpoch(P + pass + + ++class PyCompileTestsWithSourceEpoch(PyCompileTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=True): ++ pass ++ ++ ++class PyCompileTestsWithoutSourceEpoch(PyCompileTestsBase, ++ unittest.TestCase, ++ metaclass=SourceDateEpochTestMeta, ++ source_date_epoch=False): ++ pass ++ ++ + if __name__ == "__main__": + unittest.main() +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2018-09-27-13-14-15.bpo-34022.E2cl0r.rst +@@ -0,0 +1,3 @@ ++The :envvar:`SOURCE_DATE_EPOCH` environment variable no longer overrides the ++value of the *invalidation_mode* argument to :func:`py_compile.compile`, and ++determines its default value instead. diff --git a/bpo36302-sort-module-sources.patch b/bpo36302-sort-module-sources.patch new file mode 100644 index 0000000..1c35890 --- /dev/null +++ b/bpo36302-sort-module-sources.patch @@ -0,0 +1,49 @@ +From ca04974425c84f306ddcebe88d6b31442e34e89d Mon Sep 17 00:00:00 2001 +From: "Bernhard M. Wiedemann" +Date: Mon, 5 Jun 2017 17:33:33 +0200 +Subject: [PATCH] bpo-36302: Sort list of sources + +when building packages (e.g. for openSUSE Linux) +(random) filesystem order of input files +influences ordering of functions in the output .so files. +Thus without the patch, builds (in disposable VMs) would usually differ. + +Without this patch, all callers have to be patched individually +https://github.com/dugsong/libdnet/pull/42 +https://github.com/sass/libsass-python/pull/212 +https://github.com/tahoe-lafs/pycryptopp/pull/41 +https://github.com/yt-project/yt/pull/2206 +https://github.com/pyproj4/pyproj/pull/142 +https://github.com/pytries/datrie/pull/49 +https://github.com/Roche/pyreadstat/pull/37 +but that is an infinite effort. + +See https://reproducible-builds.org/ for why this matters. +--- + Lib/distutils/command/build_ext.py | 3 ++- + .../next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) + create mode 100644 Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst + +diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py +index 2d7cdf063f01..38bb8fd93c27 100644 +--- a/Lib/distutils/command/build_ext.py ++++ b/Lib/distutils/command/build_ext.py +@@ -490,7 +490,8 @@ def build_extension(self, ext): + "in 'ext_modules' option (extension '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % ext.name) +- sources = list(sources) ++ # sort to make the resulting .so file build reproducible ++ sources = sorted(sources) + + ext_path = self.get_ext_fullpath(ext.name) + depends = sources + ext.depends +diff --git a/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst b/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst +new file mode 100644 +index 000000000000..fe01b5915d5d +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2019-03-21-19-23-46.bpo-36302.Yc591g.rst +@@ -0,0 +1,2 @@ ++distutils sorts source file lists so that Extension .so files ++build more reproducibly by default diff --git a/bpo40784-Fix-sqlite3-deterministic-test.patch b/bpo40784-Fix-sqlite3-deterministic-test.patch new file mode 100644 index 0000000..bf49d78 --- /dev/null +++ b/bpo40784-Fix-sqlite3-deterministic-test.patch @@ -0,0 +1,79 @@ +From 00a240bf7f95bbd220f1cfbf9eb58484a5f9681a Mon Sep 17 00:00:00 2001 +From: "Miss Islington (bot)" + <31488909+miss-islington@users.noreply.github.com> +Date: Fri, 29 May 2020 05:46:34 -0700 +Subject: [PATCH] bpo-40784: Fix sqlite3 deterministic test (GH-20448) + +(cherry picked from commit c610d970f5373b143bf5f5900d4645e6a90fb460) + +Co-authored-by: Erlend Egeberg Aasland +--- + Lib/sqlite3/test/userfunctions.py | 36 +++++++++++++++++++++++-------- + 1 file changed, 27 insertions(+), 9 deletions(-) + +diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py +index 9501f535c4999..c11c82e127577 100644 +--- a/Lib/sqlite3/test/userfunctions.py ++++ b/Lib/sqlite3/test/userfunctions.py +@@ -1,8 +1,7 @@ +-#-*- coding: iso-8859-1 -*- + # pysqlite2/test/userfunctions.py: tests for user-defined functions and + # aggregates. + # +-# Copyright (C) 2005-2007 Gerhard Häring ++# Copyright (C) 2005-2007 Gerhard HƤring + # + # This file is part of pysqlite. + # +@@ -158,6 +157,7 @@ def setUp(self): + self.con.create_function("isblob", 1, func_isblob) + self.con.create_function("islonglong", 1, func_islonglong) + self.con.create_function("spam", -1, func) ++ self.con.execute("create table test(t text)") + + def tearDown(self): + self.con.close() +@@ -276,18 +276,36 @@ def CheckAnyArguments(self): + val = cur.fetchone()[0] + self.assertEqual(val, 2) + ++ # Regarding deterministic functions: ++ # ++ # Between 3.8.3 and 3.15.0, deterministic functions were only used to ++ # optimize inner loops, so for those versions we can only test if the ++ # sqlite machinery has factored out a call or not. From 3.15.0 and onward, ++ # deterministic functions were permitted in WHERE clauses of partial ++ # indices, which allows testing based on syntax, iso. the query optimizer. ++ @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "Requires SQLite 3.8.3 or higher") + def CheckFuncNonDeterministic(self): + mock = unittest.mock.Mock(return_value=None) +- self.con.create_function("deterministic", 0, mock, deterministic=False) +- self.con.execute("select deterministic() = deterministic()") +- self.assertEqual(mock.call_count, 2) +- +- @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "deterministic parameter not supported") ++ self.con.create_function("nondeterministic", 0, mock, deterministic=False) ++ if sqlite.sqlite_version_info < (3, 15, 0): ++ self.con.execute("select nondeterministic() = nondeterministic()") ++ self.assertEqual(mock.call_count, 2) ++ else: ++ with self.assertRaises(sqlite.OperationalError): ++ self.con.execute("create index t on test(t) where nondeterministic() is not null") ++ ++ @unittest.skipIf(sqlite.sqlite_version_info < (3, 8, 3), "Requires SQLite 3.8.3 or higher") + def CheckFuncDeterministic(self): + mock = unittest.mock.Mock(return_value=None) + self.con.create_function("deterministic", 0, mock, deterministic=True) +- self.con.execute("select deterministic() = deterministic()") +- self.assertEqual(mock.call_count, 1) ++ if sqlite.sqlite_version_info < (3, 15, 0): ++ self.con.execute("select deterministic() = deterministic()") ++ self.assertEqual(mock.call_count, 1) ++ else: ++ try: ++ self.con.execute("create index t on test(t) where deterministic() is not null") ++ except sqlite.OperationalError: ++ self.fail("Unexpected failure while creating partial index") + + @unittest.skipIf(sqlite.sqlite_version_info >= (3, 8, 3), "SQLite < 3.8.3 needed") + def CheckFuncDeterministicNotSupported(self): diff --git a/bsc1167501-invalid-alignment.patch b/bsc1167501-invalid-alignment.patch new file mode 100644 index 0000000..cb98030 --- /dev/null +++ b/bsc1167501-invalid-alignment.patch @@ -0,0 +1,75 @@ +From e6f4de57ffd175870e513ffa387fa6e7eaaeaed2 Mon Sep 17 00:00:00 2001 +From: Andreas Schneider +Date: Tue, 24 Mar 2020 07:55:00 +0100 +Subject: [PATCH] bpo-40052: Fix alignment issue in PyVectorcall_Function() + +In file included from /usr/include/python3.8/Python.h:147: +In file included from /usr/include/python3.8/abstract.h:837: +/usr/include/python3.8/cpython/abstract.h:91:11: error: cast from 'char *' to 'vectorcallfunc *' +(aka 'struct _object *(**)(struct _object *, struct _object *const *, unsigned long, struct _object *)') +increases required alignment from 1 to 8 [-Werror,-Wcast-align] + + ptr = (vectorcallfunc*)(((char *)callable) + offset); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1 error generated. + +Signed-off-by: Andreas Schneider +--- + Include/cpython/abstract.h | 9 ++++++--- + .../next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst | 1 + + Objects/call.c | 7 ++++++- + 3 files changed, 13 insertions(+), 4 deletions(-) + create mode 100644 Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst + +--- a/Include/cpython/abstract.h ++++ b/Include/cpython/abstract.h +@@ -82,14 +82,17 @@ _PyVectorcall_Function(PyObject *callabl + { + PyTypeObject *tp = Py_TYPE(callable); + Py_ssize_t offset = tp->tp_vectorcall_offset; +- vectorcallfunc *ptr; ++ union { ++ char *data; ++ vectorcallfunc *ptr; ++ } vc; + if (!PyType_HasFeature(tp, _Py_TPFLAGS_HAVE_VECTORCALL)) { + return NULL; + } + assert(PyCallable_Check(callable)); + assert(offset > 0); +- ptr = (vectorcallfunc*)(((char *)callable) + offset); +- return *ptr; ++ vc.data = (char *)callable + offset; ++ return *vc.ptr; + } + + /* Call the callable object 'callable' with the "vectorcall" calling +--- /dev/null ++++ b/Misc/NEWS.d/next/C API/2020-03-24-09-27-10.bpo-40052.27P2KG.rst +@@ -0,0 +1 @@ ++Fix an alignment build warning/error in function ``PyVectorcall_Function()`` publicly exposed by ``abstract.h``. +\ No newline at end of file +--- a/Objects/call.c ++++ b/Objects/call.c +@@ -173,6 +173,11 @@ _PyObject_MakeTpCall(PyObject *callable, + PyObject * + PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *kwargs) + { ++ union { ++ char *data; ++ vectorcallfunc *ptr; ++ } vc; ++ + /* get vectorcallfunc as in _PyVectorcall_Function, but without + * the _Py_TPFLAGS_HAVE_VECTORCALL check */ + Py_ssize_t offset = Py_TYPE(callable)->tp_vectorcall_offset; +@@ -181,7 +186,8 @@ PyVectorcall_Call(PyObject *callable, Py + Py_TYPE(callable)->tp_name); + return NULL; + } +- vectorcallfunc func = *(vectorcallfunc *)(((char *)callable) + offset); ++ vc.data = (char *)callable + offset; ++ vectorcallfunc func = *vc.ptr; + if (func == NULL) { + PyErr_Format(PyExc_TypeError, "'%.200s' object does not support vectorcall", + Py_TYPE(callable)->tp_name); diff --git a/distutils-reproducible-compile.patch b/distutils-reproducible-compile.patch new file mode 100644 index 0000000..f290b8e --- /dev/null +++ b/distutils-reproducible-compile.patch @@ -0,0 +1,11 @@ +--- a/Lib/distutils/util.py ++++ b/Lib/distutils/util.py +@@ -432,7 +432,7 @@ byte_compile(files, optimize=%r, force=% + else: + from py_compile import compile + +- for file in py_files: ++ for file in sorted(py_files): + if file[-3:] != ".py": + # This lets us be lazy and not filter filenames in + # the "install_lib" command. diff --git a/idle3.appdata.xml b/idle3.appdata.xml new file mode 100644 index 0000000..554b7c4 --- /dev/null +++ b/idle3.appdata.xml @@ -0,0 +1,35 @@ + + + + + idle3.desktop + IDLE3 + CC0 + Python-2.0 + Python 3 Integrated Development and Learning Environment + +

+ IDLE is Pythonā€™s Integrated Development and Learning Environment. + The GUI is uniform between Windows, Unix, and Mac OS X. + IDLE provides an easy way to start writing, running, and debugging + Python code. +

+

+ IDLE is written in pure Python, and uses the tkinter GUI toolkit. + It provides: +

+
    +
  • a Python shell window (interactive interpreter) with colorizing of code input, output, and error messages,
  • +
  • a multi-window text editor with multiple undo, Python colorizing, smart indent, call tips, auto completion, and other features,
  • +
  • search within any window, replace within editor windows, and search through multiple files (grep),
  • +
  • a debugger with persistent breakpoints, stepping, and viewing of global and local namespaces.
  • +
+
+ https://docs.python.org/3/library/idle.html + + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-main-window.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-class-browser.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-code-viewer.png + + zbyszek@in.waw.pl +
diff --git a/idle3.desktop b/idle3.desktop new file mode 100644 index 0000000..43f5a4c --- /dev/null +++ b/idle3.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=IDLE 3 +GenericName=Python 3 IDE +Comment=Python 3 Integrated Development and Learning Environment +Exec=idle3 %F +TryExec=idle3 +Terminal=false +Type=Application +Icon=idle3 +Categories=Development;IDE; +MimeType=text/x-python; diff --git a/import_failed.map b/import_failed.map new file mode 100644 index 0000000..351fccf --- /dev/null +++ b/import_failed.map @@ -0,0 +1,7 @@ +python38-curses: curses _curses _curses_panel +python38-dbm: dbm _dbm _gdbm +python38-idle: idlelib +python38-testsuite: test _ctypes_test _testbuffer _testcapi _testinternalcapi _testimportmultiple _testmultiphase xxlimited +python38-tk: tkinter _tkinter +python38-tools: turtledemo +python38: sqlite3 readline _sqlite3 nis diff --git a/import_failed.py b/import_failed.py new file mode 100644 index 0000000..7e83460 --- /dev/null +++ b/import_failed.py @@ -0,0 +1,22 @@ +import sys, os +from sysconfig import get_path + +failed_map_path = os.path.join(get_path('stdlib'), '_import_failed', 'import_failed.map') + +if __spec__: + failed_name = __spec__.name +else: + failed_name = __name__ + +for line in open(failed_map_path): + package = line.split(':')[0] + imports = line.split(':')[1] + if failed_name in imports: + raise ImportError(f"""Module '{failed_name}' is not installed. +Use: + sudo zypper install {package} +to install it.""") + +raise ImportError(f"""Module '{failed_name}' is not installed. +It is supposed to be part of python3 distribution, but missing from failed import map. +Please file a bug on the SUSE Bugzilla.""") diff --git a/macros.python3 b/macros.python3 new file mode 100644 index 0000000..05e3c30 --- /dev/null +++ b/macros.python3 @@ -0,0 +1,28 @@ +%have_python3 1 + +# commented out legacy macro definitions +#py3_prefix /usr +#py3_incdir /usr/include/python3.5m +#py3_ver 3.5 + +# these should now be provided by macros.python_all +#python3_sitearch /usr/lib64/python3.5/site-packages +#python3_sitelib /usr/lib/python3.5/site-packages +#python3_version 3.5 + +# hard to say if anyone ever used these? +#py3_soflags cpython-35m-x86_64-linux-gnu +#py3_abiflags m +%cpython3_soabi %(python3 -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))") +%py3_soflags %cpython3_soabi + +# compilation macros that might be in use somewhere +%py3_compile(O) \ +find %1 -name '*.pyc' -exec rm -f {} ";"\ +python3-c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +%{-O:\ +find %1 -name '*.pyo' -exec rm -f {} ";"\ +python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +} + + diff --git a/pre_checkin.sh b/pre_checkin.sh new file mode 100644 index 0000000..a2cf992 --- /dev/null +++ b/pre_checkin.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +export LC_ALL=C + +master=python*.spec + +# create import_failed.map from package definitions +pkgname=$(grep python_pkg_name $master |grep define |awk -F' ' '{print $3}') +MAPFILE=import_failed.map +function new_map_line () { + package=$1 + package=$(echo $1 |sed -e "s:%{python_pkg_name}:$pkgname:") + modules=$2 + if [ -z "$package" -o -z "$modules" ]; then + return + fi + if [[ "$package" =~ "-base" ]]; then + return + fi + echo "$package:$modules" >> $MAPFILE.tmp +} + +for spec in *.spec; do + basename=${spec%.spec} + package= + modules= + while read line; do + case $line in + "%files -n "*) + new_map_line $package "$modules" + package=${line#"%files -n "} + modules= + ;; + "%files "*) + new_map_line $package "$modules" + package=$basename-${line#"%files "} + modules= + ;; + "%files") + new_map_line $package "$modules" + package=$basename + modules= + ;; + "%{sitedir}/config-"*) + # ignore + ;; + "%{sitedir}/"*) + word=${line#"%{sitedir}/"} + if ! echo $word | grep -q /; then + modules="$modules $word" + fi + ;; + "%{dynlib "*"}") + word=${line#"%{dynlib "} + word=${word%"}"} + modules="$modules $word" + ;; + esac + done < $spec + new_map_line $package "$modules" +done + +cat $MAPFILE.tmp |sort -u > $MAPFILE +rm $MAPFILE.tmp + +# run test inclusion check +tar xJf Python-*.xz +python3 skipped_tests.py + +# generate baselibs.conf +VERSION=$(grep ^Version $master|awk -F':' '{print $2}' |sed -e 's/ //g') +python_version=${VERSION:0:3} # 3.3 +python_version_abitag=${python_version//./} # 33 +python_version_soname=${python_version//./_} # 3_3 +echo "$pkgname-base" > baselibs.conf +echo "$pkgname" >> baselibs.conf +echo "libpython$python_version_soname-1_0" >> baselibs.conf + diff --git a/python-3.3.0b1-fix_date_time_compiler.patch b/python-3.3.0b1-fix_date_time_compiler.patch new file mode 100644 index 0000000..4a7f4a8 --- /dev/null +++ b/python-3.3.0b1-fix_date_time_compiler.patch @@ -0,0 +1,21 @@ +--- a/Makefile.pre.in ++++ b/Makefile.pre.in +@@ -746,11 +746,18 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \ + $(DTRACE_OBJS) \ + $(srcdir)/Modules/getbuildinfo.c + $(CC) -c $(PY_CORE_CFLAGS) \ ++ -DDATE="\"`date -u -r Makefile.pre.in +"%b %d %Y"`\"" \ ++ -DTIME="\"`date -u -r Makefile.pre.in +"%T"`\"" \ + -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ + -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ + -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ + -o $@ $(srcdir)/Modules/getbuildinfo.c + ++Python/getcompiler.o: $(srcdir)/Python/getcompiler.c Makefile ++ $(CC) -c $(PY_CORE_CFLAGS) \ ++ -DCOMPILER='"[GCC]"' \ ++ -o $@ $(srcdir)/Python/getcompiler.c ++ + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ + -DPREFIX='"$(prefix)"' \ diff --git a/python-3.3.0b1-localpath.patch b/python-3.3.0b1-localpath.patch new file mode 100644 index 0000000..ff9a376 --- /dev/null +++ b/python-3.3.0b1-localpath.patch @@ -0,0 +1,11 @@ +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -76,7 +76,7 @@ import _sitebuiltins + import io + + # Prefixes for site-packages; add additional prefixes like /usr/local here +-PREFIXES = [sys.prefix, sys.exec_prefix] ++PREFIXES = [sys.prefix, sys.exec_prefix, '/usr/local'] + # Enable per user site-packages directory + # set it to False to disable the feature or True to force the feature + ENABLE_USER_SITE = None diff --git a/python-3.3.0b1-test-posix_fadvise.patch b/python-3.3.0b1-test-posix_fadvise.patch new file mode 100644 index 0000000..d993fdd --- /dev/null +++ b/python-3.3.0b1-test-posix_fadvise.patch @@ -0,0 +1,11 @@ +--- a/Lib/test/test_posix.py ++++ b/Lib/test/test_posix.py +@@ -421,7 +421,7 @@ class PosixTester(unittest.TestCase): + def test_posix_fadvise(self): + fd = os.open(support.TESTFN, os.O_RDONLY) + try: +- posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_WILLNEED) ++ posix.posix_fadvise(fd, 0, 0, posix.POSIX_FADV_RANDOM) + finally: + os.close(fd) + diff --git a/python.keyring b/python.keyring new file mode 100644 index 0000000..f538134 --- /dev/null +++ b/python.keyring @@ -0,0 +1,1055 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFVRJ0kBEACko4KHmTBm01lcf4IsN4QxglIuf51lYqHs9B5nQbO6OSUivPXP +QBq3fu69yellpQiWaWhBvJB1s91sVuP1G30hcwl7SRxBUNQUUXT7lliLvhXEvcAb +l7iyoi3MsCdIcDdJvdMSMcbCJLSBDl8hETWcGj6Mnoj/HBr0r8IYmLf+cnCCNFg5 +f4mBQDlgsXpSjiMulprFwsEUctaJ1/7V0cMvXllsyXFw6lzd9xvULjih+C3eiKqQ +G8TInOPZgaWQSYKr5ihoVFZViRm0mlAzZ6/h9OZ3AeNJ4LhtThw6HbhNA93RkMx+ +zt6HeH4e8QGQQK5KZf4Kt3OdnTyJ3cOnLy6UQAzQAsmcFef7DwbbEQglgY56k4z1 +iB0289eJTIwA9f4fJNjlw6wcuUaGQGSF0yPYDq11PoZjc0tSUM3UxLeqwZco+o3e +oQ4d6bKEKmdHLyX9Hkg7WxXOqylNm/45roFE1d3STCt942n3+gRtOEGLmBP02ad1 +LfjOYNZyjltv2fo6xAaT06/YT2YuhgTL+aOS9nLtZ6vbV43IBw6O+xmBBZDM6Cbx +SNN2Bzu1HFij/wTUuX3Dq8cSCgkK2x/o1L5u2fBBDr4iMLthI1TFhVF5B6PAgV4o +86Js7ww4xWnXpwqXlVE7xUHumGH3IDfYLuiKxWx2ycfNJEBF807g7V2XBQARAQAB +tCHFgXVrYXN6IExhbmdhIDxsdWthc3pAcHl0aG9uLm9yZz6JAlQEEwEIAD4WIQTj +/yg5wEiyXAhN6+myaZXjECUFaAUCWmz8MwIbAwUJEs/3gAULCQgHAgYVCAkKCwIE +FgIDAQIeAQIXgAAKCRCyaZXjECUFaMmDD/9wqi/ZKfeCQ9H0Lrra9dIImCfNVu9+ +BNxPJReUWJlNwMOCy9hKf/8LGCPPFKJJy0BCA+eBjEor/f8R9Pz6gIzAjSPlXhKW +wS8qtMu7740mUMa4ofgovk8sikDbun0qGbgRIl++TOeTCt9pJnQak3xIsEg0sDs2 +1gtbL4KZdpDHy3eGZPCW+/+m4zoAkf2B3oWX7dHgTvCbKu1Lh3W2h2N8uMt5J6LX +Pu/65jI+XGoN7mJSji05GGPRXrjaoxtEv6x3Rp1xV5UmO7yWXhJbzzdDKcZz82Yr +q+YpVfl3erNpNb7CVY0g98cgiRDa9AMKvNFKQSM4iEUeDWNNK+qjYUFgcprOzbC3 +F3GhmigiYzjTH2FpIjVW/TT4Pzd8Nvho4YgdD6UYZgssa2WUJpHUFpxGywv5jGxH +Z0fbNMw23T3dobuOpm90AeT8VdSJyTWtOfUKX9HOjcUSp+kKaNDh/XjuNvKUHKWu +h9yPeqlRRXTp+vyNLXifWkW1aj1HUPAmI6G7dW7ctOAgTL2YbhBIyQiBFvGx4ydU +uRRZjCR8m5185XOHRJHE9S/uCKJqoBqI/MiikU8hheJzodgjxlaw2mFSaTMyJa0B +JbeQTwNYFMC7LtTCTy8I9o5PGAb5QfKqO6h/5jBrZdn4F5sS2r+0qvgaHdD/uOSh +/Bb671oBWQXDIrQuxYF1a2FzeiBMYW5nYSAoR1BHIGxhbmdhLnBsKSA8bHVrYXN6 +QGxhbmdhLnBsPokBHAQTAQIABgUCVVQHOAAKCRCZRTN/KIg+ywh6B/9ELBIssWPQ +HPWI4o3W5I5vEomL+nh7ZRVH974uTS6iYMY9R9DwC8z/H7MAQT00JjPG467z5RCe +E4Ng4iC0lw1x1oFP4A6O34MtlbWi+/U6yJl0O4zVBRKfTafIWmMmOSkI1SSEwhEu +/onYt6vtMbRMHtDeqZRJ0VIHecjr93VGBsEEj5NLnsIUdFMQhzk2L54KEhgyTuHX +R1X355qY947Lyr6W1Iua8loyjISOyHLiak8FRPrS92Adn4RBgeWdlqK9scwePZD5 +Ufzpxt0KUkVENFn73RIS/JB9pYRE8AoeDevtb2WO7nwtdorqsZePAvJl5HqLeh4V +qiyM1CM55cXWiQEcBBMBCgAGBQJVUo5KAAoJEPIhxdLEYs34S0MIAKbCIzm18jIh +LTYP0EXUj3Qptuqa2pG3kgY815uvJZPpHIYVM9eaf+wZLxo3raRlrxrqZwt/nSUz +meR0GGVTsf9qF+fDMlWDZfos26KAnJPkBdwy6CWd3palJc4TOPmJ/iXIhnBNljEh +9OdnnVOsEjNkL9s4AWmVn9+eWn0WXg9967Fe4XZ7FYREZpzL1nf3ZF92xojIrFkL +Mez3KnluO6+gYhQzXo2vlaNW4wWyEhq5/XKuZDRvnM2Nujku9TAoeWhIR4jgl3lD +eiKOJIRu6deEWBIXnjQgOw6+vCcJ0TZEvaNFq7I5JucyqpxHJFDYrNj60+Mkl0aw +fcHeF9T8xsaJARwEEwEKAAYFAlVTi6YACgkQvQDNHrxJfP2rMQgAgduvcFC+FTg3 +tafJQi4rgwT8xV50Uq1NR+LnYCQ9xeyZanPugp29kghxcM94vDf+LT/0zJK0KA2Y +Dct5EJu0lkg0jylwyLZ+V4nj9RySjK7xvwyk+UFeSTJ1JsGa7BYKO4jRRIVZx9Vp +FoBnW70QO4aDfjvK7hZeUf1dpNf9e4Wd7fhaBnd453IoGG76xcES3uN8X281YOT1 +fy1I8TrKwm4sdVwtU2w8q07e/gn3GUkL5QkJK4phBgwxpU7xkrZlH5C2gFgafj8r +52qgkPvigfB9wluysoGuWydcF2g1OBXS42LNoMhetripKiG1JODRT1PoIFnb5jrk +ZaF5tYEOY4kCHAQQAQoABgUCV8NgzAAKCRBylrJP8c6iLvqZEACG7EKP8J4LRr9j +kGe84W2cHsC9NcD77y6E0OPE5hPyduPljYrwKVGWqL1fTMJ/aFgexFSWIakITLnD +OtOMpmPkVTQ/99asUCEeGeFsw5T7dkIO+W+8qRfFn/TBsdtYotOZKRW6KymOo8dF +2LuXAE7qfrKq3X+rltMpgX2FP7pYcvTmH1LJQzH6+GaCrb78iUNart1UWjRjm/1q +3bgaTzNQZjYovzmk2f9EJBReXcOEzGn7/8GnippIj3H2Un4rnbgkeWrnjfkJD/x3 +teZjJLcT34Dkr9NpHL8NFLpu3f5SbgYyZRLsxXz2Fsq6aYvBR/l0ea6RaAqdeMh/ +HEDdIJGtgfzlX33Aapcw+dGjHrh62dtQVQYbi48JTkqheD6jjFNhDoLFkK7Y8XPQ +IpE3MeMrj9eDV13jqbOxSn5ZgMPn1I0yZNsWYODK6X5mlsHpqAfKZ2LxsxopxqkQ +jXUfE+sQ4F9bMrXv1PNQiEfPHHhzA3dBItzINdgpgiE4PZ9fCnzoFmrN0vfu3vx+ +EeHwoBrMsIkvrH4tTwTTyrEZY6aoaZofzJdDAVUGC9nApvwlckrv5zG63EEeYPYt +cm/Ali3VGkve07OpgwgzeyKASiwCf2SMM+9IKctzOywqjpW5HBS+N+zfxKBYRFaS +Gj5BVEp+X5n7B8ePG3D1Uak0PEQ/+IkCHAQTAQIABgUCVVJzmQAKCRCZtd4LMJZl +aXWID/9l4b5eosARYor3eEPdR/oovUzPY1fY9KESZw8yHfRFUi+qrsSYnYKJgnFo +J8OJp0SAQX1AI1voq4NOCVlbZN2im9jmks/eDYg510u73s7cwmZfKokyxVELBo0Z +A6e55s1FF+10JP//tmmCryLLIDv3/FmLdDHY04nAq11FARLRX9BoQzWSwl/uAKsF +JeKvFQQv4atV5fsl58BuVppqdg1A79lT4SekAlGtCOmO0h1/apDKoVYtHeSg8AZj +ss3DKNNmFDJtAkeSRSgmojPe3lplNiUJoLgcPAOL1rhRIKKY3YieVs54/EcdW3KK +UtOm4qrpobuyzEJWmrbeiVzV652I+cLML9iE5dxKjCNP87xBLaPKQFJbBDKfXTJu +exppiQJPjYPWt7/08odIFoM6OKdz2IVnjlYvBKSbLxmBzNIcNRK75eQCnIVlMRfK +tvAOOUGdl4Hzrf0eGMQtPcDhsQErv9hwCuV46TcZNw1jpvI//jGXKueujIIh/Yau +FUP2rMWwX0vRpi1+mFnulLDewGeh5ORc0nJTEeDOq60lzT7ilnbCKuQ1UR4yUj2E +QMyqHF/ky5dg5QTUmkTuk8f2T8FoibgF1QDfWS5Sr+W8EW4YQYzJKE9woFplyYH4 +09EDYqvPbKQogTgBMtptibQBBjUnl1SiXc0XlybUd27C4KTvC4kCHAQTAQIABgUC +VVJ6bAAKCRDg+ogVk1gtkZ0ND/9PYWzAKLIBV5EzQcoQ+NdQXcqNv8ROel1Se4sz +9h/FCI00JdI/SvnBs1JupECaRzFYT99X4UtdAsLYlZBDMB97C7Vl4Yy9Q0PM61GZ +P7iANKL2JiOyKXXkME8Sk5ufVdRwBr/Yb/Xs00zMj7X811j1qqmEdalRNaPdmRBL +4kbrkmqs9b3ZeJlZtvasVT25mrR3Sh/D543y4dvbO6UiJXJeEQrLsNTszPHIhBwu +4x0hMgtfTqUjNodZ+zeUGNNe6ZT3QIYBgLGrCoz9wGMyUtX1RQBNoSIOq+awG3r8 +/8SzNNtdUnfw1NelBKSmh+V1KIpUAc9/OMNmIAEcO4rTJsEE0kL3sRay9lzOihpU +yJMM/Z9FTqsTvKc5Wi38Vo+R07dapUBLS5TpS89+pCffaM9snQbuRfmhoCufSslp +8j2OSRsFTq5BA84gmQNteSlwuXs6r99EV3sQftrDnCo7AJJKDVeJ8gghlIYGTMYr +pVjsC8Rej7DxJa4fWznXhdtediFzGldQ+nBj1HlSeb9Y1ikG0ZAB8jnVDYePu5Dt +qL6AbWcr6n5evATlq3/YieDPBTBBCfZ6wAJ137gaRlPsjTsBng4V+sXUrQegS3D/ +IEW/qznJiEZljzDW6Rx+cPmMeKRdcEpZ4zQuqAbgdX82Gjn1tiAzSx6ez3V+2Up9 +RRKyAYkCHAQTAQIABgUCVVOi0QAKCRCCQz41h7KufZzTD/wMZspaTUqFDXnxdCn4 +DROXWG9rSkT3yw2udz8rplIKED0kFG9hbVGhJvod1XHFctnEXKhSDyLtx5LxNT1/ +GLtc3qcsIPSosAB5sLP8W39+jZ5lXDO2GnlTItOqd/vvDGA0bY+GKEI793T+dM9n +oX3R2Txth83QfX7Lp3WW11QrHX3qapemQytSh9z4BB9PzhK2Az0vtKMEe034f0XL +bNnU+4Zlb2v8d69kimQ3nCmqePIG+xl9+zNljS1E48sDq3Y2pokTpPt/jhYgI1SK +BeCETEZqDtobZoS3ehaOVdWJ/lfmSvNrlDQ/7fY75shLLY0YbIw0CoiL/mjpPhgL +0WBM4pc4NIPObszW/pAIptMKxTSB0Hqq5C+0pl8DCUCC42rfNfUYuXfO78U/LmnC +o85NW8FOsUl5pXNs+vL212QaPKAVbYx5H4OZuBZQsAmwIIdAohAfpO3Az/t75Jh7 +LzRF/RZziCZMTvbG2BoL+awaRlJicTn5OM7xHf+ndHMnU8KtT99PVVTQ/DOXKqg7 +ga6L4VjBHzW0YiIWtka+hNPVOHs20Ma0+NS98dyFm6Ot4iuXVryyKJEBzjf1Zo5R +ZVLzaX2sbALuPKs1xABsodMVU7MMkVOpAthYjblRF5Xypig4WyG/68SA5rhuH+Ln +FzMbq2Pbc2zP1cy44JQ+Y+6LMYkCHAQTAQIABgUCVVVFWwAKCRDalBBIg4QoJuVx +D/4s8gV3WRYpEJMN3sDtq6bt6GbgyMeDguVeK4BhGhlpasEsxquuTOaV5NC1ElOo +G+AQEDnPI/Qa8x2zeUMzCsZpVVo8U31L6av6x7ZjThQOcZ9zKJW0XVa0M/3RpTAF +yUBOw7z/GA1QnslcWbFPqUGp+kKGA6FBtLJ6qcBxYnMhHjws6aEDhRMett5wp/sC +cDD66zzPk/bBW4WGMgrMVZAJM2Ii4XykMOrN7ZtkGA03HaFOGSet/4Jks0LokQZt +oRfP3B9HaUE9cxBOPpyHH3xinIwnm/CU5lQM39LzESlkvjbaLZJYfR3VcYEgXFOj +SjsR/NCRwATMCNDmpF60/jG4z0qMukirJa0X4lwDgivv+qmApXqrXY+ym2rgsOcF +gtqkcg1PTa19uxuOV3Pxl5RGBzSIP0gyq3Gzxc69/E0EbpaUvbL7bC2+JhWpl8Gf +veNADDF8mO6kJP/tcl6TqLLGLAP1m7rZInn7RYSUCRTMWFAg+iHmEGfc8b+7XL43 +JPfitgKdvIf51ix7wfxAR4DSm5DWYIIE+PsW/9/2BnF0wY0tfVQHepWvGE6kUR7h +yPdv0jAzppEAxmdHvrtE2pOuLE/2/0sOu8jW2OAaRdK5CT2h0Ey/64Fz6ahFUxwN +ahlZ/ihUhX3DyfcptVDKyb5H8pj+NCJ2t6oQ9ea2K4XVI4kCHAQTAQIABgUCVVWO +3wAKCRDUT8vOzklurvtREACYtAi9eEx4U2bTgX6/qLcSGag5D4mlcLWsflmI8i7d +VToHgxz7BM+c2ibDnZC1gyPicbjVHn+18UoxeQC1R+MpKVnthPa+WzEV3NaARasQ +5sFSvHebodop9mP1HSMx4OSyjoSZi6AhDoRwCASoGSZMIM5wJ7Fuv5QCj8rsh+Tr +IkzLSKJtqvPGmVO6OG6Z2cs6N4k7Fo/W9KDLJ9p5TQKjsuyNUJLuspggqAAHmPpc +oTDCLeCNpkOqQHCUBuSxVQYSrlti0G/jvyh72k+P7UC/8tweQ4kmENhgvFQjI3Gn +aVVdMOqCKHTeTKOXf3a6RuG1F+Uwh3wP9WmVYtyi9bIACEqrML3O6pLFch5cmwOE +hx2RYhtVbpAwwr6nMB6dbM0zAGQSDdLF6n0dQaktmKpc1gcV5kmHrCXiWCfL5O0S +TuSYpFLLo+TDyruo1RYBAVL6gnAweMGAVYio8gV0vL8KHsHKmqMOtm8vll5P0eYM +p1bJzBN/eciCxLL8FuQQWXCS0qyOyKmvtYg9GVSqZJ4cG7CoDXDJ86sw1zH5Vk1A +a84b48fOFgz3xyVz3uDDDAiAzVNyKw7f5wTdCROsjin52Kov54x8I7BfCIIhyisL +LDKnyhblAZOX+EEh9DBEByVO5TSK6scI5SWmlO4lDRaUQy0yFTvMPSWsVTIR/CV6 +8YkCHAQTAQIABgUCVVZ9LgAKCRBY4Rux5BTZrd7OD/9w9QHeNzek+qS4cbAoF4xD +D85RGzaYi86TYv7m+QWwg7YuuJ2VWmu8K7hngZJh3KWRU5Q7vGZqd/R8fAcCslsZ +RnFrjODnCy3smSdF3YpeQ2JKmgf0GNQUEmtVCUL9J94rR6er4/yocWPhOcpFElUC +k8iJPyDFdJC/T3CTa36uz1oI5wf0DF62vBMDjN5ye+fKcPXYKBeiUZH+vHcGFoyy +/H3OK1TevyTuLAMMa6luJJ+q+9fOvzOMRDpELyKfUttRdLywI6pNs4rSujMf9v+x +NMjgOeH6GKsuMX7/A2tgcCB0oZqQXh2zOaTSF6QMKqwsO3AIbOY16VWSD5pzBnt6 +2ehyv8PKns8MwPWegIbvYX+V+P2xnsCBFi1f7aa8yKwQa3Nh/uzk9IElyq/nLguc +iMQ5wpTJZaNafgAcuHLMZg5YofqPi6g3+HhMvIZugW/eyP4hv6OxAb2y3888YbOK +W3e+ezywnAalXSfjJvgqrEC5YsYDJM4rML56We3nFJNHjEK8CSzXawiJZwepGVqu +yosp+fe+o2lAsnUqykcYHKoWw5KGPB9aTuvC1p8k3Qvhm8DkySXjREDnmPDGRuXF +ZSaz06y5AeWBuM8r5e62/W9TR9yKbJpQwRpq9oEs4bzJO1yys5u9SK5zAKCdgTMq +zXc65ENe0JL8btFA3hwN54kCHAQTAQgABgUCVVJ7xAAKCRDetUdYIbCzY7qwD/9Q +6RhhHMvzV4Dt/QYMiRwVEdo4XJxPZJfcpQe3TwyRsnS+pmMuLL2k5emLufzomXc2 +0Dx4StHOVRv7ZZKlSrIPL1d4u3DFygL4mRg7BIZWEmvtWZbfCEb3Kjg6ugh/+E2t +t6sIRmSSt5lkOBsuwB8FyllTuiWe+pkkdESL4j6yRUDv5xE4jT7ha84aq1Rq+fYo +Lx/NKPAV5xHNxr2u7rHL6yFn0IRqu+1EIgDqnraS40f07OoSmE7QTsn4XWAm1XD9 +HiOtHP/FZKiUPmnm0C0QLvMf7mP9cENkFP5GZjqxMO9HS9NWQolpato5ndcWxIn5 +c5oHmlVR2eyqo4NBC4mu+l0I6dyR+C0Kk5koEE4KPFxCeXXXT9h7O+aeOs/eZeQu +I5vCp09MUPUUboAPzViAMNJOCKPKwwl1p6ccDA04KLKDKhL5Gt6JLosoD7G4nACU +usRpyrXwihRk1PzPB4+2INEQ0C96DcnEGkMwMy8SVzxL+bjVbQFdFg5w+OicvDZO +5xrQWY1CBdqOW9IGsSCc7g/y9DNU9dgNlm5kLnA3meEtHWIYgTFHuQ8uiRFfSgCH +n5beMIzSs05Q8Qph3gvAwflDmsT96Qr7woyFTKwL0Ioumoz1yRGRhMuB3oyd3A76 +Igd8ENOi3VrFmGVXDYCXFFgIOhAo1k/Q/Xf8P/tu4okCHAQTAQgABgUCVVJ9hAAK +CRD/VOEuHKYZshfsD/4+9FPhrHb9DBeq7e13QJTY8Sin9uFin2wTpH/9Qh6eTMd1 +PeF825CfrE4B/zFK3v8v4MfdGzGvu9MaGHedKc1RN+rusxA9v+EVX1TLceAJNhTT +MaphlJzMn6gnkC0wrgdmCmspnxT0DzvCfYzf4vaGOCP4cHXOAvYqz/U/BK1t7Nuf +7tmyePRn19EQKJzvJA2K8Gqg/v4ovYtKXtJYA9IrCK6eR4Y7A+mKUNzGrb0poDcY +p9B1CxyhRrsgWHoNUIKVpVp1xSOLr13Z1EvG0Pu24j8Ygz+PuEIPaNJ1vsCTff+f +DT/XjI9nBlZnC55khg/r81sMKPIwYH7eTKTUmzyUHZZJAn6z2JI38KG+nPk/ln3l +lHhTWelh9H4enD8yHzTZDrXuiRCZg3W8fI5StezmrjORBCE38fkMB/TL0IZdiY/K +9IPgcPQEX8RSLwAm4uua13qCsVy18BhXTRshgqAwwHyd8yj9j/H0vvFVU1thapOB ++aMLr3w7tn5ymsxGfx+A933s8AWXLs/dvdr5tn2LQj7ZiCTqPf4elniVelwFL5Dq +hZ74ZJjBmiIAVIykEVonH4xOneiFFH8gz7/WT9V/Mh77fnqLk8CTM7DPZLskdL2D +CS4zqcMuviSszY35n8BJYZXsp004NQeVut+mSLCktPBdSrRb956dMiXuMgVWO4kC +HAQTAQgABgUCVVKEKQAKCRCRPzdd5iqXDJvFD/9bhqFIHOo7fwTbEg5Chb5/vPe3 +hyS7Ciot67xMjPGGUWree7l9LytmLvTPJdXfcYehthd/JCB2YSMljfPUwrc3N8ua +hxDZ2KnESByG4FhCkzQrQBImGCBevNmsy9SfH3G4OnXlOTaozPz+RkqYvfypczzb +V6B/f9JcXcQRYwGmTloohQhoHGGvm1CXKNgbEZjSRYaROpJ2NCmaXroe3ZhvHxd+ +d2Z2pQUfZX982M7mjRXTkqzDjdhx5j16bi25ZV+1JDiwul7O3TWFLY/VQeK1YEpW +uDbMSeSlf05l5RsHR3W1nNThmbAf70SmqO0rvn8Idla56Siphl+Wbl8JNpM9YyWr +b0fuf3o3bdS1uIrQzO3jiLA0DzBfjX2LEQ5JKm9M0fZil1R8MDMRZQFvNryF3Z1k +l1ZCEuwUNGowF+U3yepko/E0hNWKDd7lmtRZfCoor5KTI54WzqOg2lsDnq2Dk5Vb +f97qJm9fy105WXMSvgIOiNJEyOvoVlN6gzA+dQ5bnuz4eKpq98I8RiO9DiCenyMk +1CXSYUj0+NQJYU52l/f8x5QteiENGFiFwfMgZbOBuKTKL1iCp4l/RbxaHiYxc55m +3mIqS4U60bpV3be68Cp7m96kYc36osRh948SrMKPZ6Zb3QrMYGOxiWL9eVOdSOYW +Mwf3wF6VGd26Nfk9sYkCHAQTAQoABgUCVVJ5bQAKCRCotR9egDLM5JM6D/9cyvDL +DOwZuH/q8/eWtV5S3x5V75VdrjnIma9WfyTqgrv6v8oWV7PoQ2C3Rd/DQxu9ZiMx +ncj6ctufptesIMCm9trlNqbFdFzklBg7LTzSXnMOYxpOf+xYWWnrzBR4pgF9DO/z +sr71x2uKkQXgbKbz+8O9/Rx6/h+33c1CPHG4gc5OopSLStnnltOpRZ9P7q3Rt+CJ +LutXI3fBGnBRYi2NOAZkszlj1yBZrgVOMvDZJJbdVR5J1nFCYHbowQD6X0OBtLwk +sfbnfcaJRr8q0j8/4130eWQ0pT9CZ706JPG28CZfNJo3UtFlH2jpXAh/G+b74fdY +toMeKg1z38LqVdjm19hoyYXMDiBoHKpX9Xd43ZZU++DRsS79EW+e5a6stUZLUYfw +lwXPNkCls052Bzyqq6NN8KHUFhbIBVrRWxKJRJ3/Wo2uQJZwUKKoinSol1jHfPkc +58pDOXrySaX4HPcaFoKWtGObYFsdlCDw0P7IhFh4I2Zus+U3kAqaC/DUPgBzRNI4 +nlq7ukHPy16lStq/I9lPxN47GPW+qb0EyewarV3JmRyag1BOH9BINBnR4/q6N9vb +Yb73D3Ttf18B6K57ZKjQ48qeDVKZ3W84kZExTR+3b1DeIAEjlq5a4oHvUo1KfXXk +0hePx6a2QJijBaqJ6y0UANdCFMg5nOuckRpsgIkCHAQTAQoABgUCVVKEZwAKCRCt +3ULg6XStj1FrD/4+J6z+z4I6GTYdm6ET0EDVkO4/ZQHGVMIoIvzhl3QYTAeE+r44 +OuMxSAxO+B6rcgNUNjmbvqLaN3x3Syree76hBcqiZSKzT70t1OqdTMwQxotRsVMa +pwk7O4m7fthF3eAgumZguYj0zzicHoir4IahlVOgWR7AWHA29wsM15wJVjLiIo+i +IhX0okQAML924d9BqEZeTB4+bV7UcH6AAFyob6cDZexkLwN6ydWNpXaMREHqGavb +LdlkqmGhjVrepFxIIPEnQsxpmGIuWaDhgcy/W0Uw7r/gQ8UHa8rzQW4+0SqvBBFT +JknX2OlL35ZFLwEUglgvrf15LRYCu8Xi4EMLULIMsCz6P1B8MrNpN/tPQyLQoKhb +JRAow7kszL4OFbCma/8nZMvZyxQ7tT52XjBagNnMCfshsr8p3UtsKSm1XkIVts8t +70U1cSG+kXtCyzs0wsNV4UH/HK4S8fiKkxTYGIGDReFqtVr6LTGOJl/6+T5z9Az8 +GeYK18HXU67hH/z0eHikvem3hxSJZrHt4J5vfC15zyrhSKLdmij/pxcXjCffU2fE +J/Ngqk472EAQ2k0EawfOWTShdsQ3yeWEOhz2CW1a9nJiAcavJtmSo6eFLK/hFCJl +lvClsKddpa31TTc0TTs6gLnB93V+tw0JlBrueNErAgzCE7qhoVDT45LXoIkCHAQT +AQoABgUCVVKvOwAKCRDgldvmp8WiZqHdEACx+sFSXzECtHlyEvhzD50T0Jk3s6fF +DfTNr8oMnboNvJdbwvElfL3uaBClwmqFlzjPw3xLb9kWanErzXfdVZsZFTb3tmzI +5S86I/fRQyk9Hrgm53OUP1lTR2JzJGUwHoYc1m/8RShNgdCJaWsULsmKIAVxs7u3 +4EdqlURqzbglh5lhyeKa/nuT2dDU82R6a9//ahziIwOFlNrHzlJnthCpEdjutT7C +3+pL3ohy84K60G2csEFwnyI/3CZB+rt2YM98z0QASnR0cAGGRPMT/rGcRUeW+XiG +zt5hUAexJSfWYA+M9do2o9sDiw5Ic7+gi425Fciya0z1lLMqVFY2rbs7abm1Kqkt +19mT1S52f491WggSS4IRJIvKJcL7Sj7Jk3fM2jaVllcxtOtivg3rf83Ke/f/cMKK +VJ7noExiVlpZabZY/Wl/fzrS5FMN3km83dYUhHh4LlNl/OkP3QnRTwS1p5vBJuVy +tEHLg6yv6Ae6kPu4TzBkol3lP3+YSp8pPh6ZP9C+jDzKbNZuTcP1htDariF9bZf0 +XPLr4gn8m/6TbjO6ezbB4IMENnWzAL+23nviDE8kLlW0ZPux4hZwglBz9FHdOO9a +f1yDJgvwspe9IKPMqGCcZZ4ZYQ+7y9Z3mvzaVPjDQf2oPSGAI6VvQy2pQtauWlBa +jtmZqfid6Q4cVokCHAQTAQoABgUCVVN7VwAKCRB1pVGnIpXsH3rWEAC2oQ8aWe4a +iezCgD4oMnWlE9UXwZ/ZYNlYAp8xQvbRr3dZJ707Z976PlGAsuJIejR/+IbMJUVl +40npbFCiYYOMoqs6PAxDZsnuymW058WXFUSlBbwXq5w/2o4gQxy1TksQUSZCx0G+ +tPGilegcCO/5hzPgKzYNKQ1mg00TIu+PRo+cDR42Q+tWRAmt+9k64Z2IWmA1NVCM +AGcCC2hU9nr9HMTLXZPZPRbzL4TRygafZTBqCd2pC1YFupER4Htm7yd1Xnd3nqSV +YU4e/+wU3K9U6fd4qWIkSKP+F+LDqND1zTM1c28YB+WsMYXI/cwEKjzOJsIJFJbZ +UdN85uDx7vT3zDObm8iL2xnq12jmm4G2m1qWVfPCqL5giMSJlrPQAnrYxePVvxqf +DLQcGKSXW3J4VD9yTlAL3nn+9Lto2qD89FU9ikfxhQwB+BBiSHNwXzyVs8fAlkb9 ++v8CjPXEaRJiU1lW9xyrcYbQy6O6Au9EpE0aoac/x1x9kliZ1DEHmM91jJCONQDr +VlbXMO9W+2/uzbWB/PtWnHSa6gDPxLld8BGvoZAJ03yc9qzykyz86Rg7IVuBKMA+ +PLRvBZsfJDmCs8wu+KfBPFNRqFAjC+yGE7v/JE3RF7fdBcQNLvNernASmVP0SSg9 +NnBjAh8uhwpphMCx0ckARqBF+1gMUavaZYkCHAQTAQoABgUCVVPCSQAKCRBP8I+q +GGAA1NFbD/wKWeM7uW0m7wFuQtHUVYSl+4qbQ9Y4KhGSByvwvid3EUR1Zqm+sSDR +U1QxKcETwTWRqL9wBafBeFgKCLRq0NijprRnBgvGUL2K7a3fMjaleIK5beNkugWA +U/3CFA6S5PhW91xUavOWtw80p1c2E2JkggeuZN/FzHSnA+y4Cs5m+t9AndKl7Aoe +6CncnB61SSJfyV7eEbnT0eaIOaha7fERgjA93f0ybxB+/KTL7W9jyUo/q28CYgnk +rQg4YqocY6z4Zs1lQxrKghLE/3+2YGuZ7hzrdQBtL5Yag4JG9iz15fM8SXxpbE5F +dGnE3sK5T4/pWs0/kqzbDa9vPuGOv0LYYYQIpK4HJp44ScCc7ZO2PbBHCEfR5yI3 +y0VKwwiSmw+eMwZmzyYaODQbxAdgTiCMA/evvZGua15enObYmIBaRpftbBIVkity +GmAvcfIzkUDwUpnm/F7Y/kPY9xQiyhNwVbLF/V3dG3Hdrkv0PHHjluofuhR0IoVq +y9a5UGLrAL3OLp/bLWyp006ov5owoQsM+iQYL+09dWuYQmepxpWXHYcXRYIVLdmC +jizSh0RKvmLI/rpSieoiwnfxWzrMcqk/2K5YI2kKjrjm30GTP0unxKJWJHtXLy0D +ds0UdgSKKCn76AFFhEsPKCgGO6gZ3zTAFQNoTsVz6BmJdEAuxY2asIkCHAQTAQoA +BgUCVVbRGAAKCRB/2fzLAAvu7tiXEACG1Sqzlz8QjSMcEhYz2NZ/wsxpBW04uLE1 +bE/rsDUbYZlJRukNPPf4XBoJeGyFDN806T9SBFov+5T8CSlDznmHMu4DSJlXI8ak +EEYkm1hHsvaI7BLteZY7nPc2v/oFaYg/Xtb7zhl/N1HzeKPi+jIie3yet9sC/7cm +AAU855x7UEjTpJbCzi6SoOvHE1DA5f0pa154DqzR1Uuv26Pst+HE8hHShZA09CmO +HQTlJdw1SgwM13ZKteMdkCuuINoU1+y39eueCjEII72DLrO9UBescHZ9rJt+o3H1 +AIsHWEVHTfgSf4X5A5MXTHUBS/d0Zu8+3dVxzGiMpxVmGzeRU04+15oMiJ/cpmdZ +zA0H6x6TscjLpP0kIGzdfswBUWUIUzRU3O7MA4OsI9f+IiPsJYLHr4cxQ0uRYOyv +mltbaMAcD1YOwWpAGDJhRk5r2GdmyXewnk7PST0oCk7kAIc3dSt8TGsIOhk7S5R5 +mF8Vj77wf7kDonolhi6aIc4jQW7r7czieH3OdwexrIK/aQjQTpvPy0bWzUD9qKRg +PXTZA/WyOBL5Qh7RQdgo+5iJbjdtB4iXnmAGSMsC/S4SMMxXQB8TxHaeRg4OD8vw +iGFJMTESWbLFCtireXgQ78Y9/WnNbtV2W1Zh/KUvOqmnyk5XReE7LnXSNe7p/R+V +Tpu4sMIS7IkCIgQTAQoADAUCVVJ0bwWDB4YfgAAKCRD8n7XhIU7pK2pVD/4pjC7k +xq64PCKDQO4QNV/481TAVXDaE30tkAX46waCJEqsT11hLKnYS25bD+DLXQreYSxE +MV9lvSGHqa/mRG18Qw/MdUECO+TwBCmeArGw7EnKuLG3jrppW7/ycEvKeoPRdkio +liWlFzIzfrB/tfYmiCb4W9CEDEZh/5Mb4jQUMMLDI0sq+dcvtmOrbmSIDTCnPcvp +onLtxkmDtmMpgayUUCWaE/3h5jgGQd7BpiXE50IVD6lpmsbSy/RiiCKLNjI+yhw0 +SJoLZ+MhDnCDuOMOKOW8TECKm/iXnGe99l3eas44wfP6LSttxpwrRlorgv0rT7LA +KYC2EqwwVgXfGtYUgjLTfCUjGb+9A7uMC+L5pCeZyRGvSUoulBtmmg4I1OWz3ACV +3iB43y4t+G2LKggkjgZep17Iq5KWKzWlG8RhiI4aiMtQLl+ft267TJTkKLX7qGrI +YjiYQnmtriGgq59AjWoNxOTeCmKoCZVto7lncEvJHpj9N/3d8ob+F1FZtIgqGIYG +4DJwRbPMw6AOLpXQWgwKhWfwJrpvRd8l0FIKfOwhxhCif2RAAqxmTQKQF21Bsa3D +Bdhs42xscpTiK4LxAMhZk+CTZpFvfFxxdHFrcUbaz2jqt0LGkh4NknHEM6U+gqTk +sDL+tupk4bq1GXaMtzUFzt4BPDnSp6yN+311qokCPQQTAQoAJwUCVVEnSQIbAwUJ +Es/3gAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRCyaZXjECUFaANaD/0eFajh +YoxntrEwYmm/oFjF8iRMP4Az/nRb09bnr06yEEtKoJcrgQvq4UpbiELdH1Ht5ydM +WB1P3XgBrwQbj7ukH/lPyn2EZLyU4WHZYj0JFeJb0LJpwm8ja3UoRrCtkhNVjR6d +nRgV0iGGpjoVrsuG00wbduWqjLgK3Yl2YXUMAJHMh+gUjGMQz1dv8uAPi8qfq0C5 +CpReXFLuUGwxRWFQPFe72Z8sTLbAfy1dJVdw/lFFMtmY5NX2zfmLNf59yYocJr7B +VfTgP6TIVChpx+Jds+/GS+ZWYI9+IHeuFoJ++ETQ55r8j1WjYitTND432YI9JNeE +JU21DoGR0pKGnm/b4DsIivkdfSpLecqJs0FzxKUQ+lXGs+Ga0ugoj2owQdP3iOCk +YOPp6c0TFZaLz2H9YRGzLkQshsTgMnNsre2ZMg9VD/w/ZjoP4fmEh+MKRcAX78SW +hgsTNVGEcYeAk5ry2a/YgvEF99yqIGYmiZRBfOWYKqyY/i9cN0KhJPDai3+omzix +IeJ/cNcswqbezbwWMynzgAmlFm5eaK156gH4Hf1J9NU6uq6+OhEtc7jL9Op+Fo4+ +MnHknFkdxEhoBjReog1EmtMypiU6KeM1tH/PSnfT3t+sqcXH1A+X1cQdQ+U1Qvc+ +IDJDe9RkO3I0Omm+4uoRcy0ehvYjhp4JHxmx/IkCQAQTAQoAKgIbAwUJEs/3gAUL +CQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCVVEn+QIZAQAKCRCyaZXjECUFaGTpD/9X +XlvKLaRH+5HgbXoQKQBrenOF0DU3MfzvkiMEYAyOBGzHDq9p4hziH+gnd/FDuB8S +D4GN2KzLLxUsjm5XVoAAql7raE5s+9H9C3XO07/4SVZVbjouj3UIHTzYgjJZJrws +6Mg8XRt2q+hUJPbNN1gPUC7VrQAPhYdtYtYXaQqkPMLW77uWIdAhCZThfNw1pfrM +np3fnc1MPP5N2T11ZZnzIdzVYju8rBmJvABQiy4UUm7Ux+wMc8PAmkgiyvb8tYnC +6Z6d/j1cepnZ6KXsSWYDur+KL8BCAQHGWfqEGg84Qdw72Dd8LT5421pPKZRJxQse +KLz+zkGrS4oCxQJDAnyBSOEfNZqZ+AW5ZBm3CKxl4DVInVWAPntpcoXAezVMTY7/ +AUVNLB9oHd6QnMr0I+GNwUB4yXfywCgXi9sgaulGhbiO+Q9Wpxc2iqlLEnI5ttzU +qyWX1p8iZ3Stn/vqG8KTME8tMkLBHzhdsyC9BOacXoAaV32+VC8g2oPA9TAPIBr+ +GnvZIHEcPE7Gag0a/HWgUwTjJzctNQXFHG9X7dWxYUi+PCmgHWKOy3kuFOz+jNxW +JkIIzYjcp4CmQ/mcDJqFKeZ5BD0guv99h8pGT6ntapS0UO59QLPWgwshfHrJ3Wky +2jx1PKqRJe24D2LJpPHHM7Bv0vts9TQJQqMRSLNmdLQxxYF1a2FzeiBMYW5nYSAo +V29yayBlLW1haWwgYWNjb3VudCkgPGFtYnZAZmIuY29tPokBHAQTAQIABgUCVVQH +OgAKCRCZRTN/KIg+y4yxB/90d3gKaqfAc8asFrDIVtwxlKfQKeVoLelQmh/x8GkG +7c6DQDzhhxf1miH1VFLJVmXhsG1zKTwYzenbVtMgjVuLrTgozwpMfvBy5tG8VtKz +PVB0I/FMjdF+4nibwdbGbfLMetg99yW28xWZ3KWo4TXljfmjqNmvEUTr5SBaeHPb +3FM6uLwRzi4+eW9GxKvJKiiLkKiFiSVK5DNUtjgIk0Szk3uS3DhAO2Y1mDMe2lC5 +G5kAhPTMRb6H3zyaG7lQ07giePqc+5L/7d8yudli15skZZfrSL5yxHQ2VDrjYQx9 +k3plZpFGZOQbi/2hVfMQKNGG+ad4La4JUp2XxMfR+NuyiQEcBBMBCgAGBQJVUo5M +AAoJEPIhxdLEYs34Ca0IALFmCsuTZf3ucWzuZ+5suVR4FNL6BD9ZyEXTSwkB2uly +SFIU1gKSn62ObufEdjLmDZ8dzx0n6u4X79zrwt94nmd+SWCtGINyOL2M+/d8KJ8I +hAl9kaqpNgtm6L39RHxwjjd77ieszhRueNy/lBnIlB0pdS9xuQ0jixjFLF1Mt81G +MNMKkX7XqWEmRz8UwpwT9PyCoUkNPa000vTMQWs8Q3Pz3Ofg3f0P4nuEJvkS6VlD +2TDwZKTKB9Q6cgerxVvIaRmDhsYSYxffF51PsqzEjR4giNRWK7yhE7qntYTE87ZV +6JnFnLq6bDRziA85pNHe6fd4EdqCrXYbUmBhvr3AgQGJARwEEwEKAAYFAlVTi6kA +CgkQvQDNHrxJfP1zFwf/dfKeVICFebqItnWcTjKfBIE7n15wB9UnJ3c/RI15yXlX +uD+u3DXV71bMM5CUakCfuXbk/ieSFyydnIUFvl64WAUnetGntnBI7bXRIB3oCyk1 +JhtVFYHAZttkRh80agrhzAwmD+L6Var0n0GlyCdbtkEGNOblIsS1jobE4nVzJdFF ++TpFP/5uZ1DEDsFSnoZbepo0YoBSl/ujMf1NGIoeuS/2oGQXqMFOhbdI1M/bQKqx +zbT8+cgJRM1YCmkrsL18qf0p36Te7aNlDjdNdIEYM3r75xTjsjPHsXyxKWq1zLBS +QJQ792Jlh7l9IjLR0UdLvCjz7CP1SmdEm97JHls4CokCHAQQAQoABgUCV8Ng0QAK +CRBylrJP8c6iLrikD/9buvy+F4LzbjYkAGSHFU5FTlJB00rAtrL9SPbls36uuqBK +bMxRw64hjTIzRFB6tXRRBTcGY538eVCV7iym4gk4nCa1gYbeVA4/clWDXIvCo2/2 ++umAR2fPeE4mKl9Ceih+0Z7pHhEjr7BLj13J8ZlFDGCZFHDoZUrMN51qFkm55KcK +PFpeuCcp+ohwZkGqYMxRcTcJ1zV0s58Fkun+/pHHf95LvThkT/AtabfpqsExuz45 +jPws1llPL527jez5RAf2M0LwWQRXvWAxo6GyULR3Re4J2A598vYAIiTEcmgq2Z9d +YYn3xAspxgccs/qrhwNNcni9pJRHtxQPkgZ5I5xVwjsQax76qmfQRtZbe+fjdd5O +HmkAJgAHdWbPiKMziqpp92fVww80SI+TuW02xKTqXtAmmgYGWZngFJqLRQA7GQ/H +B+lcm8rZUBLPPxu2lbE6K6FLCpwAqaeiVkBMq+kq/4yyIV0Bbi1w4F0d2SFtDY0y +l6ZvnbZpikC3xFzOnk4AKJDRzjv6a42zVRXbbz98QIc7dLb3QAYSrgKbHMXqLpRo +u38qwNrMWjrkfgGGtuOqLssiQIvuvNVigVKzP4wZ0yCIg9tqS2DpeLDFl0N8Yw9s +D9BXjDMqZ1MsVhb8y4Hnx673PWE5dixsSJcexe9zWogbzUFSOgVUyYapRx9UQokC +HAQTAQIABgUCVVJzmwAKCRCZtd4LMJZlaV2EEACb1qCsnf6qtxFmhdgsCYzBRKTf +LQ6D+wUpZgZzt+DOqa9cHU7DVHAPVNGfNDglG8ZDCsnrcy91XOmYbXTwT81jldmH +Bjj94ODlGjv8tNHBwyrnYtGo4iEHyxzoUzcIgakg9EwXseb362IGuv00GbbIqHMr +YxCsEstwOoNGStCA2ACE1BTHSx6J4Lforfbw1HkWZAXRFWzVFWW5SzbEktPzGZ8b +7ZbCfWpKRWgcZ2hgoctVeBcPfxD71U938WD1DKNBSbDqIvDZ6VGo3mSw/gleiCNJ +ALKK9AIo5Hbr57CBVdjZLQWfDadhe9m6g3VEgk6P05GL+ncivZSPo40XfeAMkxD9 +2DHKoWWFN9ax/OlKuRz0DqX87yLXa4i9kGwlpNFBIj5OYowCyT7y1rMFGF5nVX+K +gRag/XifHwf3pEEr4SF7EknvbzP9X3LwUcNUyVYjgmFu+2fJQtnLko3XUNvK489E +Xbyrd4H1XokaLOTGeYwxE8aaBkUQA/an/qdCTk7CWDfsY9OBU22N7zJfePKUohUx +fDGw4sPCMhU8Dr+4uon9krT4kuHHErdAUbWEJ2sv2yifp/EkZSjrgHIQlrZTPFNM +dZRPBp6Ck1r/AaM26isOTkjRExpCh/ut0AqOtKF6Rg8N3vTkZxEhTCgzEQgq0fpu +V8XY6t+mcU0X//snf4kCHAQTAQIABgUCVVJ6bQAKCRDg+ogVk1gtkcVwD/92YJph +6NZ8WjPHpjd9DaGVq8Q/jjNHh2r+F3vfQ+Y8sQWHYMEMvdiT1xGERs0ndqQot28r +Q35pilIksGBVXG2OGapwtZn2jDfDLcup+i9DSAMviMeHGcVhbyRpZ+oy5PCZYJvg +Vyr2WnJT5jiU68Hlq4KtsNFHk/LPjV/PrfAWR5w+6JYsgV8wjkBADelMwQakkDRR +FY7PuX0Sd65palYS3tHMKMZxjJTDVBG8W00XUCtmaVeT+7VjZfSOcnUhIVucLL+C +yvhDhhx0ZolI58WEqbD9ibMzXG/hiQOhj7dughDO7Evj5dHbzN4p6Y57HD+iYTkM +Them3M1R19ck/fPwq+gJLKoMnM+SchLy3GvdxilS7dgtZTbiV8mlDC6WM6+40QDx +KdHWODBht8jvwP5b3T1m60SVqU9IASQA/HY68WHnpY2hNI1JWGVGnbuF0VW2YG4k +jYC52UFLsXvOscI8Ah9bfL+orQ18lq6DC+2pzn5doj3RcsCOvO8RCmio2yMz4vhQ +nLbUM7hVbg0e2OKI7+V+Di9EVPl5S23b6jXw0z1kX6hnGEO48TCwPybR48UDYeqv +7w6rxeei8Wo/2Ij3bWW+8w0Ksm2V9FIxJss4hbJ+IA6TMkHBt77tDC46sCuPyzKE +KMHMIYpCw356Xsc8epBcEpvNrCU62iP9gVEtgIkCHAQTAQIABgUCVVOi0gAKCRCC +Qz41h7KufeNID/95ZZNV/1SkPUAQ7REQ4CH9w3bCmi1fWUYcXaj3GRjHPUfoMWEr +xnIKHR7JbiL4aVNNpXvvKpDZ1H1TuBMCmfPoQ/ZyzfYHiLt8KDInqJmM+98IafwR +cnFVdWz72fwSWlB6Syp3VE8MVk7JvgLUjft6jWfxp/isygSagkyHGgP6tHw1SZDU +U+RffryfWam/N1pw0NTYdffJHeYVl8x5dI9PI4owNf/qHizVb/b1TEtBfzMDbc9B +2lMVvK7IBD6MTsPW9Z/PVF25DkKMegRN3QJXGzgpmj1bQvC2mpv7+LiPRY8WeiKl +obvlI1VtNNHkCyPxnarCRH0yzcpS009UFEzDQAlSu3Q/DE2z1+lXEDzcQ0n8TDAS +fDSdpcm/Zxh8j9ainFtrj3WbM7KHwoaGJsy/o8+WxBDBl3FIJZdCG9toaXL47XHf +wNaN+k2ICk1zinFuutDk+/Pkg4kFDxQvNWYCTXz+YhIVwKqF5QDO7Dmm9f7tM0PG +Or3fUzEYLm4nTB1oKpg6rdxDQGmCXzlCMiGZdmUPlngn439KBInsKTwah8RtNVQV +WcV6t9P6gBPCCH9Sb/wcNcft287zKv7Hg1Ezt2ceKKvQtGNs3k0NBdco4dyimJef +BlWMu5E9H2MxLcuE0SAWeRXAzJCbuGIF3BAECz2I1d68me3yhzshXgMG9okCHAQT +AQIABgUCVVVFXQAKCRDalBBIg4QoJp5ZEACYmWwPcCc6Zv/saPXJsiEfXl85/yzS +5Py3+J/YD1u2hpVGirv/Hmy+j83SrTOSaDNCU+Nzqxnqpu3VFT4n53KIp0Z0k2LY +efSBqqWd3LU9Csezx4NMaYS6F8Z5JO8Y3oenG6TUjmPuaKe77THAPf9i99I2RBly +37zkv2LvfAp78XD0MyusyeJSeHqXT44xyq4TF/b/J3PBZJBlyxqFEi3F5pRHO6Ry +VBAWMEYZD0K44/EIVB4VAbkEvDHMn9yyMgdRkLbeuQUtxsG2RBa8xflpPuHDTtIK +mCnhAfUkEp4szy2xqUy2fLNf8410YNCTJsg7OtFEZNNA+H/KJTQJ0oTSUBTlNEWb +e/v0tvxIrhDGyUwkYetdSUkJqF8NyY9kfwyp2lqz5cEm0Io9M81djkNXTlen4nkZ +zscUIuUXH9jGSWwiQxROmS65Qz3JZ/ciVjg14CEY5LCfD+6/COJ0B4XSK3+hwJv6 +XnSHUInyWqzKEvamp9n6jSUybuB5ooBQt++zCxfWiNq9s/yjPive2/bPbWHFaLAC +3Z+frC15uzCOK0Fk4K6WRp28QvaoQC79Ycj/qSEurPMBmYoPnzqfaUP6z+h1KF97 +uPqjgF8m2ldRNVWX5yK+ocQr9Fxf4wgDduD/JOTozsQgS8X62oDNG6dC7A259IIU +WsgTSY9sNyJIs4kCHAQTAQIABgUCVVWO4QAKCRDUT8vOzklurrA/D/0YLssMLcu0 +LfTS1NBp5Y7ds8UByA2rc9Zljs37909upKQwveZ/gxcGvsOkhlfhq1PClDjnss3k +X1tS9LevKxavUOuq1OpAwaqDKtJfRv3c5dyXGVrwfaWDhMruodCWTzoD8GlDyK8E +D0MD4uAD1jjat1w4WbQSXwaDYKqNvFHcRH8gqvXwG9EDgbxl44YC4nFbJR7XeMYG +UeFSKlJC+dDoJuyjSCB0cMQr5jYbgRHvMCG51KROF23CnjcqDf9jKO5btQUl81RE +wC6MdrtXiRLixn5MNNXgnQldR47TZwNOVjHwx2fOdHZlb8oAlAX5JJay0uQF3yDY +bY7cDEZlSxLfbRbb93H+mbYEnOiRx59QABiO2Upu3z3bHJQbxie8gkOQuxGENkfl +Hz70rAxKXtNVMaRUVmUnMABUNhNtRK9m6R+cbksDGqqMdLFvWFtUikGVtmG7EVcx +ICeIkNrSygtJoUNpjFw6OcB6TNi8XKBQsYR7BjVS/HnXPIFG009rCTboFg3y3mZw +QxHGuiX29d1g1KrcVbPOtKPobPOXA10jjR6fKDkZPRxArrsbNOPrGeMRejELZw93 +1IySQtduWg625AxQ+1kxA4+YyHqh/5JTGBdDrVtjFEwYVeNPv5XRGIGn9hGUXP15 +L96KPElmD6vgZB/L+OKHoaLxeUBpViy3nIkCHAQTAQIABgUCVVY7ewAKCRCi4qJt +RTqL/bmUEACa4nqufTzkFhP/CUw/TYX18L27a8GQvuLWVNbQEdBV3/ACrT2QEnbR +fuX2N5yY6hiwd0Z6doklEljnthX3I22BXhmO00y5A+TP78vTAhNlZwHmT+Z0dUDW +5GAn7WOF+rPs4aFIM890i4Y14QmWybmcFv3UqHE2K9KHR3qsHtaBo0VPBlFdQW6Y +OkupixqFIrsox3KlM1BBYJ3PX7gtvOVcdHPr1FOKyQqlUhAgDWljtHm+mJyY5MeY +uLNgfsp9kdDwbyW06QkwNTJo5GC7mz+iVurXOmqNR9oHqywnWohE6/LvFFYD4Ab0 +EIfkd/rBnR1icB/u25L4gHi9v29oqzixk+wlxfL+nXlDsg6khjO9vH5JSJdaxJtp +3q7Intnr2WdeWyhBebQLOSqKyo3YYe05g2wcc+uRkMXyJZZQT29iaGd7d8yBwOqd +O5NvmYJxiPmTjlaglzeIakyV83aPep2OzLOUNwJlQesVt2ewxjPsjyaah3ny8OQM +N/iTbLoeQV9en2AtlSiKsgErQcxneN1iRunDtjT6HAFgCAc34zucFxHrvK/aOLUJ +ewIbcKz43I4rcVVSx8wb35ZsUDcbAVRoLfeOjgZTbaFGmjuj5y+Ums3GbnhqxtvO +oERtknhQLQUQppgsNh+Sym1LG1x0CzBNPO20uZpPqJ+FBEQ6GiGtyokCHAQTAQIA +BgUCVVZ9LgAKCRBY4Rux5BTZra3mD/9m0BnXNbZgkMLIWyw3F/8XOeaSAZH0jQQv +6pPO/ZtuEjBF5gs5p+b6NbxEprv7hFudjjqPwvD3kbc7ZI3DXfCEG6T48bhALmxw +k4BY84LwYwYAOLagOyHRksqcUhh+3SeH4T35LJttYwZCqDSjnlCvUJ8LaFa/MKqQ +XkYSVCeeB+XoGtIYW7yQD6D/ylTcQTXRVuFhdN17D0oermlrrXeQRyeZ8WZ5wa5m +u8gD0eHlnGd+eU2TegMF8XgmqD/FBAaOssX0FHtYlJLhh/w0n/jdT0l4Zr7fPU+D +NRstZw8ybhSpqGcNy+o0j7nAlC2KUGWP9A6e/muafKUYuXL+NzF0OCgSbDNcZIGb +k35wcCYB63O6HMuPy6yTj8ggO5g1nhQh5AtbgjDsl6Js/HCrAYPKVaWK8RVLxFIZ +CZ+mTVlT1YSALnI8+IKQELr4CrefXmdOb26lY6T5fkWxyfJkz34yhMoYNNgz9fUX +ZkFbrG/vDBhT4Ec464iWAogFiKblFVlzUH8J5UwYcUDpKGcxQ1ZBmAIIAHqKi8sQ +YjAkbLBr5iLVkr3xhUN3YNf+OKGPOnms1H2Y1LliJ/U9LJaH2yIWpe5y4V8PKyv2 +bM/gWtj4rMnMxfuB4Pe2VV90oCWTN1ZQmUqxp2GuPePZnKqdqgdrVzl78r2ic6Jq +5i7SSR+6U4kCHAQTAQgABgUCVVJ7xQAKCRDetUdYIbCzY7GED/9fN42dDdc/52L2 +WDYXo3PeSKzTxF7zLCOyPBS2b4QnjpNMTo5suJzonlBXOQgiM/5IRZSmiGnaaee/ +nAHBdYzk7le66zJa7nd6mbXRf6mGnGK86pxXvy/6U4Tcxr0gdrCUTwOdChHPI1Wz +NA7gp+zUWax3xwfVtgV5jLeC03vKLunnl6Z0k+V1DP0p+O8Yjn6++MRagGNxH+ZN +Tv+lbnvbECGC5g1IUlIjFZFPDv/WPzp4Xml4ZgKqw1ZAit69CQhGFCwcXo631QzG +z7J7EvWz0YCsA8T0q8AIfO5d7LA4EGviv9scm7pP/9DC61vZ6iOgO8zJWfs+1e/3 +HNuFxrWWFJCZ2av8bLHEtU6ud8fJ8RPya1Dcfs6EWoAIR9fdNs8/rkS2UEejmzRM +tWpSHACTlg+YqHX7XfpnN9a0YSXaiFP9aZXHIEffk2ThFJZzOjAiO6wWmzjj0Kwx +llV/XezbVlEkr9BKnP0E54TJ0PcecZECes9U4rrXdV0XuztRn5ui2Fxvt31+6Af6 +G7LVQm7gGLJIqYAW3JtfmGlClJKe3neKAC0H1OLNxn3UsL22sGwjjnWwppdXG7DV +7U6Kh0T91t07wJNIJYDeudyyta725zFhAwQF6MqHxB6kyliZFGfWuMA9yrUZHaQn +4QvnmSCZLL9dYtZmVNPpzW1VHPW2E4kCHAQTAQgABgUCVVJ9hQAKCRD/VOEuHKYZ +spkyEADZ1tu+4ZiM8qLEqdUKcCOGZ4w4QbLFyxPCWl3Ihu2FdCOCnICfamIM6Fxv +3qYjfO0DdPBu4rPOijeCgptIBSALf5FCvtg61n00kp44UFVKPrTrH1We2G/Abweq +8SKDVrF7zT2OKOZlhVTVljZIByUCuLq0ZiTP1r3fLCVPs0Qc172qN8E4roAk6XnG +Z0uR99BJxhn3rXuUG7AWvX6IWuO8Dq76GpZOUlHZYoSBlhahfw3L1IyUBPq9EobU +JOFa6omGkTw9OqWIum8XM7T6X4YlbUmKrlC7ubgHm8SORb1++dAqBkrTSy2br7kL +7hLgj7ErhegVVhKsi8V4kmADwi8ArcD9KbEbPk9XacD9dpvcX2PFeA+W2nt2ngw3 +DvHPUQyxJCoEWZ6oXUdaOFaWeSCmXDayDhR6apQxO0Eh3swHz/bzspVJ3cKmQ07v +EUP4yJpgCuLHv4ibF2B1NiXPjcATLGERx8miRl+32DXVFiAqNsj3vBojP+KZBqkK +K7vNmwCW0TwQVR0OSZ09GSO36jUY8lRcdscsrKQRAuLeOodCqtbhwkA+vv2s2f0U +YsiX4C+/IjyaU53f+dDp1L+2g6V+41KqRqv3X0l05aFktn2STtP9DsKt6KU1p6Zt +gUhucqJ3OLCsFTOjhBojkQDwj8ZMyYXFIuUeOtykfKtUlbqLZIkCHAQTAQgABgUC +VVKEKgAKCRCRPzdd5iqXDM91D/9y6Mh2vqTBPyN8SJTNL/lgO3fNfEAAYnLQWT+I +rPob87RtZlHBgp22F0ReBt7YHiG5CRi+uEWdqR3C7vashEDkOyKH82B0kRtTrBcg +bKaIiIMkYRLE6AQd8ddg+UWpid8U5a/NjYAi6YvpEQzXxyFEkhSIQ7CMVTRp08lF +1+jb2+H8DceHn/uYEArms1KealKDEDxHAIRcwIMjzzaUlhQ9C5cVMcdJAtCobl1R +BNUoxP/SJZTZFD6VA/nANNab/j08oIoOhhzfR09iI7UVwMjXvuJP/BjDdLri8J7F +0zml/Zt7XIb+V/HL4/n/rBYd74YUP3q2IRibXYwv0ubzQCNf6WXu+GhE+IlRO3Y6 +7tCm6prgGm0a255q4a7Cd875d1hhPghV75gHXDKEvca406Dvl48/6gfSs8mBrW6z ++8jfmAol23JW0KjgM8uLV+08MQUMHry8xpHhiipruHb4LM2YfIVF+otQUhmsaaPv +BikIuIjz1XbJ6wx0MPbE5fQxH7cDAbx+lirB3qjph/iZdryFsfWj9QIgAtTuyCAn +McHeG4FQADs5qvfYdySV6gu+Ozg7Gv1zudm41DcceFBb1WIECmriwTHUPwXzKVCF +cJuX0MUhcO8Q5sLGqJU86lDcCk92f1FOlGSEuFCz0YCQ1VsUXSeJyUQxfh5l8fJr +N0sTfYkCHAQTAQoABgUCVVJ5bwAKCRCotR9egDLM5CyRD/4x8o5cxe8yTtSvup+F +jYaAIkmWk68yhISlIQYixMAkfqge9hhMHVRTHhaCz5CPkMLPPYPAeZzkcCu7JIhO +HF/TD44UqfAKo8CMk8G4ursfjE0Mm71G/odgbI50WeFq6vrJ+SCObDtzYLZ1bkhP +T3KIczDeMKfz/ucwKU3qLfxXAlns0/g87ovj5IWA2XQwJkQoo0pqDX9e2g2h1kyK +owvHkpLqDSEWQjFqDmhJkXU7F0b6XjwnzhqqxFwGgdFskDG+3/9skWam0aQT8vDh +jVZQM0i5V8YXuo3KxDdeis6TpvJSKUK4EcYF99R+zw6E8esezigMXlTujpA8UEtr +umDKZxokuwZpxmCtetQVyFNlXMz64SLADLssYUcsGSw/7gYyYd2vKmpzZl6JXiUm +dJHI6RrN7rDcwn5SRAjeneyH6FSMlnWhPblGMDmmHRhTvDKMkFfoks1UjbpLq7nd +ogvs9RTpmx4eE7CWj0KmeYgAtmy0V50uvd4TzGSjICSsYNGof0Qedk0GjpslbRhJ +4JBDWsgmVBVeMbx05oUpmG78EuzkqaaI/rbttr+xM4V+efA4MjHF6N86R2zEhXEk +N+gWuQ/rm9YuKBdf1g5kqZaqvkn7Ec2S9dflB65j1lf4+ycEIKLKbXOjkNQFerlA +8Dr4ecIZI5ItnnNl/v2hur52UokCHAQTAQoABgUCVVKEaAAKCRCt3ULg6XStjwo+ +D/9m5KXf9BqQ6oLc3wxv66bsM+LKZ2isBPMs6QIiadhTJXuHc4sqaswG06pNWWoP +R2/9QaZwENevxtp/vav39J3dTqczyGaD7rbqHAMrq7IQgHXWKelerveqR+N+MyPK +sE2EvYT5VB3QKlI17JkX904Zw18JvXpgMQ4iqAAUfHzn+2d9uqtJCeZO6Bk55W3D +SddVcUQ6/yLIq24N6tozWfsdDYqzSS95Zk/98bD+IztaOAaAt6f3xJAPimF0lDOn +IeMb8XUBt7L7LVLb0oX2JfbDwgIidfm3XviUtVTT/vOg8rY1OZdyjuJF4w4ubLQu +Y+GpeGHLaK91N35psCvyj+F9c3DRGpUhMx+wkDW4c5wlKwj363sLsvKzXrLt/oqE +/Vn0HjSNjDUgI+LHmr4MgxgjPFiE1Ruls4/CPxfUdayLX/GcyVjBZ/aJHM+I9OLK +b69EdZCxYwKWRYYCW7O9tzgBZ3jz59jq9Yi3BnhDaMp/WAIINTO5NG1CUkF0qnKS +Oobl9NL83VLM8RTE0lIAsVmoyFBed2Sz33FLorjP1thwasV/PXRGxXbSMp2sq9A5 +lfhOmwmaXAdJy1Fx+Ml2aJhqneIDXKxXo8w8Yz5MqJ0WKPTI7FzSpYTHany3U7es +sIS659Q0w3rIDqGxkzZHTojnIzrKmx5OYC3+01jb3753kIkCHAQTAQoABgUCVVKv +PQAKCRDgldvmp8WiZuYGD/9c6zvKMx2m8qQ/MAfo7Ci2FJFhGjfnYo0zbC73XRlr +tixezRuK4fM7IhxvxbocDo35vucwEOlMm5eY8YvMFMnOF4Wo2xQOmXOn6f8Z9Jg/ +k50CzWqgaDFsDv788mAZjPw8EPG7LLNI+pOY21DF+gqAq8geweV9YgJUa/uRFq9z +Q4LbdPKrbnyC/XWFQRRtHJPCEdI700cRBXRl2ssIAWLVsf5pX5+NieRUV4zYRd72 +FUIOxRP4h7OrPDnZTY7uJJZQvc7eSbYt9zD/cqCE15Ep8przK9qmTjCM9E8W5oSl +u0R+v4bHIyzL8+CIS8rJ4iuO2vVKw/Os3ffENUqo7LfJvIwImV5zxAkJCm7CJSKo +YQkcHaF6wOc2ekA+F5i5049y+6xGLhJVJcukg2RJ4TUtU/iV/19di1gcY3kcT0jE +EcqDNhXcpG9EZgqtu/ISpCcqjCmUF28oXYw03j5xdq7o1fcMsLbFQ9MB3PWw9qqh +lo8zzMo/R1z4c/nyqQtXV3zPWkQ2QhmuIFr6+DY41/LI1faPBWPpg4ajdXckvL9V +mgbF2Zq+rtx2bo+hBo8llZq31hNszCnY6JwCWi8uXkIavLoqP+vTNJ1xkr94QKje +bdFA/6YKGIJtwD8H/YdVElUbGLhq/iCVoPT4gdQOgye/9xnopNDAT8pEPoc+SyDY +aIkCHAQTAQoABgUCVVN7WAAKCRB1pVGnIpXsH3aYEACh8zhxfI3NjUJO66rRL48W +4sWuKM22pl2766jM46k5t4IP4fG+Z6YqnRSYo9SFu1dZzyMkt2XmB3fRHaFcAEd/ +RoUNkxE/BgGovn427JwxL2yE8Di6EmZDq6YBrPq26uaZbz2MtkvwmvGST6QYtICS +9cL6NLpc7ZaeWW4crxpPK0C9SvaCZMagoHpfNjFkYzTNT83+xKw9DVA5AUUKHM9t +Z9Sev0L06tMLO3fTZe00FpEOtRcPBA5R5GPsKwCdqxOopEejaXdrKSxMxa6MYZMr +Xo5fEBMHvWfqJC9Sjgtx6BCljTGhpWIrCN3fja/Y02EWK+pDa1mDU6mVH5urKKjL +kmhHlhLktEVRQiyt9sDhX/5hUIiN2WnrYwKT8XTmoOgm4Crxd7/tnc1YbDjnOfM/ +u8HG/foSWIsgMWUWjQOsL/64f1IN+W4/NKCvEjalMR2zfgHSv9QOmQw+lViFK1im +R+S50q0uO+moMtZogq6mxhtcXK0visO9gcmbJBfdAfOJYHqDzbc1u+brf/hxVb5Y +JrMg6wvjd9bzDxkHH+eGfZrbyQt67kpOrR7VMfRxxmrMmrTH6j9TY7BA6tjfKL2C +KJwgiaqWO+6me6e12AtlF5s3POWaHLnFDC5AIdH3c010/u7RwwYVekzyx5ahUk4W +yHlep6+LYLZm1VdGDo4tLokCHAQTAQoABgUCVVPCSgAKCRBP8I+qGGAA1N5nD/wM +wwe0Dz3KhKl6SymPDkFvC0G280uxnKwuwfd1a9px30gyZ0x12wldFcIRq+IiE2wt +3PLuqOoHNGQ3yPrF8NRVyQkJ6J5p5QLEnq9+qMrx28mQ7OqaN+w3K8X0ZjVYu87a +EuA1zWDSVwNd4qggc1YAa0yAfBgb+uKUgKen6mrq1W0+syV/G4y/zvCqUUECSOw8 +6cFrcPcJXU9S1S+A/84f+LoC/p32BT4rN11biD0CFxXL6QJ3X8s8rQksDz6sBx/I +jLHcJofXsc0StC2jhfdlKsWFZAyQABV7Lp9XuS+Blk3VcNvUjEIFoC3a7LvgP0as +VZyu6nk6MP/ADCjiJEFTaTgCBp1615zzhqng10/NM7NZA88M2CG1vlqNRT+BU4cJ +91x0nif6gt/jTZkMzDMPSPR0h29qvgnKisJxRm9FzlY331Xua2zdl6kh4fYsJzQn +HDSE7ZZx5EgD1ynA97kzPN36O/wkUOIWzhtjzwZUCixFWKk8hjYfNsdqvnRPccnJ +QG339MG46T8UDY+0+tVq1e3Xva/00uTM26+d7DHhkxs1d0hst2DFFN9fp4iFiKGg +7YPgHQLJ4PyKcfODVNq+D/KjJYLO2XYMiTxdDwhTRVe6nPJzXvwrJeaZTXGNh4nZ +OTZoS9VWQ2ys3YZlJz7SJIAdcW6x5VIRs8EcUa4MtIkCHAQTAQoABgUCVVbRGgAK +CRB/2fzLAAvu7kW4D/9p4KbFMEVv6b46sZLFOaEDJ30LiwFSRSLMIqd3/DNSELjR +00+np65sAHgxWINWcTuQ1MOZZ7Y6ky8VCNqSrlVNXlQxDEWdAxFgttvja8ASN4W6 +CT1zeF3bCVub8JmJGfeiNnOquAv2vOrwpOdq4j6s/GDQ+zmNaYlCb5w6FVZ/XFQO +f0PKL8qUx/9r4X5sdtP7xgTr/OcUJIzmkC5Olte08CpMOBO6JXLZNY1GtSrjQ9db +F/PvL2EZ86kSv8j6lcNCnuJrfARNHmR5EjdLCHWHYPbS0NnvKyhFc9y+ibq3EA9s +OkA4cMqdOmBxW4MlIf1MKxE9wTGMgoF0wk3BrSgI9Ce7uSSdymIc3Lryozo43oor +UFpGYbMUhBLdep8xDh5JLwWkXwpfQUfa2FinMnPvgvBiJ0oJQn1ymCith5Kj4Fen +YPuZsdLgAgOVvEfmlXteYvdP2KLpq6T+SBfFpe7gCQ4NMixjqB0Up6NH1bir5iVT +BSJCYm4oqqsD5Jc/Krcq9kpoU76gEfriU016Ub7UcdlJXKTZNAK2jsG3+KH8nDe5 +qkMASBWnYtp/V49xkLYM5714yw0ch4c9gQ+Tq/hPfVYJcjCug0gEybXH+To+gHJ2 +I5EdZ/JuF4nVTUeZRT9jZ+dSic+BhJU9vxsnzgnMb5ktwRGpIgBNA+8kce43YokC +IgQTAQoADAUCVVJ0fwWDB4YfgAAKCRD8n7XhIU7pKx+FD/0e2v1cN4umdoXAMa7V +M5GGaV0Za7039q40gavnfhzze8Dat87wC7zQ+u4+sAFWDFxBJAtfZfmS2qSKkeV7 +n/KtH8Esd1HKALGvdKW1g8qmpscfwD+ByhYaGphGPKDTGZA9cR/AUatla+9ifFNQ +c/Ul5fRyCrzXctXbtaG0vtDkXXIKQdePCIRHnn0pxiCIEYSCRVbwQ7KKtJXN00nQ +bx76j/jMMIevMEJiC7ruu15CkZCXrbZ+1uR6HKAsXOGnUtVmwmU6D6a1vfERxFAA +pO0YVcXpdZnfxLnnDZofSTOBU9XaaQHq5P2nejwzdpxvyiDXeGyfH14o+V/YbPSb +Ehk52BQCUWuCabQ4wG+GpLOQX5ly6W3p3k/CkLfZpQ14nwyjmG8dj7Jpag6BeMCP +4CUc8Sdf+ci9wTkJG3FHvI7P2iDSRisskl0QHuKqoNx6oqgljqVPQ5CbBGOQQiPH +CK8UjI6qpGeSySJLRzXHs7kinlqcqkICp+e4r0AB7C2pwDnZw4lsnHQDkNgOuG+B +M5zAmw4xh27LGnGCO9EfSWKzPD5cezh5/kFExAyc7XeU1NfLvCtqLhDhiyUTJp9K +H/rLRORyMOa9nnKiK/l1aldDPOMhHcJywQP37FmWwPb5zFsK+kJWZQggzHI0unMf +wvzNLQwlJdqyoaZIGk2f3fyOy4kCPQQTAQoAJwUCVVEn+AIbAwUJEs/3gAULCQgH +AwUVCgkICwUWAgMBAAIeAQIXgAAKCRCyaZXjECUFaJtyEACPli3MFyUoAKzSjCGC +W3t5V2zsQqYx8xL1PWBPQH+BvuHqivi1+Bist1BIKUmcjiDU5H423RS5NK9EtOrA +GFJhbQg31mQa+6Y/9b75PbvDyX/OKPgf7V5FG89tUPBUZg35VbNS604o4GqfMS8E +6kYTVr6DUdjRDAhrj/19OO0mjysGtMWwUxPc/2c3CHe3MiW2JYBVwNi/x2j9l/nA +DK18ODUXa5XqEmvkEKWYL8rf2fLTlyZgV4XPu5fzrCoOJF1nzUf/aORtCvS/CTX6 +20QtUYuupzYmq68qZtt7h4VDPukuTh38D88BIuAlBBcn7PEOpR10ZvB37ooS346P +esB4emW987qWNJzQK8NizdK2L3+WWen0rLHInUSM4E+bLQ/IZ8cy95mHLUKv+rYQ +8/t5GQ1X/lpTFWuSRTNGVyK8mmD8HZOfq4IAjygf/K/+bz2vJnGCwSB67i4ZI0C6 +dlY+GgIZtfyT2HSSyphC62V7PDp7xj3nEkjjd1LJV2rzlOdh1dGhJt6NLRFrrTPU +JoBkQA9mXmIT4RSMzrcFa1am29zJsaq3y+TR1pro+zdilcJ3enow3wqjSnAznBKK +Bw9zydLgPiClgxle+UvvDqWeyjpyHvxN+OwnNfWqLvp04qs5uWxcobyXhPsc9G+8 +G4UJRO/kqwwauGy6TdPXG0DV79H/AABftf8AAF+wARAAAQEAAAAAAAAAAAAAAAD/ +2P/gABBKRklGAAEBAQBIAEgAAP/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQQE +AwQGBQYGBgUGBgcHCQgHBwkHBgYICwgJCgoLCwsGCAwMCwoMCQoLCv/bAEMBAgIC +AgICBQMDBQoHBgcKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK +CgoKCgoKCgoKCgoKCv/CABEIAQABAAMBEgACEQEDEQH/xAAeAAAABgMBAQAAAAAA +AAAAAAADBAUGBwgBAgkACv/aAAgBAQAAAADq3so8BKF3UtsKnmhhzZQyf012GOFW +umF1dscop0+vVLzX7ZZ+UFNuxYMPKt5WPmCRwb2vjOGOhCud18uahfbK8g68Yx8i +81WdsdoZWRTAS+CVPCgGD4LGKLLoN0350/TL0DCrbsy/lYsRN9kNhls0fUhAhBgw +FDUo2wHnICTWTnr3p6UB1o2rb89U32QlnC2KdNnTBjOiaGqeCwKqP9rxBSnoP2iA +rHml3De0FqTyaoml1RPFxxNi4qgJqllXI+N0ahsl/QYBWHal/Dm3FqSCIKcN5PLC +keMhFMpqJsXXpCfixzlU/otBq9mvvz83WmQk0G3DA6cRkiw8uZSYvjhhNxIQxrc3 +WeNHXb3aLVd9VLipb6UW1UutSmUi5ZmCbLjLqXCaRGcSOqzB2M7V3GpfDn0FydWC +tnPGFpqm+A4IsQ8oHjqJF9/WwV5sZjJ5+mJWsr0ezC8jUTdHZR+1h5+83XvI9ios +3YNHEWPZM2fFiLTT9C3OJmwRN053Svg096KP7sK8av1Q5rupNs6lN6pVZ7WVPtnB +XnV0KetTa3yJBt4WO772vZcp/PPTM9WFi8ooFetuQPQ4ioxRnxQsPi5SrBrEX5ks +mQYjmlJ/1xnboJpWNR5N1JkC1ux1uNhEIRqlKbgswsRQoFH66gNHDIEsVtsldPNZ +BqV0SdU6C6qOUtptgkiuGUFpFCVtz7hcTmcr4he09lN6zZaHOJlTGN4+KikhWA1X +k/Cy4f18M/X2oudUZ9118etOpuodZnedI7E1QUpB7bmqQND7de459VezscjeULpe +HrTnKFz1KuMEMcJU1qxK7mei+ssMhIpt1PFcEPWtPCD1rx4ZXplD+dgTyglQOSHu +JOUXw2nShIKytnsyfPeBTNa853GiOnCqFhXBYqVEUC2mXonm54SNMKypG0azb52F +Grf7fwonL94F1TRhRqJFcYyvFheWJoedjZecJdLuLpuMNXH3sjKHO1vHHIgVxjZ8 +Ia0jtmXiaIk2/uC4AHzOe+wo1ddc+EMwrS4ZaTqrSbGLYKye+kRoL0jPO8gu1j3F +kYcSu3vZ8Mo8ujRcSvDqQFJ8LZk253JD8t2UOOCzoAgw4tc9842FUucKOV9Ux8Sh +IkM1omC8zrLMZ3yeekGwoYooo1cRd9sbKNC4fUCDBacgPOAKkzRch3vgm7Xnqr3i +LbjDD1v3GzsI1+Z+6Grtdvjq7ajd2SlKrvJvgYjzzvB1qAGEMV021F3M1WoFOTJb +Kcn6IvhxD1pRxFNDUeME8d2rclzBqumggm6dVjlJeMpGaY3FBIZ5tivi6oawkmY9 +4l2P6h9fXOZHrxjG5qEaw0HsXISKw0j0U18ekbTpf7RlvZtQJygt90Jvjd0Mevns +btaJK9wZU28LobKM1XeorigooiGjHGRWDn90ItLcPoe5t6/Y8NXZQpg9OUN1ZoFG +Qi+XougoDXSm1ENWKz9BrvSNce1Xv//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAI +AQIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAI +AQMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/EADIQAAEDAwMDAgUDBQEBAQAAAAIBAwQA +BRIGERMHFCEiMRAVIzJBCBZhICRCUXEzJSf/2gAIAQEAAQgC80lR03Wv1T6mC8a/ +j2Bm3tiR4FpeKjBjkpKjKAgoOKkn3onKK7ogouO6IHGW21dsKUbOSbViYjuQNube +DIxVaRDLdVFE2FDUW1JVThVR3og23p9BQsa/y3rHj2EGER1Ni1Xau7tKkt7hcJmo +/p/1A/prqtbRo0TH0/DfxSL5qOSN/VPX0yLeOot5ucC1s9y5jVgZaYaFxUDl8GW6 +ItYK7s2TQEiLxj5LjoRHfy2IIVON+KUSBERGkFAyrAT+pTuyBWAtp4RloE5F41Ha +nBH2qUoL6VRSL0rjiviI0m+dTYvPCUS1nYiZkmSOE/bnwnRtJ3Vb9piFeCWvNeaT +/VXAgC0yDchu9yRzTsLKN4vP2xzhRsCjihbU4iuLhTeapvTaLjjQovvTee2NI0+r +5FW3lMcRLyLfMm6H5dJUTDkHeha3HIUE0UUDynhVVsk2WQIbqYNAqqhA1EccJTKP +EJk8adz29OsogG33CXqC6y4rZfpXlXGX0agLPL3+H4rxvvWsF49HXN+rVGHtmlq0 +ApFyLaUV+W2QtJimSeclJHX2oLJSJAfikQQ+4F/xVoVQEyRAQFpU28tuCqOUCkvl +CUfuJtPP01cwTJOQCWjVF3SiEgXI2xyPMIoL7LGAU2Rw8XMsr7HQ8xrUkVGjNmv0 +kPcnR9hlST4p711wmDB6RXpxyFGEYxLTEJHmQRLKx26IIo0qt7UImi7Vhv5pFxXy +Hmm02XFPWaeDJxoUQWgz80WDRZUppjiK7bYqG6qqo2yrYi2XG2v3ejfZDAUJErhA +vSUMVbc4S2x812yoZkGoWxh7nWr7K22a3Nf0b3J5LfftOvF7171+PI1+pFf/AMen +bsN7t8VWvFXRjnAiAwxuv27HXIQAmCmp+RaRTJUrfym+2yVvv4RBMfTRK9/io/hB +BMNqc2SkFB81kiim+/sqG1smdILZ747EOxlHfX2pos6ED5PMq1pdIb0Z/ULjsUlA +v0jy4MbXt2tkkvPw9qHzX6joxyekszaCRcpEOjG1kzjOi2FUSnDHj5EcI/SIhn+R +lMjsFHJcTekmON+HSnp4NpuYaJ4V9EVSQclLkHDfzRq2n1q5kZXAkngjva07PjRV +xdWW0W5qMkWR3Urwwzsrncgg8jNqlg/9KkVc8Qh/YKH1Oh9veieX9MkZF6mZKXxT +b3rrHBeuHTK5xm7WrTDKk1oFpthkmlkO7Gmx78JJSPNPFi3f9RwbAzhS6xmyf/Zd +ZueSec1fg7hBd1pcB8VB1HhjJIbow5xONMukYZULnLsKuO8SpV2uYoosUmoincb7 +My8OvXMAWZquSBmtJrSQ4nEp3q8ymz4LTrWba5HG5Y9bW+a4CtW+Q3LZ5m0LBR26 +rNo0SND+m/tGb938svhvTjjUVg5Um99R4c+3yraLfbJc324uh0XF3GY2u6LVwExA +idvWuCaVbdalKbLeJRjQJksCWJLsWrD8tOxbqy8Tc6LNdUkRuzXMVVQKx3Ht7i1a +JOn5yLCKW58wTk2K8yihQu/q5ixOb/tIMaRIyUZVovCpyOfszW8pjMYPTPX5G32F +s6V67MN5d06a3t93jG46IuLbX9z0mm3QEcs8wS3c2TrEjrXGKaBsB3XkUdFHLLTb +Dc2krqrfRtFrYiLZ9VRr0SwJOr7axaryw610/JVbJmpDRIhC5q3uJ6JbWrboePJ3 +kBbtNR2mhadeO0W1nlnO9StOxz4LVP6gXR/yyurFcfyl2ktK3CQrsNizi24oFbZA +elBFhJM5d7PBGZbzhTB0j2SD2up75YND2xFuF06g6w1A4IwIcnXbpFvB1D1HtPoi +aZ603JuSMPVlrnWy7RxlxZFmgzTSksbNtuZdqy1j93Xhz/5wCDSftXRsK0MaTZGP +pqGA0PvvXXsS5YZVbmEkTWW61+Cz9HpdE6dOCTZm3Lxx8zrXHeT6kEEiM4FqbUrd +piK43eCaQRuurrhcbzHt7M9tiXczlOYadg6mvPctReJqV/dx/mxAwLo6VvaP/QKE +rZGKkyLEdj0zLw02ch8tQufuK6rebjdNPXBvSj2oxixgevkWOvTLSYan1mFrnajS +V06v7cDUGlnHLLPF+0smD0ZVccdfc9LrCq7sp9eoZTLaLAa/gyG71bjLTW/7cg5J +Qr5rrVb+707FmJo23c123PWl2tEdtzS1dMnXBiNMrIBNtqx8+p5sUFXR1VchjtlI +SNZbqzOG8T7g5bdR2EIrlnKfZNQI8eh5Fv0HZXGG7yU25Po66zAfeimcnTgqzMbJ +Le42ICRlLTsyYRyI9cld3ftd87hJd1iS7kkVbY+zpDUcGezO05a7ncNNvy7pp09D +3fUdwK5X/TGjJWk5hnarbdH3WRB5ssy3ptswJVTq5Fef7FhNUmFxs0e3LDY7SEzF +pK/O1axt3zfSkyKOmQ4Dn46sacee5T6bqSGRKaKrq5Kv3IbzP0aetICanRW6Kvhf +kcPuydr5TIbEmquJi2JN0bD7ypskMmk7cbLDRJ4IrLCiCKEiM8PqpCfiunxlFNFX +OPBa3QXYFjtjy4jbrBYoUXMnJDCAseK4jhL5gJhTB+odowjihVroVLUlt59NRY14 +1BFZbJaT4MqiriV1tS2LVUy01qFHAcUHtKsO2lxmgXl8kIbF6UEEEkJ+Eu1P21F8 +18tdDwMq3Oj4J63A2e4NW7by92Tbjm9WyPxyc6jNoIYoXgUFyTGbaublfKUkrm01 +bQ51AowowgqfEyeyEgA4KivAW+ItAO+CxUJDqMP+9YN8guTy6Utckx6Sq+/hPgO2 +9dXoHbT4Oom7/Z5UtO9afyeagHURQwoy98Qeay2rBXCXZxjdFohxLepAC56qkQ0k +Ego+1xpxgyB44rEbQHN0ZDBvZBcRvbkmsgpoYRlN1cqVEdJTAnPZowQiwNY0QBkK +tcXnwMUMkcCGzm+iiIEyzul1zl3tuJO6YMOLbZVzcpK2rzWqrL+49PvW1LAE6G/I +ZO9RiabaujcYCb8VIxDdaaJsa5F8ZHJ84i/JY8jG4XCc3MxJW9m5aKpK4jLm+7NM +ti23vTLKo0jsk2yI0cZZHkH1BBE21cEEcJUAkZB9cVBpxo1RqGYq4JE0DZFkhApe +sI8cvvCSuyY1FXvZib2ZgIloYZGk/wBV70m/4AlFa1lFGzXk5IyIYN2pWzbyP105 +xtIvMn/nyq+WzaIIx0I8kYU9tjdXxlRgS5b3uUTLmKWgXnQWU9HzRAARbXanWxaH +1OkzGZ5As1ycM3u7Lf7m22VNrIsT9SEzHAccmAFsl3i4IuZR19CbvruuyWGwyJ59 +rXpEUER96Sv4r2pP9JebRHv9v7J/V9jv1naViQwTqMNNzC4ybTc1Hwoo2i7kW6Et +cYtOqSeovCmiimB6yiGhiTEaK0y23Epkg3RwhEnd3HAAJsccI1lORGzdmWV+I05M +pJzibYRkJfco7qknAyCCVNYmea5D/kpgnirNb2bvdUhvxYcW3tcMWvFJ/Qi026SV +1LimF5buJN/+VOeyoHHkGKnlilNPB704AqtPEibuJfYpyRzaj6zaQFYftWr3X5at +XWHFjy46IsQWWGvry9bMxZChCvOuW9QsLbrO37IKQMt8EBsyHy1HEC2FoF3zHdBJ +Rp3YW/Gho5K/KnkvxSvNf8/5/wARa6iwil6Z7sGVTbCkFOTJCXFUrdCXZG2AT3fc +QQXlekdw7xhIFAD1Xy1QJA7GrTzKKLfTy4y4UbA7nf1uT5NuNvLeZPE6jLUdUpjw +u9W9EJN0jGmKIPBiiuUkbZv0om7nl0URBEdLR+2sgEtfzSUnw228V7fAakxQuEF+ +3uIXAoxnvsDECXIsEaDBUp4vqIqXGYIehHLzHDYaC6NSmiF26GTpYo1ImPTBadsM +4o5OVNmhLd4VckyYpjKH9xnLbEK79z5gDTNtvgBIVhuBNSQqcLK8zaLSt7L4dMEV +M1jFLnC0GIsgLAJv/R7f0JTR4+a6kWhY18V2OhiqVk3shV9w7LIMQEtrvKUW3ONt +pZDQEC2o44pUqyyVRZsixaXcIyWrlpe5x4wDFsWkLhLbKUU/QkoIyRxt+iZBxmDk +y7DLipipnMF/+46fpzXR7lhZiHqzHHIFZRXxNdNxEeuaylVfO1JSfBPh/wA/54r2 +of517aXJ1nSeyOSxNm2pAuZNNg9jttdkF2Oq1dVcN9yK3arSxGkG61ceqOl7RINu +IfWeK+44bEPqrqYVTii9YYiGnzper2no57Wx/rXeCc5Lc91w1iXtaeo2prvMQb5c +22cdx6Xsmxf32ngxT1LyGjea8gkCuJZoXYW4QLxX5pP6Pb3pPgi/lUFHgJk1aWNJ +ciirQtuHJo0DNKDdW1yuUhI0xViwOYbcothpeG81xvsdP4r6LwxtEK0A9s5pWK79 +Nz9qMqQgynTXmJDlQentpiEXNKsUGPHSOzqOw8otFH6co2wyTMh7weFIOI71Z22J +d4YjPOLutJ/uk+Cfwlb/AA/j4/mmfCoqaibWJqKWyjRobfGj7OclJNCSgy5w3iG8 +7dFaSE5INxVWE4pKjCtEDX0j1BMuMV3+xnaouCyEFuyXq5uyFA7TeOJs23BuaSPL +m2S8lSBB2WMtNPQbew8FyZF0HQ5G+ZGmMq0WnPdn5CrSe1ePglJSe/n4fmk/3X58 +NJ5rXpR/3DIeaacwXMFkqQLj3RIimFx5F2wYccHdmRanXIzOdLJRGlA9Rz0DdluU +y8xIyb05ONx1uMdku6Px0bcdukgNmHO95QVtlYzbf3RH3QT6bX03hRHZBiSCFg19 +p7S97SwXfcHQR5n2+CUirXn2r8/H+a8UnvV+uPy6Dxt2e7OahalzJPH24C2HPx/e +qkbeJ9waOcbjg5nijKutkptiSKnJHfiNzIXIydviTfB/Ko8UmJTTSsxHmBVxoEeN +ysm9jN1o/rpzW9zgE1OXcFXHHLlRdup+oJAdQRtzHSXqqUMGodw9Dgo63/NJSUPw +/FL/AAi/AE81r9wpxuwmtJXNqbqy+gy63uuyTIpIuyC8SH5kqZ7KTannyI2bonwM +vy3IcblBmWStrCaiwUgsOS3rTMbuTwAW0iV6HgjmMUGXAaFXCKNLmC6SR4ygcEEO +Q26ROEdDIBlVrqFdu56g3Ez0TelfkHKHphqlt5j5DJJNl2pFpPak+G/wT+UX81cJ +nYxlcSeoDKhOu6SfWy6riMyEdR1PpGCODsMltz2aF1HEwJ2O6w7uCOg+amtyFX7Y +aNrJfQajOOyoLr7tou7FtcJt5t9HpMMaW5upBXJpZssv7cRh2NoRpU7xzupBHwtF +lKugEwroakey1FMcrpwMsJKyoGl5saNilv09dCvFrR55UrzX5pfNea/NfzQ+otqv +ksZk1Ywa0JxI8yc31OZ+U6lcvLFlntSI4cWKkqm25EVxpcZMLAd0Exx2kHbkL68f +UqTY1vd4ol5nxlAXZku+jEVmnnHH7h20jRtru8y8x5LrVsbQsp0m7Nsr9JT55G7h +Fxjust/dvKrzOBiOqs3AUdmvup08blpahKHp7sOcZ0Tpvc3IU75dLJNi8eKSv+f9 +T2r+au10SG2sdrAHnRx1jIB3Tt9EeollZu8u/wAEum17JyKkWSy6pJ6VAJAbE8x5 +UKl29VZ5wFt9oxpmSa7tUwxAaXOiYgSE2kg3b3JSyhcJ7k5GnUJz1PcQfYDjyCuE +fuSx5ynTNx2DUc8lDGpDm8g1XRrEtqK18vgSmLObtwtdrxt8jiZstxC5QkX+j/iV +mDQk4aSVnuLIchkRz44Vf5STtJ3m4hemSPVs7afCf0nqZJKWi6jIYFRbdAwyVCRF +VTQBPd2Pxg6WK9k2ZeO2MC9YNZ7FQE4ib1IQXlHJ00XwTnI8uzMlQYYVuic4wxW6 +TFTdutQS9wOobPczxaXSve2C2NzDt7DGmbgwwVjbK0QmrdI0pOSFMEXVUS8jvX// +xABKEAABAwIEAwMIBQkGBAcAAAABAAIRAyEEEjFBIlFhEzJxBRAgQlKBkaEGFCNi +sSQwM0NygsHh8ERTorLR8Qc0VIMVFiVjksLS/9oACAEBAAk/Alz81aR5JwuV7QO6 ++pEj4QtM3Jd4hckLhNNuSmNiAqn807fZW8UZMJkIZusISeqjQRZfFVusoytULbSn +bXBTYaNlF0wlzB8lIHrA7KpTbSxdT6viO1FoOmnWFptHo1A0NvJ2VR9Sm/yg4NfV +1MWJToazTrzTB9zmtxe6YI/BN7vIo5rpyAM7o35c1M8k3iJ3T/ituiF47ypaqmnR +yW6bJC2G+/mFj8kO8NkNbEp+WrRe19J41aQbFOpn6xh2vmlpp6LJApE/JWNV7nxy +klcRiwjdNM1Dwyh8U2erVcH8U6Hcua+aaNU85C2zUB3bHknNN7jmjN/Z0VQRNwQp +6wpO/eVUkRpCYP2gnle6ydo68hNC+YQNgmTeKhTp+8Nwn5gypVZQnXIHmPRbmYzA +1HFmaJtzXRABlFvrFHNfU7BaI90wbrNrFhKhs6zstxqUfFDKHDhRgjdNgZtlN+ZQ +1baUR4ArQclT01T4naU2fvSmlG/VXE6ShxTa907iTbkHK4FQeLO3LtzCrh3Y42u3 +LHc4pj5z6AVfJnw4pg88xiEYY3KEctMES3mOaZJAmI/q6HxKAhD4J/xQB5oWiwVv +cm7zqtD1VbQcpTItaQnnNzRsbSnZjuefiqfhZTE6qpZWndX5EpqtmCpHKSAT/FML +Q1pFSNG+KryaGNbXFPkHjX/D6M5e3ozG57QI95/yCE6SB6tlTjML5lpCMmbdUfcn +RBuFoV8FtrZayhDdxyWptKlR0BTttDzQ2vCNuaEZuaiUPBZZC/eTTryQ1EDov0jM +1Gs32wdJRJxOJ8nU6mFdezWHK4fMecop8NZUpvd/8hAV+KBKHC19p3hc0NEPktB1 +VRgMqlIPvUwPZCcY6P7yHVwPJE+Eo682oxzuiTZOlhFpQmplCqnjdwrM8k8tFRIy +mIabLSPaX+E3Wnqnmp0ufNIbVbxZU0k0/J7iyoOcwQfRpzNKXGe4BuqvqwwrvxJQ ++KPjKd/jufHkhnqu7tNYXXVzn2HgsTwExkaMoCqgOLvFVMsnQwWlPik0gOB1HRVg +e0dYtdYJwE7bQnWmHQhq094qm1rX9b+KqE18ESKojvN/r8E1z6QqFxh8DN1KFEVg +cuWpT4et08AO14v9VWGl/vBOqFk3AMuYsTSzOsab6mUlGSbX1WsiFTNQzInluvKd +Cg4M7NtKq4Av8PQdlpsEucvJdUUKlMsdWkd3eyBOFa7JhgWwcggCRzTdLOlDcxGy +rtp0bZnu25rO0hxz1+zgj+aY9z/1nFxHxKwlatk2a7fxK8kkH2RVDnLB1A5t3Z6a +pk8uHUpgyVG5Sz+5fz8ESWuxHaNA0Frjw3VTMzOQJVTLIjLKZVgPHaxc5eaMmQ5r +6YsWxqmNY9969Qi1ONbb+Cw7rknjNg3rG5XkthBP6Nzzm8eULBMpO3e9/CP9VicK +GtqcbWUYPjqsXTe9t2A4e4/1Xk8G0Ei0+ErH1q4Y0DDtqi9Nvjv70JhH7N7PmqGZ +prcNlX7V9Pg7We8Bp5z+lJe8cwFhhh6pP2YLrVP5qi1ord6/zUQBfqVrC+zpOpTV +cDHzVQ97vPmCqLWNy3MArGNpNYLmplAhYGti3Aw04enY+/RfQ6x9erWE/JfQ9gnd +tW6wnYYgjjpvsfgn52k8Lxq1UdBm0tm/1XCwUzf2v5LjLR2cnkqzfs366QP6Kd2h +0oUaQ4nfzKpUcDTP6NtNmd6+mD2H1pe38IX0pw+KIGYU6tEOt7oX0fDGu/tWEfmb +7wbotcyLOhFjKj22zMkFMdB1t/FGeaDc0jLJXDX8p1cwqbijqT79EI+xB8wQ4Thn +Cfeucpp7fB1wakctHfJXzP4V8lRMEWug4fwVM1Hm1GmDdzlje1ruHBhRfL0A/isK +3A061XLSNQcRA3XlymDh6JrTiK0B8eq3qeSFLFuwYa51GrZ2Ui2U8/FUoqMPHSc2 +HM6QnkkFO9VUGvJHGHNUtmNdiqvDSHE4uVXs8OLUp3HQIOo0v1NGkeLXvuP8FhsZ +WbU7/wBSp56z3X7vNUqsDAPqV8tZzHNgx7r2hYpvlLydVMDGNp/bUx94bwsZ9YwO +KZmZkqTmHMImI4eiOeO67mVqE2HvDQDH3tVQc2jRwTaLPGJQ/srPw84/RVy0+BC0 +pUzKpZRiqTmurnZ5FlTy97tIO6fcGyNyE5UC94HCAySVRZUfUEkV2Zms6eIQqUMX +ReH4fEjiDXjn0K+huFx7jTqsfTx2HNSi4uHf92oWFrYvH4pv5RUczKwHZgJ2CwPZ +vD85+rPGf9mTssMKdQEnvat69Ubp/GLhN63KouewOk0vaPVdj27Z+0pvOnLLoFiK +Fai8ZclZsDwXlJtFtLECpharXHNSO0HkvovQwlbyic2OxFSuapL9z0E3hVX1e0/X +F8j9mNh4J2Sie/Qqm48CgyR63NEE7CVHuTjxVWtEeKq9pWDqYz83aL9XSa34Dztl +wp52eIQuQ3KeieCRyU2quDRNiuaB6eajrGyg9CnEBvCxrLADmvKjoz8B5DYJ7qjn +mYJXDOkJ5zuHECu6G3Q9W907a/FopuIKEtOsc1TuTcNTQ3QCdVUDs0udm3J1VBsc +3Ib6o22QvzhDV24RHZ0y5/vQltOr2ryRrl9BtjY+CbDXyGdRqEU13Z4mh2pBHM6o +Ra68Ub7yUTPVBE203WUc+apmeZVzKpixv4qPEo2Oi4w7UBM4XGWqc0XgXTYPUpgB +myf45UZk2dEJ513Ue5X2MeZgsW0231Mpvdw4g+J9Aoa8FQ9R/JUi8ONoUtfRinWb +4LdHRVLdd02Z1K1nZWhDpKJy5dU0CG2QFtStdyqupEcyjvcNujMGydcckRmTIOqp +k/sp2bk0oE3kBN4t5QIbBkJx7xWHD8LRAPi47qj2YrYjJRZ7LGW9GO0jPRn2gp7N +lI8Dh3SnH/mmB0bA2RBvaULj5rWYlOgTZH3BNl50kKpbdspmUj8E2LcQV8pumz90 +ndObmiTlVj7UWVjO26YGliZDib5NFMM5K1tCqeg7ytyC8AoGm+q5QsoZnhx8E2OC +figj5yqP2WNZI8d062bPfmo5Ig21KGi20goEW3CF5keCZN7CVEclbmIVmzc8+S+a +p5SRxWQAsGyN13h6kaqRPzWh3jVcMnVOHvXrcigZHVX30Vjr5n8GfNUPRCwEDzjz +vyuBmlU9krB1ajPUq0WFwPwWHqUqjqYzMeMpah/NAe9EwBcyiLrV2qtLk6XaGB80 +90vcGkm4TQWsbYFQ2NyN+SBEm5lNfqQXuFvFCbetzTcoptv4IymxbXmmgSeKeS1B +svGF6tjARF2ou7PIS+LKnlH4/mRbEUcsjogjxN1C1IQH3zzTddU45QeKy+KsZ4Tq +vJufENbZmfKD715G+psc6zhW7Rh8eSLmyQWmUW5Gjc6LyUX4Wm37TFVKoY33c1g+ +zpH9LWf6/QIAxpATLgSmh1/ggJVidAhr0QnqvZDB+a72Ertf+6bFEQFq7vFTrYNQ +3uOa1VS2ZaDki3qSuE9FiH+BMyFjXVaBGbsXX7PwWMdwu4Bm4R0T6ruyeMzXvtEp +oy5odGydtoiekFO9y94U8wVqfkn6nUoXquL/AEx59K1JzFZxeWfvBDoEb7uQv+Kb +cheqMzyqRn1RO6qCSIZZYiMghrfaVNtRj25GQNGi/wDv7kzik20AamZXuJgtNj4r +EGS7I7i+adlOfK6SsUMzmi/9fBMA3exxiOiII9WBqmm9ini2qsTYLV0NC7rBA8x9 +IeYxCs11VuIp/wAV628pvj5jtuiWkawg+pUMBtOmLkc0ezflnJmkjoVrl09kLMGO +bDX8pKpve7tOIjYLCudlqHgB9VYXP63WVRyuDnty7xzVB+Zg+zm3+6Lg9nfJboqk +mjTvfvSnaeqFsLhHRNkURM/e2RQ8w8wWvo0hOFdJbzZuiLHU6J0mm4B8DRVdO8qe +abaqHl9mtIsCsfne8ZKp2ZzhYDF4moyrDqjaPAvovi3udo6rAX0Gb2c+rihML6N4 +rDZjer2OYD4LyJj8S4kjNSwhAJ98L6F1Q4i31ms1gj5r6EYYkcsZ/JfRWnh6DhAq +UnTlVEZi2C4Ov4FNg/VY8RqP4rZaAaNUwShx1ON/5gehcOaQV6tQtv0KaPtGgOI3 +QNwtOSpZnXItomwH0xv+CogbymCw15qlTytKbly6DqqIF7EuVdr/ANlUm962ZYbO +DyOyY5rqTbVKY2QLK7Kjr65wf4I5oR9y9Ylxb+z+aCCFlzTP15XNTwzEGyHF95Nd +UplokaboQ0CxLu6mniOoGqEGf6CrEMd3sj1iXB3ai+abLE1HDt4Em0Jz3AGGdpum +QW+oqRPOEYFPvcSNQufMEmdUZF0OLLEBR9lRgdJP558tIExsVfmU/ujdbaEhNOt4 +KPCDv+CbFPZqNyfU5JoLssQAU0weE1KgVDLexlBmfKRnNpCytcBxOnZOqWaFVlz4 +zzpCYbDuKeFskJw11VU06uPb2lOpl4bWiU4OY64cN/OPzLoqVrMnYblAdjUrn6pT +37DQOP7WvvWmxKMNzR71WbmY7VMzQbptpnVNcbRc2TyZjfdOl0luZvrHl4IdpMEM +0hU7sGmb5qCDUHEfVnZOygbQi4Hs/V26QpiIaTZPJHqnMu+RYlVCHqqKrKWCZODq +2FS5PA7Z6xb63k99Tsw+sIfh3+w8Iy1wsR6Hx8w9AKQajGYSkQdDVdDj7mgoEUKd +VtLCsOgZT4PxBTgQhY7hNg6J8PbvzVwRIHRQTmtJVLvGCG7Hmph1rdU4eyBN8qcA +eJzoPLQLKD2sBs6cl33Nv7LT4o8Nmsk6Hr0WWo7obBO/d6r1tXcgnXO6425mNAaY +0bz5ofWauHw04qi3+34Xe396zX/dYrtGgA4Ovm/SMIlp+CCHoH0LuPdCf3HYjFv8 +KVCPxepDsX5ApVqpdbjc4uP+Yofs9VzuArOad03xCqWI+SYBZOjKZBcVVguF2gam +E89nl7MO3LuaqjSBIVYl3bDOTrE2n3Kpm4rckWsHr1o35BNk6m+v80DM8DJstjZO +nqESZrnVNjH0ScR5NP8A1BZ+lofvN/qyq/knYDG+S3g3+qVHcbP+0/4AgIjtqZyV +o5+iU5HzHhp296MfV/oh5ZIdyLqlNo/yqf8A0x+CwtW1spoSf8wTgIbaNlZ2/Iqx +mbpxnmFy/qVa3dlU5B4nFjb+ELCOdiS3KwFhzfBYap9i5peaVM5T06qifrFXD5qz +cpzUx1WGc1vYdqadYcXK4VU1fZYbAe5AOO0GwTyXDbkibd0IdCgGtAhgTs01SSi4 +4q+L8kx/1FHvU/32fxX/ACrAPK/kzrhK/Bi6Hg1xzxzy8k67g6lUvq5hgO97Mp9A ++cI/aEfBVJdUuDG+ZgTuJn0Iqvd/3MS//wDKpz230hwlJvX8iYUSKlLhIOtkfirA +aKoQZ1hDa4R9ypD4arBNLniC6NlQceYheTGmplymoadyFh6bHNblDzqAq5cfu2C1 +izjogS4u9m6qTm08E7hGydPJe0bhN/LqFIY7BUv7ytQtUb+/TdCOfD+Tx/455K/9 +zydXti6EQO7d0c8qqlwwFTse0cP0jcgfTPWaTtebE6XMsf8AX0D5nWAJN0CO1cCA +r/lOQe6oT/8ARfr/APhrg6gnk7EViu5/54wQcec4FoU9jjatYtf99tRwIT9VfnCm +BvyVUEH1UzLGzt1WLeQJspj2hcKCB7JutN8ylxF9NE73DdaDWNAgb96Dqjl5J+/r +BHTRbzKl31GrSxwcDxMyQzEN8DTdPxTZo+QfLgo6wH+SvKNm9CG1CB+4sMT9Swdf +BVXON5wNWGe91CpPuVQNa09nUM68inAjp5v/xAAmEAEAAgICAgICAwEBAQAAAAAB +ABEhMUFRYXGBkaGxwdHw4fEQ/9oACAEBAAE/IbofuYVQYhRw9Sw1nOUs5xcG06Gr +q1gl0L4JdH8E2K02aIk0Y+9RtByqq48zyBsN7eZbYMbeXMUVNuSbfUMovKq0LgXq +yLB9TNb8lgrjiLgZRp6MMwHMIBWXuEb1sEvdDhjYTC89Yrcci8DYSg7cwrMN8TY5 +kNVCrnEOAAYTuHqQ9028yxRXyX+xBmt2FCtDkfR34rMMfgiN5b9sSGOq/md/XiBo +DtqpAQ6J644Ux4jIBtEq15HbLuxoBnyWVbLz3/hEBbgWGfCO2mmBZQgMA3XiDQ40 +uJiL34ZJQhFjAuMjTKmVL8wvE+Y5oLbTnW6lGqhrgHuLM6Gtw2SYU8Er+K0bfXmA +F1UGCENqzmXt6F1n/epwYcD9uojK4sHmIIvyptA4K235mEf7LnUojQ7BXownMXG2 +zbsahLf/AIFc8cEtp8sxIrrOFODth2wh5iTnBTDkoeP3FOPmCf0RGtcc9e5rg24K +f5gEsJPPCCL2ADtF3h74eY+49s4lc7ECq8w2ybSvwi3nq+xHEqBam6UfMbssX+zE +s2g2whsjaXayOBF1jBLrzp7IVxlu6iLCjZ/eCCNHfHh6oK3cu8+IBVM8RLGXZxdD +2fzBS3cNYx4lktBoBHo0eCDI/Eo8svtog7HjLuXHaBrq8PA7iMnFsveZr+O4b5Pj +9xKwK6mOSLpgdagV3YAVndEL3bgqsyy40seLv/sZOGw+vUKgi5sP+uJ4IZMp64rt +6m1aTexXMoKoHJX1FCmJ2eppuVcNJLZbXMHEPLIeSOJyBWP9UxKDw29S2phvEsEW +daV6gGsRCN+pqtWmXEt3WiXQLDbYyJ+ZW0C2csoT9wFqdxrXk5ulvPiJfqVRM1WN +5grcdjuUsFL7D991Awq+924D4LZZzzbQF5f8hZEwqIPf+VEVmT+iHK17MZuGGxD0 +z3KkJ8jJBe6mqZWFVAaEwLBqhygC0bGLenIcyZynKnBr1LDA5LMp1FX1vT4CWEcb +3z7mGHUBlxYrC3h0mVECycVAFsxzMfU8uOJXnbqMQBATZcM71o9dWRAaA/F6+8Z0 +n43tYceHzLp5W2VdPDaHTMrh+5RgH0SmlVM5iL17IcD8SvuQBUwb/lgCTVZjTA/J +Nugpt8y6f8HzHu0VaczKW3ANwehA8izCmnkrxKAIrupuC2zjOEt87XO2a69EQbmE +cv5+YPCuytVzAm8nwa59ynI4dUL27n6dyubbLzhAGxpwBt+GxgfJXvGdlZmq8zJp +HFU7uK21rdqghm4604+ZURW9wKXbRUHOfHI18c+emC02+oo9GyUXtjMTrvKbpvka +iU1NsWBZf4uHfGWVrhkr2wsarl26fxHmYrbkzRS8OKR5MmqrPGWAcB2YclEXSoei +IeHcHw6H3CwJ8h/aFnIYQfdPMzcsldzGwQrpxuIWQ4asxNrEBXDuaslFFGefUeGN +dmv9mBYLxxB1Ly5NS66jKqu2rK/coQbrIND+YaWpc9+kU2BrEvslXcq4lBjimm/E +BI/Km3mAlWeBgepxy+5pu/mVNt3xNw6vBVvuQSyNUX0X8kAdt8ZzLdc052mH2rC0 +ruZ5s1hUeRgeIL6HFueU39xocvSXoVKa6I7U7W3zOSWF0DWWbb2f+IxRZ1uldr1x +U0j/AEgJePr8xBc8GnhHN4cdq9XEcYi1BWJ1JHkHgPuOGzyhpu3z+YbwDXAL7Npj +iPHIQIL5XXmIuzSV60iJUyFV2138czGbycjyOZQXHKHyfzK4aGFp46lQK5UOJecH +XpXg+ILBqdJfyuDmVUs46mWJO4JdS0Y2wr7xxKQb2PpPBtFC653POviUjbIuTuZD +RVKNbQBusjeL5XviVqWK96049y8DasBbiwISa+qJJRn0GsvWiEmGm6w8XLN63Foc +Edvxr9NsUBKPL5faXwV7gXgDtYnQhxoFMP4mRelhBFY856iq/Y4Vgek1ubHVzdu7 +FLPlMjyy2jQpaU0a5WK9JK0ldlMG6u4nXKgw9UbbbvEo4AEX8G6Nkcj/AFRHV3a+ +WW7XqakyDaBqTJR4wvtk+4S/9hFKm2qet+6xEL2gOZ5v+YZkacmgr5a/UpP/ACUv +BMIQHfDPuJENmj9/pBFC9V3t6eJjuoIdrazdFs1rc4NT0LqrQ9mqoEXj33D2uqEf +VlxEitVPafyuHHahO23JfPgMLUJo8s0IVLUiWX2Ns72SppnMMNLfiHrbYcC648nx +NUZXxZ1+X5nm/evh5riHmOg8+VXNkDrxZk+LyptxiKhiggzq3ATVzsVmG3gZHlaS +fHMW9QGaZ1g/ncUb8EXHdcP/ACq/MYjiY40fj4joWy3lhIXNCjqY9JhxRBdafKVh +zUPOY3/Ex7hiV0joTSHpSqEcicwG5L3b6POUe/AM8NEXzKfaLlYatab3EOXYv6H/ +AGf62WpfPEsX1oOXR9oPa+O0tr0ceeIoDDtcaDd2Oc2PKJIcH6RUycw2NrayFlKi +3jzM8MLPV5fzBvyVhQxg59TFIbjkDdzZDOweCo+ZG5b+4b/MNcavKVw1j465Xigq +VyWFVrt/2ZZeLk7qNop0JE+XqFvixUhZunmiUVUqApgILR2KggUDop4JkOmtpDZN +7ogr4MeQdpgV/wB1+Jtgc471gzVwtmucQsqu/wDbcZ2FQPGaIFuN0oLeLj41loGq +ecxzFS28sXyrGuf6mdRzhy9TclXY6Il+OSDW1+TiFi8+n4QbDCMq0mbBAcUrJxAl +iaeDuX8j6j3dikfytzQCOHowxhV1iJzo4e46FTC8/wBS6y0Tc56m0z6oLXkSmNGy +mbjjTFbiIBpiHLNNxFiWQ32MkL3eYrmt4KtTVqei5lH45fyZWrzxcY3iq6s78Xmv +MSWLvY88fMEaphNPUURVwjFxcg252Vb8VfxMZxOZxD9yrq/UhLQ0p+IuBOqztl1d +ZDjKW5bwzcDCvMBq/wAzFHHA1M2VGjbHWlXWc7h6FPCMf2tL37lrD9E/sC9xYmKM +d4MnjmdTTCHupSWqSq8RcgHRxz8Q6rUv1BRG6NTqY06zZ0fmXHK3gfMGd5rz0Hm5 +VcqVXZy+IexSpdGx63mZ3Xgl2mIK9SmFRNpN+ZUyxJcNSp0b5iMdVbIZ06accBfu +Lr6YBZ+anN5lid1m8TTIUPbDMzA/1fTFftcVB/EtMaKfWSVPcJxFq0xStdEAo28B +eITMfmUZe0+aKlYJF6vEAxl4P+EfqXxxe5kJwKxfqaBYeXpBanA/ZAAwFs7er46g +DCi9E6IYFtg55IYDUP0GYBmnlp6qYdFM71McBq9Hx6mmWM4S0Ye2H4uY07XAK21N +GrZrL0H31CJT352oPiLgciHP/CZK2eYjhnNiXuVgyuCz0E3OQ/aZ8aUXd6gfW1vh +pZ+dSyVffYRRrqqKwSwIplBVh1LxXys56lVLKHC8dRLXU511K67DY6H+4j5ko5Im +TUNzTKTopzncyiaX4Jms2q7eqhIuMMoBs8WzCybcr4Ynw5FX1LKQ4Kwdqxrokot4 +vdMOoEqx9QtNb6XUbtvMA8TPsTRxNjGN23MM+4z269Qn0YA3YuL9Cn8B9txbbl6z +fmO3FdED2OZo+2faPvUvTWmQDGhiqexw+ZWLUfyR+sB5TZo7CFIwC45fn9yrIlC8 +EwTs0wLLXgNPjipjcuSrbdvMtG9U2hW41ClS78TEzC1IeB4myroa98yvqgKZS+Jm +rdBjPMTxTYOqiKEQ7ms3MvC4FEED2rH3DHrlHcHNZ5P4imG6/svuVN22eHTiYclU +DcIAC1uUgzm2BzlMuT8p0ablFCtTsEvBTphHsgPiIxugHsxKJgQMNR2Y8AlboHRr +MI0IMshPKCMHm4PFhFeCGUFjEr/EDsorJpuYbGsFb8TKE3Rw7oECUKNJt8RuSd25 +iW4zWi2yVhdB8CVAXNahkpRbYcwFkt9X2REyrJxr/cwElFVWSamkVwzA/Mbyp/mD +ibKXqJh7EW3EMWUqMVfJ8zQcQdBKZH2zpz6l7VMbqGVcRN0cxRrRc/1zVaPVi4Rr +AreFybIENNN1cejwBvEH3gHGHeC7HM5xI1blVAJABz7/AFMKQXBjtQhVRjI1iMki +eQB/cOvo5g2ilMRF3rjxKG1ZAKP/ABAFNTyeUMYpa6y/iEGsGqv8wzFa+DWG6htg +rkaQ1kaEDekLW1LBKVAZWDY44MV4lrottgCGj4btz8ph4hTHmHhmDZ8dRTlo6Jnd +N/qUb/xLAvrcwSQS5lg7G+XfqE9OIUExOEZ+C8czjKnAF4THuaaGp+HAg6mTqPKP +QedYVyfMLAYZ57FxG04nfAxF/FeZdPA7YOvDGdBloAPLLrqPgTc+2J/yLEHrthBI +gRTK8Cm14HxAVs2HVJVIJdjiprJldQRbAmfh3E7Y6QgDD/ly/wAS2s1D6/idc47l +LLx4hdr5mscnU8rW5rTMa6W87h8eAf6aZZNkcve4lEAmDYal9yonAlli6hwlyJzq +jTBfBFAX9xNUPLEw4I30DiUlbrU6z3xEUzY7slu5ckAPT9teNQB6zWxbH9xo4zmK +0SPF+INB0fmUrWr2fUqtj3K/jM1S0iNe4BDV4OImoOLccGtWrncIqTeZhjXX1o/B +OavLHtepT60nEFOdnJFRt15JTAefiZybe4Y11sgvZ5hcW89piAOa45bLPxDAVKPB +MTkVY0HklUFkWujColirbYCrjmGP9xFr+lsA9/U8hm5XcBsI9Nd5iTsYi20HzeXN +dJhsgFdMf18S+ghqVf8AGFxuso3WLdnXMNjSunWfVwuxzZo8Z88HxG9Bdh0c9Jyh +DiXhjqc0GNZ1KsRGdOjuFuCYebcQIdD8QFQD1eYb9oXiFn8MbBjHM4ohkxfnOo15 +AwaalsfIPMbsJPvB8Z/cCBeFAwIWd3o/MNWXwJg8ylEW3rL+n4cWc3iiIErOUx8K +t9Zj6gxVWdnOJmQJAjacy6VrLhaD4IOc5vN2nvEpoMORXPwrcaQLqDhTd9RnipT0 +wwdWnUVnPTrxHNC5Q9r5IDqIw4N2nnvxCFpzsuXUzup4Zo1lA4ZdrB+TA/bNwr3u +W32ndIWVX5Te/wATXDuo8t7aam+b7mlC/UzTCJKPg7hkbjcnP9wFIadg6igBxssn +PUFCi9A58RvMMTh9sLTdk/4ZavIGgDJ8VM19FMCqGNzowOz26l6UHgk9VuYk0R+C +u581G5SO40pq7JjGD+HCj6muQwy5df67Ypx53KYXsIGPZ/EawuCsWU+EsS+4OWKz +xChhsuCXgsB8zAS3yuj4I8L+IZw73PAnGWpYFxciJg9ztb4lF8pbHMz37mSqscEF +mnR0kLgoAfCQAhU/NdfURTdvMTBmd6XUSQLRFg2l4PmPXP3G9259zNMXh30VGChn +rj0li7kbfctwLCkTD9S6PcDpY4GJT/ElyIc+fwQZiKrLBV4pNTqnPD9x8ginGnPR +11CijyPbM7ve/nM14OGGl1Fue4q0dztUPJ8Rcr5jLsM9wps3tlqWZfMbr2zGzFvF +xsxGT6EXiDEoynPwOZVG6w8xN5oxKOxJjjJpWXEeEXoTLPzEJl3Ofz1EDRaxvlAr +uC09xlaHEPH6j6uFmM7/AIq45B7WEFV8s9hA5N/EJ8PTvFxsMhsqfARUyqqrqvHz +NaZVAGb8YJshVe1fEXzcgZEtj20abb/lMXHD3PB+Z2/EEXa5uIvj5nlWYsjUl1uq +l1uqriFth9wXym7ONl+ZQyzfAMwQbT4ITlfCuWIuxpEqXKDfJu4LctX+SWBjBX54 +idFGFtc3xMV4hQ3vH+zMt2255x+o+3bsXX+ahiCAFie+4Ll6/YQWWgrQntgF0GwX +0FTo8SnBgJSnC84L1crQuQ1L2C0t9vs1AbwFbIyrUxBrda6m1cpYzBUCaTHFVmDR +R8Ex03At8UEtw+SVolrdK/jBmGam2pYc2H1EcstCpmJoiv8AcniMFv8AxG1GCq/P +6gVp4WXi4+owH25XrscaG4wyibwtbcRUMSRaFKKl4bTXQf773PkVUW7e2aQ3W1L1 +8yg64RKXkbd8RLRPCuUA6P7FfqDJghQ6833Bzh0kqHwWL343HJi/HXj06f2gzuNC +pr+n/wAUc1tlPOekq+MR8GTUw8pi7ZefB5iprwik5PFTHyhBnJsZe4Hcq108e+fU +oJpoS9TcMyxioxtZQqvJ7jguDLXRgqsJ1KD/ALAQ7yBkdL4nMwNM0sqcO5bo0Cpk +oXpYT8vVcD70wr3APpS8l8piJg61LDx2ZqyApZYX7LiJW/IdLxAtqY620V1OT1bs +HJUfs8VHRMxhvgoMnAK0zFKeHbTr6TV8Y1qFW2xnj5/IZjmXOZkpFcxf0J0NeWP/ +ALmIqsvAwUMc7uA1yiYF52xrz+iRudtF2i3wcBYJ+zc52qR2jYXlp1NCH5DzM/kX +jNy/K68kyS6VZLXuKPjDF3wviVd39uIMwx5bYN8m2M/DI3QcujzPa0cMtr+YlCVF +pv5qEDWucOWaTxWJWheBstPl96hIp22S/Lyo9q5sETWK4Hj1CaK0t5IIpMh5ZYHT +kANZOl/cWY2rwyYHlxqMt1QOtefnc7Kh0YVpuUyrM5H1YGmj1PiqWov43MQFrSmZ +MX1Fyv8Azl9AW+mIn7pRuFkiwITy+2EKzQiHgAN5WOBOKDW4SDvhR0+4dZwibGid +q/8AYngSFcotHFO9Zmkb9fkGYOWc4ZO4ajnx5JnSKQpp+0z2cSkIKfJX+Mb4TWid +eICP67fRqCdoGnavcJKslw6iDBox8zTOFMlucRf4eIyc5y46vMUoJXzFFZNfZ0R5 +VsS2yfm+eFT7EFNyxtJd22Yl3tuCrfmoU4YzcA2tJehWKy/7ExCoq4DfzaMMq95Y +34uZI9bg4Z8y7haZ6QQfSceIldK3GyxF9j5I1c99oIyF5GD3AWi3pcoga82uIagE +DR0eZUVRvSW6jDQGMvmZoPnB9lh+o+zg3fAeWYFluLv/AKnPdqji/MaYWYtxh7AJ +iwCGNXvgU8rK4bnVPjkJKzy6mG2SqxBrxIjk6n2VNTiFPjic6m+/U+yLN3jhgIB6 +6ZiBW4tXor1X3EUNFwVSfiEdu7Cm14+ZlZRFwGPtIqKeGn4JUQGz4sUgYErMuDC6 +QIQrK7lpT7DmBDPtQmUFOuF7YKWm1QpnoPBtIkl3TCMdEvGj3YkqOH8T7hLxFWRT +5jhuUpcKX/j7jip4OZhdSdnoWMmC9az5bFO1dQy+4wCivoKMa0ohszizp3mJr0lm +6j9afiEdZKhbf1P/xAAlEAEBAAICAgICAgMBAAAAAAABEQAhMUFRYXGBkaGxwdHh +8PH/2gAIAQEAAT8QWlBOF0Wa/wA4a1Wzwc7w6OjlzX1gUCvJzlV7GAWd495g5c9W +wNfziFFiCk2Q+Tbt1jyyVSlICuu7ibMataR0b+taztwAdjZ5BbN4SaFEanc8n1+s +K6CC4nzP1dGJmEk/Ifjv3gIyD7TyVm94wcgaxHT+d5oNvMuvrT6595xcJdAhzfgm +QTUYwTdo7hgiHQEl0OWcBkoNVVB7viTl5ykExKQX52dOJqdSDAb/AJxJqJ1TaXfm +dYagBhLcdHp46cd2CHRBwo+395q2MFLq3RwV4MWA1gkNC831l1JUmpp0/WH8xFU1 +8lNh8axWostvuK7vJibwqrQpH4es0IYHE48i73gsj1vflrBrrETZ3ixkLXlK/AWY +TCmgnGJBZPU0OML4KjjhCWGjxcM2k1UN7Wk4royAII3DZCOQk9uKwoSIN2Od/Nxc +YCrf3Xxp3rqYIGaCLrHYWj84iheQja7DWwsO8QyCqo0uvPHrjApRZRoFd0JxHOGd +0IEF5mgfWEoADZq2G9+XCTSPDSmjcLuZGphah6Xx7wX1oDXdQDW2TnHCAQIi1WNP +EvnEYNWQGoiHDw4Gn0PzyH44zRSCtgYh+TqYsUMWx5eTjx21j2hadX+W2vjeQjK9 +qSeevBj5bb0TWvX7wggxuPX9usJiwGwNofKSPOu8jLZxHJpUDp4pmmJLCcLqR50z +eJIGXd1rETejTfXWWhVoPJ3k1hVNBDwe8mKuIRUKuie8revN2Jko9u8HDdKCnuAJ +UtW+MklKENlUE12LypjIkJgogpRzLkLEXgc8B/4885oUVrCHkakN0xGh9KRoo9m9 +7wNhsmxZ2q8N77DKidYN45Lve+ecDgWB6nmnPrvNcCb1Y35dc4HhjXqhW6T+cd4B +052gXmcn3nPsWpDfPa494VIBWJC6i81/BhjQ8MqiS6/5wgstsCi2VeNqbmbghAZs +OlG7njnCC9iNjuXVfNwjUqBbdFiOvJjnFPEOxWBxgoXqNFX0kxwpFWqonj4/WQ2o +xYj6eYfvB49s/wAmjYb0OHJCdCNmLyNaT7xC1N1Ol6DR0PeGku9QTG0qeDry5qht +seL17yUgi+wnj1iHodz1H5A8YniUBPdtpwFZ6mHT5AAqQZwC9rQ8ZKMQasPXV/hw +j5aSQkD7r241G7GkF0nFb9YCLoptdEoFQs1zj2kGnUDhyvns4VsEBsvNc8MDwEjp +qpejDNKBTCnc93zkEANm00B4Oz3zh7oVNDkuor95oMbdIVkcf+YLVTUhGnDevvGT +QIqBKjrfNcQupBKjxpN8cYLEBNd4PI+s0cIYN9GDSKBQiF37HHuYcbWVFeXjTmuC +BjuN7aIYD4bjPa8G/vBkawabuiukD9bwwnIa3lR10k16yVE5vDTtsE8E304uDTWv +SdhqDSNLgFEFSo+BAB5mNckduev7cNZOqYtFHT2v+Mh8HXIfeBs3KY9Bxe/q47x3 +dqQc9iJ6LlgjDAAOnbsOSbtcRvrWH3WotIcADERWqew4Dy8B6ykKVq81d4EZMDu/ +sLa748Y+vlGz2PlU71gSACxQcrOA84Z2lAHd7+nnC86MRRbduuPj3lTLkBdbSHM3 +hNrikoHkPM1+cOywG1TEHp+8eeB7AQCB/Q4WgQZxfqHn1rCnDMTR6Su1ZEmBfNkW +aVQrOfjJR+QlyIX67mAzbagPdONX+81YbXKdcnlfnL0iUVHLYP6w9D2oE+tC6xdK +bm6jb7ephw1qOdi7tccWZReLNVAV3DROI7pnGToUC8EQeOI4cVrrxzVeFSGhq7TD +sVRdvHrDk6nGAYA72U/xkE2YVZ4xtYQWaWqcGL3rnJ72wUknUZfGBObCAFffR7nn +FF9ga0Hl97yxANINa3o+P6wQrjfBticSDvOA8CYm8+LwbyACLXsV/owBwh1NBtvv +68zJVlSOdBbzJv5yk0RBYN3f8GI0jNKkYbNLZ4mPNoBbRIA615TWFQMKWajA9j1r +JcKprrU8KeXAjQMQjyPzfxMUCCmQPU3mZCRikqCofSBvcwI4lg+iPs+MWCPSN8kD +/wB3gBvaJYNv5xkCa3d8ib7x9NQbAOtsZhQciIBN8eUTm4LsQbgfHyHOcCbp7ex0 +d324u+jO2xNg2I2fnB+4WHZ2Kg8EN3CQB4HyOIJsBbZkYfNA3kwoTg8Ob6n8Yb2+ +QTAamlc4TLESND/gMBIc06O+JYt7whQbNWLV9/WPzIluQZB5v5xCcdQjAJYB5/WE +NVHPKm99f4wEtTpwck/OOO+tXg5ayvUyVyROeulqp85bAljRDELyPIzXApK/Aiz9 +EuUjSAJbFqvD18YdNEOwOoS2+fRjBQF7z274/eOAz5wEXwa5wjdU4ZqR1StebcQh +AlYEUjLCbLg/Hk3CAgbV097zeq4yCgda1VU4cCi4AC8Bpr5e8DuVqmUbFKvImGgC +VK9tuhNznGSL5w0Njka8P1hmRsNUYgdVo4UAMISoL1/HnBYSw8wDRTyb6zlpl+4s +kXo2CpqIaUaeT1hUMAdAz0jIg2+CYAK6ANJ7TrNN8yfyxhUPX3l2TupqAeyhfeN3 +hJFugLwu+u8TWgL9lJOg8c6wOEIQludpe3KqSSJuggqSnJ13i9240GgseLCgN4wx +KMEAEDxxGXnKA3dnh6ToXHjHhept9oRENyebzgYrDYDogbO/rfWKSgjfGHSLewna +JiQnKCKpk38JRjSfpMQB8rxum3FAUCyRyzTsdecTLyip3WWyPrUwEAYKgAKZshOr +7zjI1xc63SIcB5zlXDcHW6A0APkwSUxFhoBUTXs41MV8iw5jqK0TUokx6RB7KaIB +pNCn0y2H5kj+M2On0mUO+DIBrQ5eBRd5P1kOU83l89my5pRRQ2Zxyd5xYrBQh2Om +uI4mEWdIkU9m2vib2ULON840JY1FeMUILFEI2cT+8CKtHgbflcCpCJq9yUovXGaB +EUiWJR2P86pJvRUJjr2nfnBwoDSKW3vAK3jpJTogAJ+MTqpASIiqARGi3cy2/PXs +SEjpXwLkqKsgax3A8+pgFY0jwVnGyMLmvMUkXBai+Dp8Oew8t83EIDuTrVy+0uQS +wrNA5dGqYmMPPCpmkSnlTgmIJayDMd5AR3fnD0DVKdVI3cLxuYEJFpfulfM7QfGF +1FgXwSryEdFzTdkMw0+mbSNbd2+oV8gOduaYQAuYDVmqSR4Ekiwwx0aUroFI5BnE +7yz24CNJU/QO+RyiJvtW16gSnJx5KyipCIM0FL03FDE0URDJ0SpBQ6YxuMV45Q88 +cZXcQYVRBdngfOaO/wC1AUvgCsOplBC+N1CvAF7U4MoxDn0zRRQA9PyYFnTef1FR +fjOVNNjsDoTa/q4XLsMJbr0Qg2XIDYq2pX2OgMWhK0btf1rXjFCkkJUKBkGgbVOJ +m0ngw+CQfJm9TRkREHqtg2F894sCsuBtiaxNTqlHl2hexyqSGSGoJveh6xjkwVmi +kFJXj947hgytrxG/K3rsypA4GRUQUUPzZzhOw5RYh2LnZPZy/wAiSJ4KOgMD507y +uwKYXxPCXI2/WMr5custWWG9InZh90TQroGgBoIDgXJ7UD0oht9A3tutg0bnKE3y +aE6Uxlq/2mFDCjSoOdYrFdNUJpCEQCjZMqQ+DTySFE0OTDsADdwaL9MmwgKFNEMd +2J+nNI6CcQ8gf9calGOBBvhVNe/OWdJGO7Ror4twYkDJx/DTkBm1Ub0+8LCjuHNx +EAYdhkxFlW6BQeE04laTAEUq6Q+WRrgmyRVhCF/OEVt0VV20byzHJTuQLEnr45ya +gZeIu44QOO3rOe4006AnV2rhVkzVjbjqE6AMbqzewwrQCq07mEHSIBHDrIxtMTSd +0r2GV4CHnhCJEaD2mSxVgbzx5O/PGkw4cgoU69vThk6GtvQfPCYec5RsNkgdKecQ +vCCs7VcyAW4TSpenqACS4J1TqB0RSaToB7HwkuAJAjbWA2GYfJIWciEXBSbPQzdU +nA1J2Q9QIzBCYs5psKglsQSllgO3JzOHfFnNx19K2ilGETfX5xUb5Ax6AGjVNTGO +kNIDzDnKiKWiNn3jr4ciKUmOY8UPwzf6gyV4chT4IYAqBK9PHxjR+46KA+IMIiCL +un7+chjRYsou1p4NYMVsuyFU4F/JjYEFIlGfPX3ipkyGNOruJOsCAEu47LP7mOW4 +Os8ibB1Ya7THJ+MGCAiA40T3twap955YVEJN3oxvOz+4Y5PZTIDpvrHHkCiRW7VQ +AQUfFZMyJFKQ8occZM2tVUeckoPk2c6O4YBsKnnV/wAYaWYc3cvmafnGVpRFPapZ +ua6M8uknQsWnyneXNpAJqcgLYU7vaq7X+HRVhUbwGfALJG/koCCKtw6o28FzU/2J +QkBvjNf9wiR2BoqlxrfisYJRHPQEpu8E0E8WgB2R6cnWdWiHfg4mJEVNMvLvBjTJ +bQPyX0YeFt21QPvTIyByHD/QZSCEDj3mgHN9TjjO44H1cTzLkbKo5FLfm4hEjet7 +L/xhxfNSBP5/rmj5dIRBH/3KJiIrg9KHN8ZqBvKUEnzjCaQwh5R287rrAJibgKcO +px8zILI9qENUO1hOK5x90jOx2UKnmzdxe7OKXkAeOTjWsEIErnyV273x3yYPPRKt +HQOKn94jUZCdNfO+jEt7ylTlfzfA5tTbEJXKvBf5wGkvIAsi5CceHJCIkwAQTs3n +kbkCaDDihNgn7xXFTQKs8tAyax03SWQtPJdKfGb5LU0JqHT19YcUu3usnkn4cABw +tg/HPDl5WZCafjx37xGw5wS8M8n43gkhgQIDqe8MGm6f2D+GeJdl4a6veDRb5Dhy +6ADoKl3/ADjephVEIfhc18dxSSwSdp9YwEbBROn5zTOfALm/NQewcLgkfcX58U5m +IwTXNbvJ+HFzm13Tp53POb8giqo4Xo8TLscNLIEN93AXyQNLZIf+ZbiiG3V8e2sY +uEGh7tkNxDeRSPRRRK6+OjXneAm9ONUFo2gd8bycEOgQu0Oda/GHXezO2Og5Dxc1 +gsklE2zR5/1gBzmV02dSl3hLU0gIqmOJrW5pw5Z7TYOzOj+M2wQ9ddAPDOd8uCCt +rAE4Z3V/GXLFazHBL57zlIGyhOXsuWGNgS98w2A8uI1zYACQfG8nQALSng8W2mXM +SKtKjhlM8bxYBI4zfkj/AHkRVvA3TNhXbxNjgnABsveSJC+GPz8esAU8thR8Vfhg +q5nfLodcc+Maq1UE9Ts1UeW40eYS7pfq/wDOEAc1aLzvZDcmcjAqxhp7eMT4exwK +NbsA6MWACYBibzx1hBWa+m3LR+u3HjsWs8gpuP8A3I2JW7j30VOWunKadaCIdcj+ +c5QNS7fb0bv43kIeFCFnMnlxVICxUcNaL2njeBGdyV2k6bBMUuWiQl9mt+9Ykw8f +6rBrbrvCRGNl5wPN6dPrEehACnAA4Zgcuo6afBr7MhIh0Qqle9b7w+BYcwG798+s +Y6GAIFiy9P8AJhmlaENwnU59mWoJSFsCJwuvGQ0ifWL+eDe9+8hEAG6vlUa+fjLn +MU09OJAemmkdd5M26Lpe8BWFDTSb/wBYiycRxYL0AV6cl2wy7YF6Nn1nVtI0g+w7 +esiCL40BeXmfWsInXDQvY/BowzT0IaYcPzd+cCvhDHlqNiF09YB8DjKOX1h6DXZY +DHsBri7SkAdQ2Rst3yZFRYE1JKROvZTKgRo20C9ZQ6u+8TgBwau19Lx84CCkExWg +CtRbhIKFnpx5E1o44wS9+YdTHSSvzzhsOgWwVS73/TgsLHRGhZ0sfvGDwAu8g/md +xw+DUHa3QHI/M5wQS6DQCjVh/vJVMPoeR/nFPLduU5PDz4cP7lE0ThA7Xg6x/K4a +GCninPXOdKsFreG9axXryGvteNpxgUkEZsW69uCilOA2uKghNk9PWJgGnA2uCgu4 +pUTChkNJ6vP+sLfejAnp8rH4uXGiXdQstoO8RpDkKmbTtvjN8VABvaaOJo85SWBS +IWaD+M2oPBq2vG23WP05ektVDvVMGwIQjdbmn1yzEtdkDpbNLX/OLW6jXHeuOZPP +znJArAHTr0/X5wLaOwABc685UWSyBtju+XrDFkwJcoqASn8TL67SKljYdN5PGKtQ +pijQUnHnBvYIuOtdA/TrNT2xD5B6XxvFNwFeoVI9AzYy8OHxKFVQ8psr5buKDiF1 +2sfv6yphDoS8DySfGDkNgu4Mhd6c4AFkr224vu/jL/GiJC6xnilvtAfbWJEnYcKA +YtFZqnLksgj8nBLotcnPeEqBjTuH95Aod51rnHsQEGHmdo0mKGNVsbCiPkQ+8cvw +EvK5Od5Zk9ugILe0uUhI01vQ3xzcj0aQEO743MoELrULEJ47j6xLEooHcIcB394n +8NCNIs0beDBSE44AGg1zX5yMPNpKzeY25qU3toBbro4fagt0Eg43Nj84AcJgCAQc +QU/3jQYa6wLKQ3K5d4DpEdohrig9eTG8Rh0ZZe+CeMnJQYbPe0A5wsp6BJXX9Dln +OX6hHJUlYeZPxg2h8Sg+fxfjGAJKIUMOPO9GTulEY0hR98GKS8Bbsj2NmvGRE1Yr +AXqqFwOYOQgQq24qUqpd8/6xTQgb3pzg2I6v8/OIg14LdfS4VipvyPn1m0Cp03Q8 +fORkwpuaP/WQ2C6IR+n+cdWWCV5t7Y7fWIFoXmpJel9YVPrQ3gH27jlKRIwb4Cce +HvHyNGMDTvucfOF5gxzpsfZxPeIkk6URcr47n3irX2cScTfJ69uG9V2jWnkP9MOO +KQB1nhJueMBZN0igoXTprg7azZeclXSuEOHCQhCibVIX/OJEjs+vATPIHhcWA05q +BFDI+2UNc3IKYgNdb0TxjfafVkA2Y+aTEVVD4Br9/wDGIQHsUN/E+MnMuSV8T784 +PvdRWG7dtusZSKLArzB/rJ/nltHf6DIawPC1uMGgmym2MdlFNe55waCngd4wFkYA +uvnEYO0/bzgIwUaWUxHviSzn15xkERwkMaFcKG9l4AX4xVAk5FQJro7yRDoDPoTk ++cNOIdjTvjq+MSYeAokm1PLzlIEBA7I2b6HHZw3N5IO3z1mku11BvBNfWXoLaHZs +TvGNaQDxC8tpJsz+AD8kMB9D7MLPDoRVBureEo6hrCVr1pAvHX7O2YaVLXIFJYA7 +OI5OdAbyBOVdHxliOgrYfMc67fGGYQeKTZtj/DLuCIBReXg4H6yDbaBS+XXJ1+8B +ReDK8w2u3TgibGkCu1+AxrcVsxTZ7xdGi21tfwfnCXupdL9HvIIqmgGn5xFu04Dh +iRRA2dejClUcg7ySneytPTWANukXhJgSQVUokmbQowW+bzmp04Ls2E5swElVhED/ +AEvxlmEEdVNL/f3gecTgSofOu9ZXPckKGb4rMUtHMKVEDxJcV3ZSQKfKqw7PGMij +nYOeUQtH45zYJrJCQoOGvHEB5cRgAOCSs50NP3hmTN7IBZyLuC6GNr4jCIcN1Hiv +nFzkI6kHnSa7Nc4yIRCAa56FWKOaSSC5kKcsBzd4OQwoyV0VoVwPtimhYBgDtaNj +rfkblRkASOEHU4fHOM1oQhLrr8fzkulBxAE0/wBcYG2Kgo9nfnIFhDSpXMO36zT4 +XkAtPxhUBj8OWyactcYwASc76/zh5BlCFxykiqeAuWHgWvz4v9e81EqrWwj58ZZh +4w29fQ5WFIVl3P4xtqAo8MCslprl05bfWERjaBZQrmyRCQY7T718ZuPAAAScHt95 +XQCGB5b5LxmkeNkNgVA5b7vMws6S7kw3cevZzgxhZwxdGJ2hoUei2bohG0uKovHM +xdLIQuUfDBDxuGKcC0mJHH1dz7zSBnODIu6xHEnWTN0tbZUaZKTa4sVTV2NdcgI3 +n1i+MuuIUXRsrfwcTwnYJDcbQjTp8mNad6MQE5gPksrZOUlavIh/OKH23ESPD63H +LiNINHZeDqPOIjVV0qh+DBFckCclcASrwl9YhjxdN3DziuRJ3ycMdIIIHhwPnbW6 +wPEbEr/vnAOQEKrn6yilaMGf98YWVBwd+L4y6c67cpIbxAgMiyiHKmgbkyItgDzU +8TWsQUFSIYF6ImGU0+VsU9OMOhaiItXwmsGLAa1xG6YVmzt8YZ0X6HyTd2aQeB1i +UitENxSxDZyByZsAoUBPDW9dXCZOGraEc+U17cO92Dq7EujsMnzHoyVQKU4XbpHN +4bA6BW2ngretbRlR4BOjop1upd7wxrDbtAy7YBoszVKx1KO10orqjAKLZ0tR40IO +ww3u+4FpBXvnCzBQOSwnf84cZJmagIevWAtldkDf9JlRInLFQ9eMMY3pT44cTVla +jmiE21N6w1ampDeJ83H7HnC3sFSqL6wWqpQGyecUhQLrr8X/ALWayDTQHN/zrLiH +pODXGBUk6igefnAipvBAj40QwlmL5Duz2S71g1QkrCEs7u+cVYqyQeiT8uvOI5UO +AIJqgDpvy55y9RVJQvNq5a94GJoWWoV9JXw4v9cZ1O/l05SAknm6e+GbfJgulI6b +Et8H85QKAMp514jPxikI+jdIwe9uHMzqGTya9sw6cJhd2D2c4l7cFCp6wlG4Bnp3 +QyRqRD4GsA9sE5E2vT3r1rGdbl5udPrjJoJy/gOWVzlo0w4zg0KinFxMJVbe19nx +iCQlQjrDWmRflnMTjHIe8LoehPX0+cV00qxycaxoBTnpJgYCarop3kN9Otfr/uMN +iDR8DHvIIgDXxnKxdBQhf3hlsproPddzSTHaAkViDsAQjziOKduUddnFQ7+cPjwA +T7fLV13lBQ+joaNRw7l4x7aNRFi9G0fvASAqCMF01xtesUSnTMC0cuiCc94BBGgP ++Vou3fGKUEIVAUpGPpwExawoiybKaXrKPkTbIoa9DeMJxM3GnIdAqquaM3WRU2jW ++Wp85cmT9GoAC6IZQhYCJfy9+MYBuEjk9yz83OCfJTuY9U/XAM09HRxAyTel5b5w +QSeNmJ7wgdoLw/1kLQu2mnnLWvZqLx84dK1dGzfOSEdAUd/eDYdhtr/eU2Qeq/Tm +5SaBF/A+MCRYLzw48XVdJj5uVqr/AK2k8atzYfnngice+fUyklE1IOnWxO/I5Toa +aK5J+fiZoEq1xCz4XYmIclxVE4ONOjzcXXj6qNXlwfjGDblvlOiONnO2E7DkwDCS +xI2egTUKqdvziU5kSOAnan/plLYClQTtoV+TrC1dVqpNoo676xCEMNhfJO13gpvG +JBo4N7cBDayAhQhI2gectGUsgsTrep4MUFgc5LeT27M1qJ6AETBpRNSsgodVSQnh +JzreBorzp+ZloP1cvO8SRDBV6u8ZzUNzWr/OOSNld4zSK26NAZLriUXjDIpHgN/V +2Y2NPwFoTFogEbS+8UBDHaTqZfX7zQ9zpz8Yge3zhsl0O60ORwkMuk+ovc4vMxkU +QBVUwLzGmRhPvEuC8UrnXOHjTEHPCDl1wyMws05TQ7/rBxtR9zlPA8HOMgGXTrG8 +Lb8YytG4PQBA28uXYKSq0kUE788YbytnAohd6QcHzvDDZriyEOAZCauvGBPSxDI3 +qmyH03A73ArpqO3dkwl1JsLoRyThMYrmwCCafF5Sce8YE21TV2h+mHAAFHuByu3r +EbttqEIgciQdEKUkdalRboaBRLRwZ051TLbnsQTwq+fjGrZAIpyessheBdExAb8L +a+MlnHRQb+/+uN3ZaA63/GCHXpOYZSmXa8Fn/GK4EIfK/wBmGgvY2nvI4QVfiIk7 +I4UDYFJtpF9+usRUQHEPZgKugRHa++sCBg7C4Bz5LvjFRLDqHS9PLfxguV4drBDd +rd/WcEXibRGpvhcQQ41pKXIC6OfeEzYieoRHYK8wMfQOitXKWTR4VxVrnTXMTTZX +lVmFMO9bNqLWAlLinrF8GM8kZ38ZTkrLnBdq4O8XQ9ih2MWnDDchjx6INQTcp2nj +nAW2igThfA/vNH52EyHeh4C/eTCTetWiXdJ0IGGoQJcMIH18ZX4iSmtPJw4eUcd4 +WgVyZhM7FlPOI0yJ58HNzTdW9BXx9YpMLiwDeT2zsBQ7Mc01V+PnxlClt6O4YFwK +A1tb10YMvN23D4PsZmlNKgJQS8MkbmskvDR5PF8YWBSE2A2flgqRFlGDx7E/eAnI +rEQnK7uuOExo9ZoDuAa1xHWBRzvtzpRar1jp5HCx8dhSvGjN1KcGWo3QA7AsNYS5 +BgACENjy5jDRioTbPukjfCx43cFiHuNQnWPlNuUcS1KdPe4E+d5ohFY4hrKDjgWt +kycAA1LVTaO/N6x82si8UT+TvAbaA3ZNJ4X+MVXiB4EnMhuzswZdCpA1Xzh/QRkt +dCxNds2gVfbGYFKDsAeOc+H/ACMpOYIPTiC0F5dP3ltL0s1iWzQ4ogfOBkxFnD6A +/rK4whxfz+9ZqCA2Hsw0dBePxgpOozb/AEyIJg7F0PPWLDO1iBWoMpfHeDeIwugj +mFjRQOTRTA8sDsE8YmKnRATmMikeDP28nZg02Tn4PjJlUxBto7V9es4i0QGl8Fp1 +jwUe7Fm45AOXBTgne4NYZWAlWJhx4McKcBUJGta1ghqDkKJGBCNQZO92RXvy1pXQ +Ny2By26nkGMMSx4MDSEbpD0JHxvrJkHXeXAOjq5KtAF7jI1DYQlNvt5PvNOpQASv +s5YFvC6NdjbswdgfzPW7NS+R1ZMcogJqAQTuhQCzr5px/kJT16Y0bkpaLhLmM1xP +nEhvcDxPWWkb4T+8l6R2RMAqdht0+MhoqAq18/nGh8kWMdpggIn2jS6u3gznQ0/N +u34sRXEBAQLwmr3MSmdkcLrZBw94+0R7qmma47wyjdqFd/bxjaoCT4j2Mk9ZbbkA +NjcDsw2FkOALenR85DmrFH8/4yhRUGyzFJ+8MTHGEwkfgXvOahwXCKaDvxZj09T1 +IF8MFMr0SzBNeg7yqHFACLeVvxz9ZsU4521VoTs/ObNXQrVvXXQfGDr++gkPJ5nO +RIlAefaYikFGhzHZzq6zYIZEMBjEqBrRU05TttCfOMIUmTEJ2kPJpZekQWoJUoD/ +APCJ36wTLA7X3s4zVJZNF3nUWpySGuR7zSVaA5nHWA2SnR3wX1nTiGEKj5hiLxir +G/C4s0bciJR2pzfjOVPKpgfKfXBE2Makn6f118Yz6LNgeahhxxi92CkLw5TfCk2S +U+85xXKnJx8c4pIho051Ka6xJELMQW6eMnRqIR4KcYjAIOyC6b/GTCCjkdM635zn +M2EugE9zAue4yAirxq4QvSRAD0HXf1jrDtNPbV8A+836CPVyUqfWGQQc/nD+D5zh +ICaBtkPLvB5cUa2u34w2iWCCKc/xiXk7c3foyKiRoQl02YXFCYpRyZW0FMQhAHTR +QLDEaMJA19B4enKSzi0fvjDBohop5+c//8QAFBEBAAAAAAAAAAAAAAAAAAAAkP/a +AAgBAgEBPwAAP//EABQRAQAAAAAAAAAAAAAAAAAAAJD/2gAIAQMBAT8AAD//2YkC +IgQTAQoADAUCVVJ0fwWDB4YfgAAKCRD8n7XhIU7pK6oRD/wKrbl0W51vDauCFCvf +SqmzzcRNLFi7A8b9dQ0OnCQgoh9Vw0aKo/T4fQ7dPwprdiDuYToeUbDITnNKRf/0 +PNM75NEXL3ovWwon0PPJ3NdazJhnE9hoKX9VQI6gMzMk7CkpJiunC2gu2+9f3DOO +2n/EeKKnZ6WaxS8Gh0uIO0aYhKPFWollaP3i92Jk+7ad71f5eb4XsDvz7V5CKxaC +PJN37j7xSbbIEbxt03GhiavVeMuKBrIJKKdCq98dw+D3wqUWaL2gD+kILoRxNkT7 +aAWa1+7cxUKyF9NB0lNaWN1Veqc+Qsr3/8eVI9JC+pPJ9xJgy70HG3emwYhkkKf1 +Lw4e5cnpjdfrTNYbR0d0kdmjQz3ng0k7IkXveVdB82Cr6uAK0lUqFv6OqYiiP1/B +la6XvqtPw+sojExpMp/SwEmMQdJWdbqZKwrypFf0kUtUbNcXHNMCm2ZxMO2ErnVp +CVdVByOzalEHpUt73yG6ygithiqX/gd6V2jDSvs0owOG3mfJyPdS6BMk9XWOZ1IP +JXZOEQ+7l/f3ZX/svebZo+Kh1ublvfjcEa9LMmr6CMaJc73rp3uoW6ymB0ZnH4kk +yWC8J+uQeMFTnNKD9Y+ns+TvO6vkpw4cOJtr8V9hDpKjrpZiwiskL+ffFgW1mJdG +LgpYczsKk1hv/eZHnbABBRLTgokCPQQTAQoAJwUCVVEpMAIbAwUJEs/3gAULCQgH +AwUVCgkICwUWAgMBAAIeAQIXgAAKCRCyaZXjECUFaA7qD/9yFF0TPFy48/cfxM1B +7OXSawVu/cv4YGGvQLVq9qce2G0uW3Ocjm/y49szQCWx1HbAVKdL52bpnA/C5JQG +Zv+GhSmAxDeYQKkUneJUG5kt5u1ZqdQ8t1aLJwVri7CS77G15IMZ4Q6maTjcmXN8 +HC4lc1oM1U36brMvv8ZpGImPCMZ94baE0mdL7vaSluqRkOQt8rz8hu2JsZel7ou7 +yH3shJ0T6yJ8PozevsIlLvIRu/1A8j7HdYb1RA6qe8vD/Btmnw5LfsCSTLmEMlVH +TRgtznuVYxe2UfYtiafMrWQxhHe/96EpzRv/ksU4uK5B66H/3SN3bOJvyEze4vIm +F5OhtGbelJQr83vCOx7wCA3FozOosNF3asZGEOvSq2UY7E2+X0EnjQG+nqCMxE+D +3m5sdtiGJtP43/nvdYC3594htAKR7q+oTlasn3ap+QvGd1E1rX/zYMoBY03/4Sjy +3AbQNoqHzj1Tx3ceGZJ6cUhX2gYHDQByObF9ae52B8mxgMrmh+TegtCAq4Q/wD4U +JlOTYtt6Gt70b30GfdZjzwywG7xn/Gt/BopmHdg/8B7B1LRW3GjTJsWnGWG8jy7c +NHIhWpSu5f7Zleod1erypRxy26JttHiEkYBm7uOz9xAwslSXurIZBN7i2/+MxCfh +FvNPsNmEWGBIp+mPtWvWjVBherkCDQRVUSdJARAAt+LOfnsgS/UUBHlxPITQXI39 +A58YEHstzEjK90klWtLvrLPBrqklWBqWcF8QdBeiSsi/qC/Ybp5GnJ8D/QUjCWWv +/gIyB6LJ7Wxj+0v18FNYbVXTVm8cI9ZqG76VDCY49xbvlr5fbqiZr1fryA/XdA5c +o9L0avFzrqF/dl7nLYWAfRoNgF0it5t6RMWcQ8Sat7VV0S9DtBW+PXIIcnvuSMwW +ANSPIzWKydT3ZTq0MvNs82yMk4kEc3uYQLcpF7Mw7ZT7cuB5uj9SbODAeS2dmcvW +hkbaoE++CltEsdEnqWM83rD6ABb+dIm4d2Zak+/IKQB9MOPgd3h3+g5FSJS87krZ +Cq3NpO4NCe3jx55yYeJktRjB+g+yqvoH3Es4SUfYrW4PajWoG3esC6b5+DjGacLu +pjEbc9vSr0P8+nOmjAADzuRbMvQe6hUqeEsflIeOJ4nUsgR7Hr0h4qgsXuASRnxN +iYh6cEAwN1YYXyO4sSETT7cbwpy4qVx5SVrNzt4wITvH1nz3C0d+mR2w74F/QgoZ +N9quOxWcKx0e0yh8Fq1pQn5LntvuIdq9K1RGNSKVz1SgzuiLNNiuqKOyuksrJMpe +9qv65NiCUkGcG9+LPI00bqs/nGiL6yF8hRFG/q3To4o1v9AShmu1c1hBguzSOYrN +H0qgO8jmgDSJNBrm3R8AEQEAAYkCJQQYAQoADwUCVVEnSQIbDAUJEs/3gAAKCRCy +aZXjECUFaDoZD/9YkQgWlkn/MjQ2aT94DIExfGMAF36tXa/3g3UABEo334IMZ2xS +YP08y5RuGwvvY1/NPgf82KszkY+Z1rbwoOpc4rcl2rXYg45nPnmyM3dHC2YZufB/ +SxFFZKEkLbZbRjhBsUPTSPuaxed9Xl8tXnW+Wv+pAD5DZuuMMvTqENhty/Au16kV +AxyI+OOqijKtfKLpOert0VTp9zB/VXgBZC3cDs6qSaZymNHRvRgczWYQA7U4HZvn +9L2gFjmPnFaLCapxMH6UHtTS27eEHuWJaBL7XOhqEKc6P35xRKPYH6pJpRbEbcr1 +1vhOIAT2rqBSj+avQ98S3U8ST9hkUd5R0Vao43wf/6ddZyvqFmP2BXhyejutZhR3 +kbXFY8WoqsstFjxkgo840G7gtq5ZgA111bEq+4aEA2R0xOdTfjpPUZ9KuOdqCZlL +BAcK+LikLJk872GUWQCxU/QZGRGYHaxJ4Gz/3A2DN5l2zXwcbEbP2DGadiDgYlVf +jnZLdSOLSCoyuWHL+s/V/4uY4HUVVkBLZEsd6Wh81vgUTdFfnwsnCMRCT9aWo2jO +vg/KGtH6hWIHAJl3menwYOd9VTrjcFnWr3pfL0qsf44pOG/EkuMoCvjDTBRRkyAz +zxLlb9OygUqtRQq2wyssv8SmSMGlLrfee+7yz1F9N6mVsuyl21KxQV8PGw== +=uZ8j +-----END PGP PUBLIC KEY BLOCK----- diff --git a/python3-imp-returntype.patch b/python3-imp-returntype.patch new file mode 100644 index 0000000..78f4d53 --- /dev/null +++ b/python3-imp-returntype.patch @@ -0,0 +1,53 @@ +From 7bd6f0e5500f778e940374237b94651f60ae1990 Mon Sep 17 00:00:00 2001 +From: "Miss Islington (bot)" + <31488909+miss-islington@users.noreply.github.com> +Date: Fri, 6 Jul 2018 21:00:45 -0700 +Subject: [PATCH] closes bpo-34056: Always return bytes from + _HackedGetData.get_data(). (GH-8130) + +* Always return bytes from _HackedGetData.get_data(). + +Ensure the imp.load_source shim always returns bytes by reopening the file in +binary mode if needed. Hash-based pycs have to receive the source code in bytes. + +It's tempting to change imp.get_suffixes() to always return 'rb' as a mode, but +that breaks some stdlib tests and likely 3rdparty code, too. +(cherry picked from commit b0274f2cddd36b49fe5080efbe160277ef546471) + +Co-authored-by: Benjamin Peterson +--- + Lib/imp.py | 13 ++++++------- + Lib/test/test_imp.py | 15 +++++++++++++++ + .../2018-07-05-22-45-46.bpo-34056.86isrU.rst | 3 +++ + 3 files changed, 24 insertions(+), 7 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst + +--- a/Lib/test/test_imp.py ++++ b/Lib/test/test_imp.py +@@ -376,6 +376,20 @@ class ImportTests(unittest.TestCase): + mod = imp.load_module('mymod', file, path, description) + self.assertEqual(mod.x, 42) + ++ def test_find_and_load_checked_pyc(self): ++ # issue 34056 ++ with support.temp_cwd(): ++ with open('mymod.py', 'wb') as fp: ++ fp.write(b'x = 42\n') ++ py_compile.compile( ++ 'mymod.py', ++ doraise=True, ++ invalidation_mode=py_compile.PycInvalidationMode.CHECKED_HASH, ++ ) ++ file, path, description = imp.find_module('mymod', path=['.']) ++ mod = imp.load_module('mymod', file, path, description) ++ self.assertEqual(mod.x, 42) ++ + + class ReloadTests(unittest.TestCase): + +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2018-07-05-22-45-46.bpo-34056.86isrU.rst +@@ -0,0 +1,3 @@ ++Ensure the loader shim created by ``imp.load_module`` always returns bytes ++from its ``get_data()`` function. This fixes using ``imp.load_module`` with ++:pep:`552` hash-based pycs. diff --git a/python38.changes b/python38.changes new file mode 100644 index 0000000..d1608e6 --- /dev/null +++ b/python38.changes @@ -0,0 +1,1720 @@ +------------------------------------------------------------------- +Fri Jul 10 10:55:15 UTC 2020 - TomĆÅ ChvĆtal + +- Update pre_checkin.sh and regenerate + +------------------------------------------------------------------- +Fri Jul 10 10:11:39 UTC 2020 - TomĆÅ ChvĆtal + +- Convert few dependencies to their pkgconfig counterparts + +------------------------------------------------------------------- +Fri Jul 10 10:08:48 UTC 2020 - TomĆÅ ChvĆtal + +- Remove release requirement on libpython, it is not really needed + to be equal as the abi changes with versions + +------------------------------------------------------------------- +Fri Jul 10 10:07:50 UTC 2020 - TomĆÅ ChvĆtal + +- Add provides python3-bla on all the subpkgs in case we are + primary provider of the functionality + +------------------------------------------------------------------- +Fri Jul 10 10:02:01 UTC 2020 - TomĆÅ ChvĆtal + +- Remove unversioned files from devel subpkg too +- Remove main python3 files from -base based whether we are + primary interpreter or not +- Fix idle to be co-installable +- Add condition to be primary to provide/obsolete python3-* +- Fix doc to build in versioned folder so the pythons can be + installed next to each other + +------------------------------------------------------------------- +Fri Jul 10 07:57:10 UTC 2020 - TomĆÅ ChvĆtal + +- Revert the full versioning of calls on the macros. These + are generic so they should really just call python3 X + +------------------------------------------------------------------- +Fri Jul 10 07:56:11 UTC 2020 - TomĆÅ ChvĆtal + +- For the doc package we can build with generic flavor, we don't + need the our-interpreter based one + +------------------------------------------------------------------- +Fri Jul 10 07:18:53 UTC 2020 - TomĆÅ ChvĆtal + +- Add provides for pytohn3X-typing/etc to allow BR on those still + to work when needed + +------------------------------------------------------------------- +Fri Jul 10 07:14:33 UTC 2020 - TomĆÅ ChvĆtal + +- Change macros.python3 to use full versioned 3.8 instead of just 3 + for python interpreter + +------------------------------------------------------------------- +Wed Jul 1 11:50:19 UTC 2020 - TomĆÅ ChvĆtal + +- Reduce some now unused conditionals + +------------------------------------------------------------------- +Wed Jul 1 11:00:40 UTC 2020 - TomĆÅ ChvĆtal + +- Redux the -base dependencies to match up pre-merge layout + +------------------------------------------------------------------- +Wed Jul 1 09:24:39 UTC 2020 - TomĆÅ ChvĆtal + +- Generate baselibs in pre-checkin too + +------------------------------------------------------------------- +Wed Jul 1 09:14:33 UTC 2020 - TomĆÅ ChvĆtal + +- Generate the importlib-failed using pre_checking again +- Add back the information about skipped tests on the pre_checkin + output + +------------------------------------------------------------------- +Tue Jun 30 07:11:19 UTC 2020 - TomĆÅ ChvĆtal + +- Use %python_pkg_name instead of hardcoding python3 where + applicable +- Sort out preamble with spec-cleaner + +------------------------------------------------------------------- +Mon Jun 29 14:36:10 UTC 2020 - Matej Cepl + +- Calculate required variables instead of relying on their continuous manual update + +------------------------------------------------------------------- +Thu Jun 25 10:44:08 UTC 2020 - TomĆÅ ChvĆtal + +- Fix the -base module build again to generate only the deps + we need + +------------------------------------------------------------------- +Wed Jun 17 18:42:51 UTC 2020 - Matej Cepl + +- Replace OBS_dev-shm.patch with the upstream PR#20944 + +------------------------------------------------------------------- +Thu Jun 10 14:30:15 UTC 2020 - TomĆÅ ChvĆtal + +- Use the %{python_pkg_name} on more places to allow easier + multiversioning +- Switch to _multibuild approach for easier maintenance of this + package. All is now in one spec file with 3 conditionals: + * bcond_with base + * bcond_with doc + * bcond_with general + +------------------------------------------------------------------- +Mon Jun 8 14:26:00 UTC 2020 - Matej Cepl + +- add requires python3-base on libpython subpackage (bsc#1167008) + +------------------------------------------------------------------- +Fri Jun 5 06:08:12 UTC 2020 - Dirk Mueller + +- build against Sphinx 2.x until python is compatible with + Sphinx 3.x (see gh#python/cpython#19397, bpo#40204) + +------------------------------------------------------------------- +Fri May 29 19:59:01 UTC 2020 - Andreas Stieger + +- Fix build with SQLite 3.32 (bpo#40783) + add bpo40784-Fix-sqlite3-deterministic-test.patch + +------------------------------------------------------------------- +Sun May 17 15:37:35 UTC 2020 - Callum Farmer + +- Update to version 3.8.3: + - Complete list of changes is available at + https://docs.python.org/release/3.8.3/whatsnew/changelog.html#python-3-8-3-final, + but most of them are just bugfixes. + - Removed patch CVE-2020-8492-urllib-ReDoS.patch: contained in upstream + +------------------------------------------------------------------- +Thu Apr 16 12:06:01 UTC 2020 - Matej Cepl + +- Add #!BuildIgnore: gdk-pixbuf-loader-rsvg to python3 SPEC + +------------------------------------------------------------------- +Thu Mar 26 15:36:55 UTC 2020 - Matej Cepl + +- Add patch bsc1167501-invalid-alignment.patch + (bsc#1167501, bpo#40052) to fix alignment in abstract.h header file. + +------------------------------------------------------------------- +Wed Mar 11 11:09:41 UTC 2020 - Andreas Schwab + +- Update list of skipped tests for qemu linux-user build, test_setegid + (test.test_os.PosixUidGidTests) is confusing it + +------------------------------------------------------------------- +Thu Mar 5 18:40:29 UTC 2020 - Matej Cepl + +- Update to 3.8.2: + - Complete list of changes is available at + https://docs.python.org/release/3.8.2/whatsnew/changelog.html#python-3-8-2-final, + but most of them are just bugfixes. + - Updated patches: + - F00102-lib64.patch + - OBS_dev-shm.patch + - SUSE-FEDORA-multilib.patch + - subprocess-raise-timeout.patch + +------------------------------------------------------------------- +Sun Feb 9 00:14:24 CET 2020 - Matej Cepl + +- Add CVE-2020-8492-urllib-ReDoS.patch fixing the security bug + "Python urrlib allowed an HTTP server to conduct Regular + Expression Denial of Service (ReDoS)" (bsc#1162367) + +------------------------------------------------------------------- +Sat Feb 8 22:21:10 CET 2020 - Matej Cepl + +- Add Requires: libpython%{so_version} == %{version}-%{release} + to python3-base to keep both packages always synchronized + (bsc#1162224). + +------------------------------------------------------------------- +Mon Feb 3 20:27:54 UTC 2020 - TomĆÅ ChvĆtal + +- Do not pull in bluez in base again, explain the cycle, + it needs to be solved by bluez maintainer for us by providing + just the headers separately + +------------------------------------------------------------------- +Mon Feb 3 19:54:25 UTC 2020 - TomĆÅ ChvĆtal + +- Reame idle icons to idle3 in order to not conflict with python2 + variant of the package + * renamed the icons + * renamed icon load in desktop file + +------------------------------------------------------------------- +Thu Jan 16 09:50:03 UTC 2020 - TomĆÅ ChvĆtal + +- Add importlib_resources provide/obsolete as it is integral + part of the lang since 3.7 release + +------------------------------------------------------------------- +Mon Jan 13 11:10:47 UTC 2020 - Martin LiÅka + +- Add -fno-semantic-interposition as it brings speed up: + https://fedoraproject.org/wiki/Changes/PythonNoSemanticInterpositionSpeedup + +------------------------------------------------------------------- +Thu Dec 19 16:25:26 CET 2019 - Matej Cepl + +- Update to 3.8.1: + - This is mainly bugfix release and no significant changes to + API are expected. The full changelog is available on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-1 + - Remove bpo-38688_shutil.copytree_prevent-infinite-recursion.patch, + which is included in the upstream tarball. + +------------------------------------------------------------------- +Thu Dec 19 14:57:32 CET 2019 - Matej Cepl + +- Add bpo-31046_ensurepip_honours_prefix.patch which makes + ensurepip to honour the value of $(prefix). Proposed fix for + bpo#31046.. + +------------------------------------------------------------------- +Tue Dec 10 11:07:16 UTC 2019 - TomĆÅ ChvĆtal + +- Move bluez-devel dependency to base as it is needed for + socket.AF_BLUETOOTH and otherwise does not work + +------------------------------------------------------------------- +Mon Dec 2 16:52:32 CET 2019 - Matej Cepl + +- Reintroduce QtHelp with the help of the new BR + python-sphinxcontrib-qthelp. + +------------------------------------------------------------------- +Mon Oct 21 18:51:00 UTC 2019 - Stefan BrĆ¼ns + +- Fix SUSE-FEDORA-multilib.patch, the platform agnostic infix for + library installation is "lib", not "dir". + +------------------------------------------------------------------- +Thu Oct 17 14:19:20 UTC 2019 - Stefan BrĆ¼ns + +- Move idle subpackage build from python3-base to python3. + appstream-glib required for packaging introduces considerable + extra dependencies and a build loop via rust/librsvg. +- Correct installation of idle IDE icons: + + idle.png is not the target directory + + non-GNOME-specific icons belong into icons/hicolor +- Add required Name key to idle3 desktop file + +------------------------------------------------------------------- +Tue Oct 15 16:39:12 CEST 2019 - Matej Cepl + +- Update to the final release 3.8.0. . + - New Features: + - Assignment expressions + - Positional-only parameters + - Parallel filesystem cache for compiled bytecode files + - Debug build uses the same ABI as release build + - f-strings support = for self-documenting expressions and + debugging + - PEP 578: Python Runtime Audit Hooks + - PEP 587: Python Initialization Configuration + - Vectorcall: a fast calling protocol for CPython + - Pickle protocol 5 with out-of-band data buffers + - New modules: + - importlib.metadata + - Improved modules: + - ast asyncio, builtins, collections, curses, ctypes, + datetime, functools, gc, gettext, gzip, idelib and IDLE, + inspect, io, json.tool, math, mmap, multiprocessing, os, + os.path, pathlib, pickle, plistlib, py_compile, shlex, + shutil, socket, ssl, statistics, sys, tarfile, threading, + tokenize, tkinter, time, typing, unicodedata, unittest, + venv, weakref, xml + - C API improvements + - bdist_winnst command has been deprecated (use bdist_wheel) +- https://docs.python.org/3.8/whatsnew/3.8.html remains rest of + changes including documentation on how to port your programs to + the current version of Python. + +------------------------------------------------------------------- +Mon Oct 14 15:02:08 CEST 2019 - Matej Cepl + +- Add idle3.appdata.xml and idle3.desktop (originally from + Fedora) to make Idle3 full GUI desktop application. + (bsc#1153830) + +------------------------------------------------------------------- +Wed Oct 9 19:09:16 UTC 2019 - Michael Gorse + +- Drop intltool from BuildRequires. Doesn't appear to be used. + +------------------------------------------------------------------- +Wed Oct 9 10:37:59 UTC 2019 - TomĆÅ ChvĆtal + +- Add folder version to allow tarball downloads even for beta/rc + releases + +------------------------------------------------------------------- +Tue Oct 8 14:53:54 CEST 2019 - Matej Cepl + +- Revert patches from Fedora (F00102-lib64.patch and + F00251-change-user-install-location.patch) into their original + prisitine Fedora versions, SUSE-FEDORA-multilib.patch refreshed + accordingly. + +------------------------------------------------------------------- +Mon Oct 7 14:33:30 UTC 2019 - Matej Cepl + +- Correct quotation of platsubdir in Lib/distutils/command/install.py + +------------------------------------------------------------------- +Thu Oct 3 13:59:57 CEST 2019 - Matej Cepl + +- Replace python-3.6.0-multilib.patch with two patches from + Fedora (F00102-lib64.patch and + F00251-change-user-install-location.patch), and our own + SUSE-FEDORA-multilib.patch to allow better cooperation with + Fedora and better upstreaming. +- Add OBS_dev-shm.patch fixing bpo#38377 + +------------------------------------------------------------------- +Thu Oct 3 08:39:18 UTC 2019 - TomĆÅ ChvĆtal + +- Pull in just gettext and let solver to sort out between: + gettext-runtime-mini and gettext-runtime + +------------------------------------------------------------------- +Wed Oct 2 15:00:09 CEST 2019 - Matej Cepl + +- Update to 3.8.0rc1. Overall changes from 3.7: + - PEP 572, Assignment expressions + - PEP 570, Positional-only arguments + - PEP 587, Python Initialization Configuration (improved + embedding) + - PEP 590, Vectorcall: a fast calling protocol for CPython + - PEP 578, Runtime audit hooks + - PEP 574, Pickle protocol 5 with out-of-band data + - Typing-related: PEP 591 (Final qualifier), PEP 586 (Literal + types), and PEP 589 (TypedDict) + - Parallel filesystem cache for compiled bytecode + - Debug builds share ABI as release builds, also the 'm' ABI + tag was removed (irrelevant since 3.4), bpo#36707 + - f-strings support a handy = specifier for debugging + - continue is now legal in finally: blocks + - on Windows, the default asyncio event loop is now + ProactorEventLoop + - on macOS, the spawn start method is now used by default in + multiprocessing + - multiprocessing can now use shared memory segments to avoid + pickling costs between processes + - typed_ast is merged back to CPython + - LOAD_GLOBAL is now 40% faster + - pickle now uses Protocol 4 by default, improving performance +- Refreshed patches: + - CVE-2019-5010-null-defer-x509-cert-DOS.patch + - python-3.3.0b1-fix_date_time_compiler.patch + - python-3.6.0-multilib.patch + - subprocess-raise-timeout.patch + +------------------------------------------------------------------- +Wed Sep 25 09:46:41 UTC 2019 - Bernhard Wiedemann + +- Add bpo36302-sort-module-sources.patch (boo#1041090) + +------------------------------------------------------------------- +Tue Sep 10 13:43:18 UTC 2019 - TomĆÅ ChvĆtal + +- Try harder obsoleting importlib-metadata + +------------------------------------------------------------------- +Sat Aug 31 00:16:47 CEST 2019 - Matej Cepl + +- Update to 3.8.0b4: + Many bugfixes, full list on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0-beta-4 + +------------------------------------------------------------------- +Thu Aug 29 06:28:15 UTC 2019 - Guillaume GARDET + +- Re-enable test_threading on aarch64 + +------------------------------------------------------------------- +Sat Aug 17 13:21:15 UTC 2019 - John Vandenberg + +- Remove xrpm from subpackage tk description + +------------------------------------------------------------------- +Tue Aug 6 14:24:55 CEST 2019 - Matej Cepl + +- Update to 3.8.0b3: + Many bugfixes, full list on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0-beta-3 +- Patches reapplied: + - python-3.3.0b1-fix_date_time_compiler.patch + - python-3.3.0b1-test-posix_fadvise.patch + - python-3.6.0-multilib.patch + - subprocess-raise-timeout.patch + +------------------------------------------------------------------- +Tue Jul 23 13:20:49 UTC 2019 - Matej Cepl + +- Add Provides: python3-importlib-metadata + +------------------------------------------------------------------- +Sun Jul 7 19:08:48 CEST 2019 - Matej Cepl + +- Update to 3.8.0b2: + Many bugfixes, full list on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0-beta-2 +- Patches included in upstream: + - bpo-37169_PyObject_IsFreed.patch +- Patches reapplied: + - 00251-change-user-install-location.patch + - distutils-reproducible-compile.patch + - python-3.3.0b1-localpath.patch + - python-3.6.0-multilib.patch + +------------------------------------------------------------------- +Tue Jul 2 09:03:04 UTC 2019 - Andreas Schwab + +- Update list of skipped tests for qemu linux-user build +- Don't do profiling in qemu linux-user build + +------------------------------------------------------------------- +Wed Jun 5 12:19:09 CEST 2019 - Matej Cepl + +- Update to 3.8.0b1 (changes since 3.7.*): + - PEP 572, Assignment expressions + - PEP 570, Positional-only arguments + - PEP 587, Python Initialization Configuration (improved embedding) + - PEP 590, Vectorcall: a fast calling protocol for CPython + - PEP 578, Runtime audit hooks + - PEP 574, Pickle protocol 5 with out-of-band data + - Typing-related: PEP 591 (Final qualifier), PEP 586 (Literal + types), and PEP 589 (TypedDict) + - Parallel filesystem cache for compiled bytecode + - Debug builds share ABI as release builds + - f-strings support a handy = specifier for debugging + - continue is now legal in finally: blocks + - multiprocessing can now use shared memory segments to avoid + pickling costs between processes + - typed_ast is merged back to CPython + - LOAD_GLOBAL is now 40% faster + - pickle now uses Protocol 4 by default, improving performance +- Remove patches which were included in the upstream: + - 00251-change-user-install-location.patch + - 00316-mark-bdist_wininst-unsupported.patch + - CVE-2019-9947-no-ctrl-char-http.patch + - raise_SIGING_not_handled.patch + +------------------------------------------------------------------- +Wed May 22 10:53:03 UTC 2019 - Martin LiÅka + +- Set _lto_cflags to nil as the package is using LTO via --enable-lto. + That will prevent to propage LTO for Python modules that are + built in a separate package. + +------------------------------------------------------------------- +Sat May 4 21:29:20 CEST 2019 - Matej Cepl + +- Update to 3.8.0.a3: + - PEP 572: Assignment Expressions. + - Other (mostly small) changes are on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0-alpha-3 + +------------------------------------------------------------------- +Mon Apr 29 15:40:34 CEST 2019 - Matej Cepl + +- bsc#1130840 (CVE-2019-9947): add CVE-2019-9947-no-ctrl-char-http.patch + Address the issue by disallowing URL paths with embedded + whitespace or control characters through into the underlying + http client request. Such potentially malicious header + injection URLs now cause a ValueError to be raised. + +------------------------------------------------------------------- +Wed Apr 10 10:22:58 CEST 2019 - Matej Cepl + +- Fix metadata of patches. +- Rename boo1071941-make-install-in-sep-loc.patch to + 00251-change-user-install-location.patch which is the original + name, so it can be looked up in the Fedora VCS. + +------------------------------------------------------------------- +Tue Apr 9 04:55:24 UTC 2019 - John Vandenberg + +- Mark distutils bdist_wininst command unsupported + with 00316-mark-bdist_wininst-unsupported.patch +- Remove Windows bdist_wininst executables from runtime package + +------------------------------------------------------------------- +Tue Apr 9 01:21:45 CEST 2019 - Matej Cepl + +- Update to 3.7.3, which is the maintenance release without any + significant changes in API. + - Updated patches: + - CVE-2019-5010-null-defer-x509-cert-DOS.patch + - distutils-reproducible-compile.patch + - python-3.3.0b1-fix_date_time_compiler.patch + - python-3.6.0-multilib.patch + - raise_SIGING_not_handled.patch + +------------------------------------------------------------------ +Wed Mar 20 14:59:58 UTC 2019 - MatÄ›j Cepl + +- Remove building of Qt Develop help files. + +------------------------------------------------------------------- +Fri Mar 15 15:10:30 CET 2019 - Matej Cepl + +- Return distutils-reproducible-compile.patch which is still + missing (still unfinished bpo#29708). + +------------------------------------------------------------------- +Mon Feb 25 23:30:56 CET 2019 - Matej Cepl + +- Update to 3.8.0a2: + * List of all (mostly small) changes are on + https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0-alpha-2 + +------------------------------------------------------------------- +Tue Feb 12 10:25:52 CET 2019 - Matej Cepl + +- Build nis module again. + +------------------------------------------------------------------- +Tue Feb 12 10:06:17 CET 2019 - Matej Cepl + +- Update to 3.8.0a1: + * The most visible change so far is probably the + implementation of PEP 572: Assignment Expressions. For + a detailed list of changes, see: + https://docs.python.org/3.8/whatsnew/changelog.html + * Recover building of nis module properly in python3 package +- Update patches: + * CVE-2019-5010-null-defer-x509-cert-DOS.patch + * python-3.3.0b1-fix_date_time_compiler.patch + * python-3.3.0b1-test-posix_fadvise.patch + * python-3.6.0-multilib.patch + * raise_SIGING_not_handled.patch + +------------------------------------------------------------------- +Wed Jan 30 18:07:49 CET 2019 - mcepl@suse.com + +- Put LICENSE file where it belongs (bsc#1121852) + +------------------------------------------------------------------- +Sat Jan 19 16:19:38 CET 2019 - mcepl@suse.com + +- bsc#1122191: add CVE-2019-5010-null-defer-x509-cert-DOS.patch + fixing bpo-35746. + An exploitable denial-of-service vulnerability exists in the + X509 certificate parser of Python.org Python 2.7.11 / 3.7.2. + A specially crafted X509 certificate can cause a NULL pointer + dereference, resulting in a denial of service. An attacker can + initiate or accept TLS connections using crafted certificates + to trigger this vulnerability. + +------------------------------------------------------------------- +Tue Jan 8 12:51:01 UTC 2019 - TomĆÅ ChvĆtal + +- Do not require full gettext in order to avoid pulling in the + glib2 as a dependency + +------------------------------------------------------------------- +Tue Jan 8 12:25:27 UTC 2019 - TomĆÅ ChvĆtal + +- Update to 3.7.2: + * bugfix release: + https://docs.python.org/3.7/whatsnew/changelog.html#changelog + +------------------------------------------------------------------- +Wed Jan 2 12:51:48 CET 2019 - mcepl@suse.com + +- Stop applying python-3.6.0-multilib-new.patch (which is still + WIP), and apply the old proven python-3.6.0-multilib.patch + instead. + +------------------------------------------------------------------- +Wed Dec 19 19:29:44 UTC 2018 - Todd R + +- Use upstream-recommended %{_rpmconfigdir}/macros.d directory + for the rpm macros. + +------------------------------------------------------------------- +Mon Dec 17 17:24:49 CET 2018 - mcepl@suse.com + +- Upgrade to 3.7.2rc1: + * bugfix release, for the full list of all changes see + https://docs.python.org/3.7/whatsnew/changelog.html#changelog +- Make run of the test suite more verbose + +------------------------------------------------------------------- +Tue Dec 11 01:52:45 UTC 2018 - Jan Engelhardt + +- Write summaries without em dashes. + +------------------------------------------------------------------- +Mon Dec 3 13:27:54 UTC 2018 - MatÄ›j Cepl + +- Remove python-3.3.0b1-curses-panel.patch it is unnecessary anymore. +- Add boo1071941-make-install-in-sep-loc.patch to make pip and + distutils in user environment install into separate location + (boo#1071941) + + Set values of prefix and exec_prefix in distutils install + command to /usr/local if executable is /usr/bin/python* and RPM + build is not detected to make pip and distutils install into + separate location +- Remove finally python-3.3.3-skip-distutils-test_sysconfig_module.patch +- Remove distutils-reproducible-compile.patch which doesn't make + really much difference in reproducibility (see + gh#python/cpython#8057 and discussion there). + +------------------------------------------------------------------- +Sat Dec 1 00:14:28 CET 2018 - mcepl@suse.com + +- Rename Stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch + to bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch + +------------------------------------------------------------------- +Wed Nov 7 12:10:41 CET 2018 - mcepl@suse.com + +- Add dependency on bluez-devel to build support for Bluetooth + (boo#1109998) + +------------------------------------------------------------------- +Tue Nov 6 13:52:45 CET 2018 - mcepl@suse.com + +- Add devhelp subpackage and split qthelp into another + subpackage. + +------------------------------------------------------------------- +Wed Oct 24 12:38:00 UTC 2018 - MatÄ›j Cepl + +- Remove python-3.0b1-record-rpm.patch and + Python-3.0b1-record-rpm.patch, as they are not needed anymore + +------------------------------------------------------------------- +Tue Oct 23 14:14:16 UTC 2018 - Matej Cepl + +- Switch off test_threading for optimization builds. + +------------------------------------------------------------------- +Mon Oct 22 14:41:59 CEST 2018 - mcepl@suse.com + +- Update to python-3.7.1. This is just a brief overview, complete + changelog available at + https://docs.python.org/3.7/whatsnew/changelog.html#python-3-7-1-final: + Library + bpo-34970: Protect tasks weak set manipulation in asyncio.all_tasks() +- Patches already accepted upstream are removed: + * 00307-allow-to-call-Py_Main-after-Py_Initialize.patch + * 00308-tls-1.3.patch +- New patches added: + * Stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch + * raise_SIGING_not_handled.patch +- All other patches refreshed via quilt. + +------------------------------------------------------------------- +Mon Oct 22 12:22:19 UTC 2018 - Matej Cepl + +- Add raise_SIGING_not_handled.patch to fix bsc#1094814 + +------------------------------------------------------------------- +Wed Oct 17 14:04:35 UTC 2018 - TomĆÅ ChvĆtal + +- Add patch to fix importlib return types: + * python3-imp-returntype.patch + +------------------------------------------------------------------- +Mon Oct 15 13:46:32 CEST 2018 - mcepl@suse.com + +- bpo-34022 still not completely fixed, so we have to keep + excluding test_cmd_line_script, + test_multiprocessing_main_handling, and test_runpy from the + test suite. + +------------------------------------------------------------------- +Sun Oct 14 15:57:24 UTC 2018 - Matej Cepl + +- Update to python 3.7.1~rc2: + Core and Builtins + bpo-34879: Fix a possible null pointer dereference in + bytesobject.c. Patch by Zackery Spytz. + bpo-34854: Fixed a crash in compiling string annotations + containing a lambda with a keyword-only argument that + doesnā€™t have a default value. + bpo-34320: Fix dict(od) didnā€™t copy iteration order of + OrderedDict. + Library + bpo-34769: Fix for async generators not finalizing when event + loop is in debug mode and garbage collector runs in another + thread. + bpo-34922: Fixed integer overflow in the digest() and + hexdigest() methods for the SHAKE algorithm in the hashlib + module. + bpo-34900: Fixed unittest.TestCase.debug() when used to call + test methods with subtests. Patch by Bruno Oliveira. + bpo-34871: Fix inspect module polluted sys.modules when parsing + __text_signature__ of callable. + bpo-34872: Fix self-cancellation in C implementation of + asyncio.Task + bpo-34819: Use a monotonic clock to compute timeouts in + Executor.map() and as_completed(), in order to prevent + timeouts from deviating when the system clock is adjusted. + bpo-34334: In QueueHandler, clear exc_text from LogRecord to + prevent traceback from being written twice. + bpo-6721: Acquire the logging moduleā€™s commonly used internal + locks while fork()ing to avoid deadlocks in the child + process. + bpo-34172: Fix a reference issue inside multiprocessing.Pool + that caused the pool to remain alive if it was deleted + without being closed or terminated explicitly. + Documentation + bpo-32174: chm document displays non-ASCII charaters properly on + some MBCS Windows systems. + Tests + bpo-32962: Fixed test_gdb when Python is compiled with flags + -mcet -fcf-protection -O0. + C API + bpo-34910: Ensure that PyObject_Print() always returns -1 on + error. Patch by Zackery Spytz. + +------------------------------------------------------------------- +Fri Oct 12 20:46:58 CEST 2018 - mcepl@suse.com + +- Add Stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch to + fix problems with SOURCE_DATE_EPOCH variable (bpo-34022) + +------------------------------------------------------------------- +Mon Sep 17 09:44:02 UTC 2018 - TomĆÅ ChvĆtal + +- Add patch to fix build with tls1.3 supported openssl + * 00308-tls-1.3.patch +- Add patch to fix Py_Main calls after Py_initialize + * 00307-allow-to-call-Py_Main-after-Py_Initialize.patch + +------------------------------------------------------------------- +Mon Sep 3 15:22:42 UTC 2018 - MatÄ›j Cepl + +- Add -fwrapv to OPTS, which is default for python3 anyway + See for example https://github.com/zopefoundation/persistent/issues/86 + for bugs which are caused by avoiding it. + +------------------------------------------------------------------- +Tue Jul 10 11:12:32 UTC 2018 - mcepl@suse.com + +- Fix ownership of _contextvars, _queue, and _xxtestfuzz + +------------------------------------------------------------------- +Tue Jul 3 15:04:48 UTC 2018 - mcepl@suse.com + +- Switch off LTO for distros with older GCC +- Fix %files + +------------------------------------------------------------------- +Fri Jun 29 14:20:03 UTC 2018 - tchvatal@suse.com + +- Add dependency over libuuid-devel + +------------------------------------------------------------------- +Thu Jun 28 10:42:15 UTC 2018 - mimi.vx@gmail.com + +- update to python 3.7.0 + Complete overview of changes is available on + https://docs.python.org/3/whatsnew/3.7.html, these are just + highlights: + * PEP 563, postponed evaluation of type annotations. + * async and await are now reserved keywords. + * New library modules: + contextvars: PEP 567 ā€“ Context Variables + dataclasses: PEP 557 ā€“ Data Classes + importlib.resources + * New built-in features: + PEP 553, the new breakpoint() function. + * Python data model improvements: + PEP 562, customization of access to module attributes. + PEP 560, core support for typing module and generic types. + the insertion-order preservation nature of dict objects + has been declared to be an official part of the Python + language spec. + * Significant improvements in the standard library: + The asyncio module has received new features, significant + usability and performance improvements. + The time module gained support for functions with + nanosecond resolution. + * CPython implementation improvements: + Avoiding the use of ASCII as a default text encoding: + PEP 538, legacy C locale coercion + PEP 540, forced UTF-8 runtime mode + PEP 552, deterministic .pycs + the new development runtime mode + PEP 565, improved DeprecationWarning handling + * C API improvements: + PEP 539, new C API for thread-local storage + * Documentation improvements: + PEP 545, Python documentation translations + New documentation translations: Japanese, French, and Korean. +- drop python3-sorted_tar.patch +- drop 0001-allow-for-reproducible-builds-of-python-packages.patch +- refresh python-3.6.0-multilib-new.patch +- refresh subprocess-raise-timeout.patch + * new C API for thread-local storage + * Deterministic pyc files + * Built-in breakpoint() + * Data Classes + * Core support for typing module and generic types + * Customization of access to module attributes + * Postponed evaluation of annotations + * Time functions with nanosecond resolution + * Improved DeprecationWarning handling + * Context Variables + * Avoiding the use of ASCII as a default text encoding + (PEP 538, legacy C locale coercion and PEP 540, forced UTF-8 runtime mode) + * The insertion-order preservation nature of dict objects is now + an official part of the Python language spec. + * Notable performance improvements in many areas. + +------------------------------------------------------------------- +Thu May 17 18:26:42 UTC 2018 - hpj@urpla.net + +- disable lto with gcc versions below 7 (results in link failures) + +------------------------------------------------------------------- +Mon Apr 30 15:23:24 UTC 2018 - jengelh@inai.de + +- Use faster find subcommand execution strategies. + +------------------------------------------------------------------- +Fri Apr 20 16:17:29 UTC 2018 - tchvatal@suse.com + +- Do not mention the testsuite disabling in opts as it was moved to + main pkg so base is test-free + +------------------------------------------------------------------- +Tue Apr 17 08:36:08 UTC 2018 - tchvatal@suse.com + +- As we run in main python package do not generate the pre_checkin + from both now + +------------------------------------------------------------------- +Mon Apr 16 14:11:56 UTC 2018 - tchvatal@suse.com + +- Move the tests from base to generic package wrt bsc#1088573 + * We still fail the whole distro if python3 is not build + * The other archs than x86_64 took couple of hours to unblock + build of other software, this way we work around the issue +- Some tests are still run in -base for the LTO tweaking, but at + least it is not run twice + +------------------------------------------------------------------- +Sat Mar 31 19:41:12 UTC 2018 - mimi.vx@gmail.com + +- update to 3.6.5 + * bugfix release + * see Misc/NEWS for details +- drop ctypes-pass-by-value.patch +- drop fix-localeconv-encoding-for-LC_NUMERIC.patch +- refresh python-3.6.0-multilib-new.patch + +------------------------------------------------------------------ +Wed Mar 7 09:16:39 UTC 2018 - adam@mizerski.pl + +- Created %so_major and %so_minor macros +- Put Tools/gdb/libpython.py script into proper place and ship it with devel + subpackage. + +------------------------------------------------------------------- +Tue Feb 20 15:04:56 UTC 2018 - schwab@suse.de + +- ctypes-pass-by-value.patch: Fix pass by value for structs on aarch64 + +------------------------------------------------------------------- +Tue Feb 20 14:28:00 UTC 2018 - bwiedemann@suse.com + +- Add python3-sorted_tar.patch (boo#1081750) + +------------------------------------------------------------------- +Tue Feb 20 14:08:57 UTC 2018 - tchvatal@suse.com + +- Drop python3-tk and python3-idle recommends to reduce python3 + always pulling X stack bsc#1081751 + +------------------------------------------------------------------- +Wed Feb 7 09:10:03 UTC 2018 - tchvatal@suse.com + +- Add patch to fix glibc 2.27 fail bsc#1079761: + * fix-localeconv-encoding-for-LC_NUMERIC.patch + +------------------------------------------------------------------- +Mon Feb 5 17:14:43 UTC 2018 - normand@linux.vnet.ibm.com + +- Update skip_random_failing_tests.patch (for PowerPC) + to avoid test_call_later failure + +------------------------------------------------------------------- +Wed Jan 24 14:35:58 UTC 2018 - jmatejek@suse.com + +- move XML modules and python3-xml provide to python3-base + (fixes bsc#1077230) +- move ensurepip to base + +------------------------------------------------------------------- +Thu Jan 18 12:31:47 UTC 2018 - normand@linux.vnet.ibm.com + +- Add skip_random_failing_tests.patch only for PowerPC + +------------------------------------------------------------------- +Wed Jan 3 12:18:51 UTC 2018 - jmatejek@suse.com + +- update to 3.6.4 + * bugfix release, over a hundred bugs fixed + * see Misc/NEWS for details +- drop upstreamed python3-ncurses-6.0-accessors.patch +- drop PYTHONSTARTUP hooks that cause spurious startup errors + * fixes bsc#1070738 + * the relevant feature (REPL history) is now built into Python itself + +------------------------------------------------------------------- +Sat Dec 2 11:11:46 UTC 2017 - dimstar@opensuse.org + +- Install 2to3-%{python_version} executable (override defattr of + the -tools package). 2to3 (unversioned) is a symlink and does not + carry permissions (bsc#1070853). + +------------------------------------------------------------------- +Thu Nov 16 11:02:18 UTC 2017 - mimi.vx@gmail.com + +- move 2to3 to python3-tools package + +------------------------------------------------------------------- +Wed Oct 11 13:15:23 UTC 2017 - jmatejek@suse.com + +- update to 3.6.3 + * bugfix release, over a hundred bugs fixed + * see Misc/NEWS for details +- drop upstreamed 0001-3.6-bpo-30714-ALPN-changes-for-OpenSSL-1.1.0f-3093.patch + +------------------------------------------------------------------- +Wed Sep 20 09:54:05 UTC 2017 - dmueller@suse.com + +- drop python-2.7-libffi-aarch64.patch: this patches the intree + copy of libffi which is unused/deleted in the line afterwards +- fix build against system libffi: include flags weren't set + so it actually used the in-tree libffi headers. + +------------------------------------------------------------------- +Thu Sep 14 13:23:10 UTC 2017 - vcizek@suse.com + +- Fix test broken with OpenSSL 1.1 (bsc#1042670) + * add 0001-3.6-bpo-30714-ALPN-changes-for-OpenSSL-1.1.0f-3093.patch + +------------------------------------------------------------------- +Tue Sep 5 11:47:05 UTC 2017 - jengelh@inai.de + +- Update RPM group for python documentation. + +------------------------------------------------------------------- +Thu Aug 31 08:39:31 UTC 2017 - schwab@suse.de + +- fix missing %{?armsuffix} + +------------------------------------------------------------------- +Wed Aug 30 13:41:38 UTC 2017 - jmatejek@suse.com + +- distutils-reproducible-compile.patch: ensure distutils order files + before compiling, which works around bsc#1049186 + +------------------------------------------------------------------- +Thu Aug 17 08:59:05 CEST 2017 - kukuk@suse.de + +- Add libnsl-devel build requires for glibc obsoleting libnsl + +------------------------------------------------------------------- +Thu Aug 3 16:09:26 UTC 2017 - jmatejek@suse.com + +- update to 3.6.2 + * bugfix release, over a hundred bugs fixed + * see Misc/NEWS for details +- drop upstreamed test-socket-aead-kernel49.patch +- add Provides: python3-typing (fixes bsc#1050653) +- drop duplicate Provides: python3 + +------------------------------------------------------------------- +Mon Jun 26 12:10:07 UTC 2017 - jmatejek@suse.com + +- drop db-devel from requirements + +------------------------------------------------------------------- +Tue Jun 20 09:26:52 UTC 2017 - asn@cryptomilk.org + +- Add missing link to python library in config dir (bsc#1040164) + +------------------------------------------------------------------- +Thu Mar 23 12:42:59 UTC 2017 - jmatejek@suse.com + +- update to 3.6.1 + * bugfix release, over a hundred bugs fixed + * never add import location's parent directory to sys.path + * switch to git for version control, build changes related to that + * fix "failed to get random numbers" on old kernels (bsc#1029902) + * several crashes and memory leaks corrected + * f-string are no longer accepted as docstrings + +------------------------------------------------------------------- +Mon Mar 13 14:04:22 UTC 2017 - jmatejek@suse.com + +- prevent regenerating AST at build-time more robustly +- add "--without profileopt" and "--without testsuite" options to python3-base + to allow short circuiting when working on the package + +------------------------------------------------------------------- +Sat Feb 25 20:55:57 UTC 2017 - bwiedemann@suse.com + +- Add 0001-allow-for-reproducible-builds-of-python-packages.patch + upstream https://github.com/python/cpython/pull/296 + +------------------------------------------------------------------- +Wed Feb 8 12:30:20 UTC 2017 - jmatejek@suse.com + +- reenable test_socket with AEAD patch (test-socket-aead-kernel49.patch) +- reintroduce %py3_soflags macro (and better named %cpython3_soabi equivalent) + +------------------------------------------------------------------- +Wed Jan 11 14:57:07 UTC 2017 - jmatejek@suse.com + +- update to 3.6.0 + * PEP 498 Formated string literals + * PEP 515 Underscores in numeric literals + * PEP 526 Syntax for variable annotations + * PEP 525 Asynchronous generators + * PEP 530 Asynchronous comprehensions + * PEP 506 New "secrets" module for safe key generation + * less memory consumed by dicts + * dtrace and systemtap support + * improved asyncio module + * better defaults for ssl + * new hashing algorithms in hashlib + * bytecode format changed to allow more optimizations + * "async" and "await" are on track to be reserved words + * StopIteration from generators is deprecated + * support for openssl < 1.0.2 is deprecated + * os.urandom now blocks when getrandom() blocks + * huge number of new features, bugfixes and optimizations + * see https://docs.python.org/3.6/whatsnew/3.6.html for details +- rework multilib patch: drop Python-3.5.0-multilib.patch, implement + upstreamable python-3.6.0-multilib-new.patch +- refresh python-3.3.0b1-localpath.patch, subprocess-raise-timeout.patch +- drop upstreamed Python-3.5.1-fix_lru_cache_copying.patch +- finally drop python-2.6b1-canonicalize2.patch that was not applied in source + and only kept around in case we needed it in the future. (which we don't, as it seems) +- update import_failed map and baselibs +- build ctypes against system libffi + (buildrequire libffi-devel in python3-base) +- add new key to keyring (signed by keys already in keyring) +- introduced common configure section between python3 and python3-base +- moved pyconfig.h and Makefile to devel subpackage as distutils no longer + need it at runtime +- added python-rpm-macros dependency, regenerated macros file, drop macros.python3.py + because it is not used now +- improve summaries and descriptions (fixes bsc#917607) +- enabled Link-Time Optimization, see what happens +- including skipped_tests.py in pre_checkin.sh run +- run specs through spec-cleaner, rearrange sections + +------------------------------------------------------------------- +Fri Apr 22 17:20:29 UTC 2016 - jmatejek@suse.com + +- move _hashlib and _ssl modules and tests to python3-base +- recommend python3 + +------------------------------------------------------------------- +Tue Mar 15 15:05:23 UTC 2016 - schwab@suse.de + +- Skip test_asyncio under qemu_user_space_build + +------------------------------------------------------------------- +Mon Mar 7 20:38:11 UTC 2016 - toddrme2178@gmail.com + +- Add Python-3.5.1-fix_lru_cache_copying.patch + Fix copying the lru_cache() wrapper object. + Fixes deep-copying lru_cache regression, which worked on + previous versions of python but fails on python 3.5. + This fixes a bunch of packages in devel:languages:python3. + See: https://bugs.python.org/issue25447 + +------------------------------------------------------------------- +Sun Jan 24 00:44:08 UTC 2016 - arichardson.kde@gmail.com + +- Build the docs in .qch format as well + +------------------------------------------------------------------- +Wed Dec 9 07:35:20 UTC 2015 - toddrme2178@gmail.com + +- update to 3.5.1 + * bugfix-only release, dozens of bugs fixed +- Drop upstreamed Python-3.5.0-_Py_atomic_xxx-symbols.patch +- "Python3" to "Python 3" in summary + * This seems cleaner and fixes and rpmlint warning + +------------------------------------------------------------------- +Wed Oct 14 20:21:52 UTC 2015 - toddrme2178@gmail.com + +- Add Python-3.5.0-_Py_atomic_xxx-symbols.patch + This fixes a build error for many packages that use the Python, + C-API. + This patch is already accepted upstream and is slated to appear in + python 3.5.1. + +------------------------------------------------------------------- +Tue Sep 29 15:53:24 UTC 2015 - jmatejek@suse.com + +- update to 3.5.0 + * coroutines with async/await syntax + * matrix multiplication operator `@` + * unpacking generalizations + * new modules `typing` and `zipapp` + * type annotations + * .pyo files replaced by custom suffixes for optimization levels in __pycache__ + * support for memory BIO in ssl module + * performance improvements in several modules + * and many more +- removals and behavior changes + * deprecated `__version__` is removed + * support for .pyo files was removed + * system calls are auto-retried on EINTR + * bare generator expressions in function calls now cause SyntaxError + (change "f(x for x in i)" to "f((x for x in i))" to fix) + * removed undocumented `format` member of private `PyMemoryViewObject` struct + * renamed `PyMemAllocator` to `PyMemAllocatorEx` +- redefine %dynlib macro to reflect that modules now have arch+os as part of name +- module `time` is now built-in +- dropped upstreamed patches: + python-3.4.1-fix-faulthandler.patch + python-3.4.3-test-conditional-ssl.patch + python-fix-short-dh.patch (also dropped dh2048.pem required for this patch) +- updated patch Python-3.3.0b2-multilib.patch to Python-3.5.0-multilib.patch +- python-ncurses-6.0-accessors.patch taken from python 2 to fix build failure + with new gcc + ncurses + +------------------------------------------------------------------- +Wed Sep 9 11:51:22 UTC 2015 - dimstar@opensuse.org + +- Add python3-ncurses-6.0-accessors.patch: Fix build with + NCurses 6.0 and OPAQUE_WINDOW set to 1. + +------------------------------------------------------------------- +Mon Aug 24 17:02:08 UTC 2015 - jmatejek@suse.com + +- improve import_failed hook to do the right thing when invoking + missing modules with "python3 -m modulename" (boo#942751) + +------------------------------------------------------------------- +Thu Jul 23 22:08:10 UTC 2015 - fisiu@opensuse.org + +- Build with --enable-loadable-sqlite-extensions to make it works + as geospatial database. + +------------------------------------------------------------------- +Wed Jul 1 07:07:26 UTC 2015 - dimstar@opensuse.org + +- Fix source list for previous change (add dh2048.pem). + +------------------------------------------------------------------- +Wed Jun 24 06:54:30 UTC 2015 - meissner@suse.com + +- dh2048.pem: added generated 2048 dh parameter set to fix + ssl test (bsc#935856) +- python-fix-short-dh.patch: replace the 512 bits dh parameter set + by 2048 bits to fix build with new openssl 1.0.2c (bsc#935856) + +------------------------------------------------------------------- +Tue May 19 14:59:30 UTC 2015 - schwab@suse.de + +- ctypes-libffi-aarch64.patch: remove upstreamed patch +- python-2.7-libffi-aarch64.patch: Fix argument passing in libffi for + aarch64 + +------------------------------------------------------------------- +Thu May 14 10:58:36 UTC 2015 - jmatejek@suse.com + +- drop the PDF subpackage + (removes the massive texlive dependency, and most likely nobody is + using the PDFs anyway) + +------------------------------------------------------------------- +Thu May 14 09:53:29 UTC 2015 - jmatejek@suse.com + +- python-3.4.3-test-conditional-ssl.patch - restore tests failing because + test_urllib was unconditionally importing ssl (without really needing it) +- restore functionality of multilib patch +- drop libffi-ppc64le.diff because upstream completely changed everything + yet again (sorry ppc64 folks :| ) + + +------------------------------------------------------------------- +Fri May 1 15:11:21 UTC 2015 - mailaender@opensuse.org + +- Update to version 3.4.3 +- Drop upstreamed CVE-2014-4650-CGIHTTPServer-traversal.patch + (bpo#21766) + +------------------------------------------------------------------- +Wed Mar 25 10:57:28 UTC 2015 - rguenther@suse.com + +- Add python-3.4.1-fix-faulthandler.patch, upstream patch for bogus + faulthandler which fails with GCC 5. + +------------------------------------------------------------------- +Sun Jan 11 13:01:30 UTC 2015 - p.drouand@gmail.com + +- asyncio has been merged in python3 main package; provide and + obsolete it +- Remove obsolete AUTHORS section +- Remove redundant %clean section + +------------------------------------------------------------------- +Sat Oct 18 20:14:54 UTC 2014 - crrodriguez@opensuse.org + +- Only pkgconfig(x11) is required for build, not the whole + set of packages provided by xorg-x11-devel metapackage. + +------------------------------------------------------------------- +Mon Oct 13 13:38:20 UTC 2014 - jmatejek@suse.com + +- add %python3_version rpm macro for Fedora compatibility +- add missing argument in import_failed, rename Novell Bugzilla + to SUSE Bugzilla + +------------------------------------------------------------------- +Thu Jul 31 17:24:59 UTC 2014 - dimstar@opensuse.org + +- Rename rpmlintrc to %{name}-rpmlintrc. + Follow the packaging guidelines. + +------------------------------------------------------------------- +Wed Jul 23 16:31:02 UTC 2014 - jmatejek@suse.com + +- CVE-2014-4650-CGIHTTPServer-traversal.patch: CGIHTTPServer file + disclosure and directory traversal through URL-encoded characters + (CVE-2014-4650, bnc#885882) + +------------------------------------------------------------------- +Tue Jul 22 13:55:57 UTC 2014 - jmatejek@suse.com + +- drop python-3.4.1-SUSE-ensurepip.patch for compatibility reasons, + reinstate bundled copies of pip and setuptools + (fixes bnc#885662) +- add more files as sources to silence the validator + +------------------------------------------------------------------- +Wed May 21 11:01:56 UTC 2014 - jmatejek@suse.com + +- update to 3.4.1 + * bugfix-only release, over 300 bugs fixed +- drop upstreamed python-3.4.0rc2-sqlite-3.8.4-tests.patch +- drop upstreamed CVE-2014-2667-mkdir.patch +- include Python release manager keyring and signature file + for the source archive (thus renumbering of source files) + (see https://www.python.org/download/#openpgp-public-keys ) +- move ensurepip to python3, because it transitively requires ssl + +------------------------------------------------------------------- +Fri Apr 4 16:21:40 UTC 2014 - jmatejek@suse.com + +- CVE-2014-2667-mkdir.patch: race condition with reseting umask + in os.makedirs + (CVE-2014-2667, bnc#871152) +- updated multilib patch to include ~/.local/lib64 (bnc#637176) + +------------------------------------------------------------------- +Wed Mar 26 15:24:46 UTC 2014 - jmatejek@suse.com + +- raise timeout value for test_subprocess to 10s (might fix + intermittent build failures in OBS) + +------------------------------------------------------------------- +Mon Mar 24 17:29:31 UTC 2014 - dmueller@suse.com + +- remove blacklisting of test_posix on aarch64: qemu bug is fixed + +------------------------------------------------------------------- +Mon Mar 17 18:26:58 UTC 2014 - jmatejek@suse.com + +- update to 3.4.0 final +- drop upstreamed python-3.4rc2-importlib.patch + +------------------------------------------------------------------- +Sun Mar 16 16:33:25 UTC 2014 - schwab@suse.de + +- Only build with profile-opt if profiling is enabled +- Update test exclusion lists: + * test_ctypes no longer fails on arm + * test_io no longer fails on ppc* + * test_multiprocessing has been split in multiple tests + * test_posix and test_signal fail due to qemu bugs + +------------------------------------------------------------------- +Fri Mar 14 20:26:03 UTC 2014 - andreas.stieger@gmx.de + +- Fix build with SQLite 3.8.4 [bnc#867887], fixing SQLite tests, + adding python-2.7.6-sqlite-3.8.4-tests.patch + +------------------------------------------------------------------- +Thu Feb 27 14:08:40 UTC 2014 - jmatejek@suse.com + +- update to 3.4.0 rc2 + * pre-release bugfixes + * improvements to asyncio library +- drop upstreamed tracemalloc_gcov.patch +- python-3.4rc2-importlib.patch fixes backwards-incompatibility + in the reworked importlib module that blocks build of vim + +------------------------------------------------------------------- +Fri Jan 17 18:45:27 UTC 2014 - jmatejek@suse.com + +- initial commit of 3.4.0 beta 3 + * new stdlib modules: pathlib, enum, statistics, tracemalloc + * asynchronous IO with new asyncio module + * introspection data for builtins + * subprocesses no longer inherit open file descriptors + * standardized metadata for packages + * internal hashing changed to SipHash + * new pickle protocol + * improved handling of codecs + * TLS 1.2 support + * major speed improvements for internal unicode handling + * many bugfixes and optimizations +- see porting guide at: + http://docs.python.org/3.4/whatsnew/3.4.html#porting-to-python-3-4 +- moved several modules to -testsuite subpackage +- updated list of binary extensions, refreshed patches +- tracemalloc_gcov.patch fixes profile-based optimization build +- updated packages and pre_checkin.sh to use ~-version notation + for prereleases +- fix-shebangs part of build process moved to common %prep +- drop python-3.3.2-no-REUSEPORT.patch (upstreamed) +- update baselibs for new soname + +- TODOs: + * require python-pip, make ensurepip work with zypper + +------------------------------------------------------------------- +Wed Dec 4 13:21:26 UTC 2013 - matz@suse.de + +- add ppc64le (ELFv2) support for libffi copy for ctypes module +- Adjust Python-3.3.0b2-multilib.patch for ppc64le (make sys.lib be + "lib64"). +- added patches: + * libffi-ppc64le.diff +------------------------------------------------------------------- +Tue Dec 3 09:51:43 UTC 2013 - adrian@suse.de + +- add ppc64le rules + +------------------------------------------------------------------- +Fri Nov 22 13:17:23 UTC 2013 - speilicke@suse.com + +- Add python-3.3.3-skip-distutils-test_sysconfig_module.patch: + + Disable global and distutils sysconfig comparison test, we deviate + from the default depending on optflags + +------------------------------------------------------------------- +Tue Nov 19 14:28:41 UTC 2013 - jmatejek@suse.com + +- update to 3.3.3 + * bugfix-only release + * many SSL-related fixes + * upstream fix for CVE-2013-4238 + * upstream fixes for CVE-2013-1752 +- move example module xxlimited to python3-testsuite +- drop CVE-2013-4238_py33.patch - it is upstreamed +- remove --with-wide-unicode config option, it is now the default + (and only) choice +- don't touch anything between make and makeinstall +- drop python-3.2b2-buildtime-generate.patch - the issue was caused + by touching things between make and makeinstall +- link pycache entries for import_failed hooks properly + +------------------------------------------------------------------- +Tue Oct 15 17:44:08 UTC 2013 - crrodriguez@opensuse.org + +- build with -DOPENSSL_LOAD_CONF for the same reasons + described in the python2 package. + +------------------------------------------------------------------- +Fri Aug 16 11:35:15 UTC 2013 - jmatejek@suse.com + +- handle NULL bytes in certain fields of SSL certificates + (CVE-2013-4238, bnc#834601) + +------------------------------------------------------------------- +Thu Aug 8 14:54:49 UTC 2013 - dvaleev@suse.com + +- Exclue test_faulthandler from tests on powerpc due to bnc#831629 + +------------------------------------------------------------------- +Thu Jun 13 15:05:34 UTC 2013 - jmatejek@suse.com + +- update to 3.3.2 + * bugfix-only release + * fixes several regressions introduced in 3.3.1 +- switch to xz compression +- move _lzma module to python3-base +- python-3.3.2-no-REUSEPORT.patch to fix build on kernels without SO_REUSEPORT + +------------------------------------------------------------------- +Mon Apr 29 22:32:43 UTC 2013 - schwab@suse.de + +- Readd missing bits from ctypes-libffi-aarch64.patch + +------------------------------------------------------------------- +Sat Apr 13 07:56:51 UTC 2013 - idonmez@suse.com + +- Update to version 3.3.1 + * Fix the ā€“enable-profiling configure switch. + * In IDLE, close the replace dialog after it is used. +- Too many bugfixes to list here, + see See http://hg.python.org/cpython/file/v3.3.0/Misc/NEWS +- Refresh Python-3.3.0b2-multilib.patch +- Refresh python-3.2b2-buildtime-generate.patch +- Drop upstream patches: ctypes-libffi-aarch64.patch, + python-3.2.3rc2-pypirc-secure.patch, python-3.3.0-getdents64.patch + +------------------------------------------------------------------- +Mon Apr 8 11:25:30 UTC 2013 - speilicke@suse.com + +- Exclude sqlite/test and tk/test directories from the respective + sub-packages. These are owned by the testsuite sub-package already + +------------------------------------------------------------------- +Fri Apr 5 12:59:20 UTC 2013 - idonmez@suse.com + +- Add Source URL, see https://en.opensuse.org/title=SourceUrls + +------------------------------------------------------------------- +Wed Apr 3 15:36:04 UTC 2013 - jmatejek@suse.com + +- remove spurious modification of python-3.3.0b1-localpath.patch + that would force installation into /usr/local. + this fixes bnc#809831 + +------------------------------------------------------------------- +Thu Mar 28 18:38:51 UTC 2013 - jmatejek@suse.com + +- replace broken movetogetdents64.diff patch with a correct one + from upstream repo (python-3.3.0-getdents64.patch) + +------------------------------------------------------------------- +Fri Mar 1 07:42:21 UTC 2013 - dmueller@suse.com + +- add ctypes-libffi-aarch64.patch: + * import aarch64 support for libffi in _ctypes module +- add aarch64 to the list of lib64 based archs +- add movetogetdents64.diff: + * port to getdents64, as SYS_getdents is not implemented everywhere + +------------------------------------------------------------------- +Tue Feb 26 08:57:55 UTC 2013 - saschpe@suse.de + +- /etc/rpm/macros.python3 is no %config, it is not meant to be changed + by users. +- Add rpmlintrc with some obvious filters + +------------------------------------------------------------------- +Mon Jan 28 18:14:39 UTC 2013 - jmatejek@suse.com + +- update baselibs for new version of libpython3 + +------------------------------------------------------------------- +Thu Nov 29 17:02:37 UTC 2012 - jmatejek@suse.com + +- fix include path in macros (bnc#787526) +- implement failed import handlers for modules that live in + subpackages - e.g. "import ssl" will now throw a sensible error + message telling you to install "python3" + +------------------------------------------------------------------- +Wed Nov 28 17:02:07 UTC 2012 - jmatejek@suse.com + +- merge python3-xml into python3 +- merge python3-2to3 library into python3-base + and the 2to3 binary into python3-devel + (python3-devel is now in conflict with python-2to3, which + will be dropped) +- enable --with-system-expat for python3, making the xml modules + (and thus python3) depend on expat +- reconfigure tests to disable network and GUI resources, which + the upstream apparently thought is a good idea to enable by default. + this fixes build failures in Factory +- add lzma-devel to build the _lzma module +- moved %dynlib macro definition to common section + +------------------------------------------------------------------- +Mon Nov 5 20:01:46 UTC 2012 - coolo@suse.com + +- buildrequire timezone for the test suite + +------------------------------------------------------------------- +Mon Oct 29 18:21:45 UTC 2012 - dmueller@suse.com + +- disable more checks for qemu builds as they use syscalls not + implemented yet + +------------------------------------------------------------------- +Thu Oct 25 08:14:36 UTC 2012 - Rene.vanPaassen@gmail.com + +- exclude test_math for SLE 11; math library fails on negative + gamma function values close to integers and 0, probably + due to imprecision in -lm on SLE_11_SP2. + +------------------------------------------------------------------- +Tue Oct 16 12:15:34 UTC 2012 - coolo@suse.com + +- buildrequire libbz2-devel explicitly + +------------------------------------------------------------------- +Mon Oct 8 14:33:08 UTC 2012 - jmatejek@suse.com + +- remove distutils.cfg (bnc#658604) + * this changes default prefix for distutils to /usr + * see ML for details: +http://lists.opensuse.org/opensuse-packaging/2012-09/msg00254.html + +------------------------------------------------------------------- +Mon Oct 1 08:53:03 UTC 2012 - idonmez@suse.com + +- Update to final 3.3.0 release + * See http://hg.python.org/cpython/file/v3.3.0/Misc/NEWS + +------------------------------------------------------------------- +Thu Sep 27 12:35:01 UTC 2012 - idonmez@suse.com + +- Correct dependency for python3-testsuite, + python3-tkinter -> python3-tk + +------------------------------------------------------------------- +Thu Aug 23 13:08:11 UTC 2012 - jmatejek@suse.com + +- update to 3.3.0 RC1 + +------------------------------------------------------------------- +Fri Aug 3 12:09:34 UTC 2012 - jmatejek@suse.com + +- update to 3.3.0 beta 1 + * flexible string representation, no longer distinguishing + between wide and narrow Unicode builds + * importlib-based import system + * virtualenv support in core + * namespace packages + * explicit Unicode literals for easier porting + * key-sharing dict implementation reduces memory footprint + of OO code + * hash randomization on by default + * many other new bugfixes and features, check NEWS for details + +- pre_checkin.sh now autofills various version strings in specs +- ship hashlib's fallback modules - those uselessly take up space + when real _hashlib.so from python3 is present, but the space wasted + is only 114kB and it provides python3-base with a working hashlib + module. + (also, this fixes bnc#743787) + +------------------------------------------------------------------- +Fri Jul 27 09:02:41 UTC 2012 - dvaleev@suse.com + +- skip test_io on ppc +- drop test_io ppc patch + +------------------------------------------------------------------- +Thu Jun 28 07:57:58 UTC 2012 - saschpe@suse.de + +- Satisfy source_validator by uncommenting an otherwise unused "Patch" + line + +------------------------------------------------------------------- +Tue Jun 12 15:39:08 UTC 2012 - adrian@suse.de + +- fix logic of checks exclusion + +------------------------------------------------------------------- +Fri May 18 11:50:27 UTC 2012 - idonmez@suse.com + +- update to 3.2.3 + * No changes since rc2 + +------------------------------------------------------------------- +Thu Mar 29 15:44:33 UTC 2012 - jmatejek@suse.com + +- update to 3.2.3rc2 + * fixes several security issues: + * CVE-2012-0845, bnc#747125 + * CVE-2012-1150, bnc#751718 + * CVE-2011-4944, bnc#754447 + * CVE-2011-3389, bnc#754677 +- fix for insecure .pypirc (CVE-2011-4944, bnc#754447) +- disable test_gdb because it is broken by our gdb + +------------------------------------------------------------------- +Thu Feb 16 12:33:12 UTC 2012 - dvaleev@suse.com + +- skip broken test_io test on ppc + +------------------------------------------------------------------- +Wed Jan 18 15:49:47 UTC 2012 - jmatejek@suse.com + +- update to 3.2.2 + * bugfix-only release + * reports "linux2" as sys.platform regardless of Linux kernel +- added pre_checkin.sh to copy common spec sections to python3.spec +- added PACKAGING-NOTES with some helpful info for packagers + +------------------------------------------------------------------- +Sun Dec 25 13:25:01 UTC 2011 - idonmez@suse.com + +- Use system ffi, included one is broken see + http://bugs.python.org/issue11729 and + http://bugs.python.org/issue12081 + +------------------------------------------------------------------- +Fri Dec 9 17:19:55 UTC 2011 - jmatejek@suse.com + +- license.opensuse.org-compatible license headers + +------------------------------------------------------------------- +Fri Dec 2 16:46:44 UTC 2011 - coolo@suse.com + +- add automake as buildrequire to avoid implicit dependency + +------------------------------------------------------------------- +Thu Nov 24 12:42:25 UTC 2011 - agraf@suse.com + +- fix ARM build (exclude some test cases which break for us) + +------------------------------------------------------------------- +Tue Aug 16 17:02:22 UTC 2011 - termim@gmail.com + +- use sysconfig module to get py3_incdir, py3_abiflags, + py3_soflags, python3_sitelib and python3_sitearch + +------------------------------------------------------------------- +Mon Jul 18 16:22:31 UTC 2011 - jmatejek@novell.com + +- update to 3.2.1 + * bugfix-only release, no major changes +- fix build on linux3 platform +- remove upstreamed pybench patch +- install /usr/lib directories in all cases to prevent spurious + "directory not owned" in dependent packages + +------------------------------------------------------------------- +Wed Jun 15 14:16:38 UTC 2011 - jmatejek@novell.com + +- replaced dynamic so version with manual so version, because + autobuild does not support autogeneration + +------------------------------------------------------------------- +Tue May 24 13:39:06 UTC 2011 - jmatejek@novell.com + +- generate macros.python3 at compile-time with fixed values +- don't include bogus values in pyconfig.h, as they can break + third-party packages (bnc#673071) + +------------------------------------------------------------------- +Tue May 17 12:52:51 UTC 2011 - jmatejek@novell.com + +- added Obsoletes: python3 < 3.1 so that the transition from + non-split to split packages goes smoothly + +------------------------------------------------------------------- +Fri May 13 12:38:19 UTC 2011 - jmatejek@novell.com + +- fixed RPM macros to use python3 instead of python +- updated to build --with-wide-unicode (for compatibility with + fedora and our own python 2.x series) + +------------------------------------------------------------------- +Thu Apr 21 03:39:25 UTC 2011 - termim@gmail.com + +- fix python3-base build failure due to pybench.py crash by + python-3.2-pybench.patch +- move pyconfig.h from python3-devel to python3-base package to + make python3-base functional again + +------------------------------------------------------------------- +Wed Mar 23 04:26:28 UTC 2011 - termim@gmail.com + +- update to python 3.2 + * stable ABI, ABI-tagged .so files + * concurrent.futures and many other new or upgraded modules + * PYC repository directories ( __pycache__ ) + * python WSGI 1.0.1 + * Unicode 6.0.0 support + * a great number of bugfixes and assorted improvements + +------------------------------------------------------------------- +Tue Feb 8 19:42:17 CET 2011 - matejcik@suse.cz + +- update to python 3.2 RC2 +- renamed python3-demo to python3-tools, because the demo part + became much smaller than the tools part +- added rpm macros + +------------------------------------------------------------------- +Tue Jan 18 14:13:04 UTC 2011 - jmatejek@novell.com + +- update to python 3.2 beta 2, see NEWS for details +- split off -base package with less dependencies, and a shlib-policy + compliant libpython3 package +- mostly rewritten the spec file with more detailed comments +- cleaned up lists of patches + diff --git a/python38.spec b/python38.spec new file mode 100644 index 0000000..be30d99 --- /dev/null +++ b/python38.spec @@ -0,0 +1,975 @@ +# +# spec file for package python38 +# +# Copyright (c) 2020 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%global flavor @BUILD_FLAVOR@%{nil} +%if "%{flavor}" == "doc" +%define psuffix -documentation +%bcond_without doc +%bcond_with base +%bcond_with general +%endif +%if "%{flavor}" == "base" +%define psuffix -core +%bcond_with doc +%bcond_without base +%bcond_with general +%endif +%if "%{flavor}" == "" +%define psuffix %{nil} +%bcond_with doc +%bcond_with base +%bcond_without general +%endif +%define _version %(c=%{version}; echo ${c/[a-z]*/}) +%define tar_suffix %(c=%{_version}; echo ${c#%{_version}}) +%define python_version %(c=%{_version}; echo ${c:0:3}) +# the versions are autogenerated from pre_checkin.sh +# based on the current source tarball +%define python_version_abitag %(c=%{python_version}; echo ${c//./}) +# FIXME %%define python_version_soname %%(c=%%{python_version}; echo ${c//./_}) +%define python_version_soname 3_8 +%if 0%(test -n "%{tar_suffix}" && echo 1) +%define _version %(echo "%{_version}~%{tar_suffix}") +%define tarversion %{version} +%else +%define tarversion %{version} +%endif +%define python_pkg_name python38 +# Will provide the pyton3-* provides +# Will do the /usr/bin/python3 and all the core links +%define primary_interpreter 1 +%define folderversion %{tarversion} +%define tarname Python-%{tarversion} +%define sitedir %{_libdir}/python%{python_version} +# three possible ABI kinds: m - pymalloc, d - debug build; see PEP 3149 +%define abi_kind %{nil} +# python ABI version - used in some file names +%define python_abi %{python_version}%{abi_kind} +# soname ABI tag defined in PEP 3149 +%define abi_tag %{python_version_abitag}%{abi_kind} +# version part of "libpython" package +%define so_major 1 +%define so_minor 0 +%define so_version %{python_version_soname}%{abi_kind}-%{so_major}_%{so_minor} +# rpm and python have different ideas about what is an arch-dependent name, so: +%if %{__isa_name} == ppc +%define archname %(echo %{_arch} | sed s/ppc/powerpc/) +%else +%define archname %{_arch} +%endif +# our arm has Hardware-Floatingpoint +%if %{_arch} == arm +%define armsuffix hf +%endif +# pyexpat.cpython-35m-x86_64-linux-gnu +# pyexpat.cpython-35m-powerpc64le-linux-gnu +# pyexpat.cpython-35m-armv7-linux-gnueabihf +# _md5.cpython-38m-x86_64-linux-gnu.so +%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so +%if 0%{?qemu_user_space_build} +%bcond_with profileopt +%else +%bcond_without profileopt +%endif +Name: %{python_pkg_name}%{psuffix} +Version: 3.8.3 +Release: 0 +Summary: Python 3 Interpreter +License: Python-2.0 +URL: https://www.python.org/ +Source0: http://www.python.org/ftp/python/%{folderversion}/%{tarname}.tar.xz +Source1: http://www.python.org/ftp/python/%{folderversion}/%{tarname}.tar.xz.asc +Source2: baselibs.conf +Source3: README.SUSE +Source7: macros.python3 +Source8: import_failed.py +Source9: import_failed.map +Source10: pre_checkin.sh +Source11: skipped_tests.py +Source19: idle3.desktop +Source20: idle3.appdata.xml +Source99: python.keyring +# The following files are not used in the build. +# They are listed here to work around missing functionality in rpmbuild, +# which would otherwise exclude them from distributed src.rpm files. +Source100: PACKAGING-NOTES +# First series of patches supportin lib-vs-lib64 distinction +# PATCH-FEATURE-UPSTREAM F00102-lib64.patch bsc#[0-9]+ mcepl@suse.com +# Change the various install paths to use /usr/lib64/ instead or /usr/lib/ +Patch01: F00102-lib64.patch +# PATCH-FEATURE-UPSTREAM F00251-change-user-install-location.patch bsc#[0-9]+ mcepl@suse.com +# Fix installation in /usr/local (boo#1071941), originally from Fedora +# https://src.fedoraproject.org/rpms/python3/blob/master/f/00251-change-user-install-location.patch +# Set values of prefix and exec_prefix in distutils install command +# to /usr/local if executable is /usr/bin/python* and RPM build +# is not detected to make pip and distutils install into separate location +Patch02: F00251-change-user-install-location.patch +# PATCH-FEATURE-UPSTREAM SUSE-FEDORA-multilib.patch bsc#[0-9]+ mcepl@suse.com +# Add support for platlib variable +Patch03: SUSE-FEDORA-multilib.patch +# PATCH-FIX-OPENSUSE OBS_dev-shm.patch bpo#38377 mcepl@suse.com +# _multiprocessing.SemLock depends on proper /dev/shm which is not available in OBS +Patch04: OBS_dev-shm.patch +# +# PATCH-FEATURE-UPSTREAM distutils-reproducible-compile.patch gh#python/cpython#8057 mcepl@suse.com +# Improve reproduceability +Patch06: distutils-reproducible-compile.patch +# support finding packages in /usr/local, install to /usr/local by default +Patch07: python-3.3.0b1-localpath.patch +# replace DATE, TIME and COMPILER by fixed definitions to aid reproducible builds +Patch08: python-3.3.0b1-fix_date_time_compiler.patch +# POSIX_FADV_WILLNEED throws EINVAL. Use a different constant in test +Patch09: python-3.3.0b1-test-posix_fadvise.patch +# Raise timeout value for test_subprocess +Patch15: subprocess-raise-timeout.patch +# skip some tests only for PowerPC +Patch23: skip_random_failing_tests.patch +# Fix SOURCE_DATE_EPOCH problems (bpo#34022, bpo#29708) +# gh#python/cpython#10775 gh#python/cpython#10327 +Patch24: bpo34022-stop_hash-based_invalidation_w_SOURCE_DATE_EPOCH.patch +Patch25: python3-imp-returntype.patch +# PATCH-FIX-UPSTREAM CVE-2019-5010-null-defer-x509-cert-DOS.patch bnc#1122191 mcepl@suse.com +# https://github.com/python/cpython/pull/11569 +# Fix segfault in ssl's cert parser +Patch27: CVE-2019-5010-null-defer-x509-cert-DOS.patch +# PATCH-FIX-UPSTREAM bpo36302-sort-module-sources.patch bsc#1041090 bwiedemann@suse.com +# Sort list of sources to have stable order in the compiled .so library. +Patch28: bpo36302-sort-module-sources.patch +# PATCH-FEATURE-UPSTREAM bpo-31046_ensurepip_honours_prefix.patch bpo#31046 mcepl@suse.com +# ensurepip should honour the value of $(prefix) +Patch29: bpo-31046_ensurepip_honours_prefix.patch +# PATCH-FIX-UPSTREAM bsc1167501-invalid-alignment.patch gh#python/cpython#19133 mcepl@suse.com +# Fix wrong misalignment of pointer to vectorcallfunc +Patch31: bsc1167501-invalid-alignment.patch +# PATCH-FIX-UPSTREAM bpo40784-Fix-sqlite3-deterministic-test.patch bpo#40784 Andreas.Stieger@gmx.de +# Fix tests with SQLite 3.32 +Patch32: bpo40784-Fix-sqlite3-deterministic-test.patch +BuildRequires: automake +BuildRequires: fdupes +BuildRequires: gmp-devel +BuildRequires: lzma-devel +BuildRequires: netcfg +BuildRequires: openssl-devel +BuildRequires: pkgconfig +BuildRequires: timezone +BuildRequires: xz +BuildRequires: pkgconfig(bzip2) +BuildRequires: pkgconfig(expat) +BuildRequires: pkgconfig(libffi) +BuildRequires: pkgconfig(uuid) +BuildRequires: pkgconfig(zlib) +#!BuildIgnore: gdk-pixbuf-loader-rsvg +%if 0%{?suse_version} >= 1500 +BuildRequires: pkgconfig(libnsl) +BuildRequires: pkgconfig(libtirpc) +%endif +%if %{with doc} +# Here we just run sphinx and we can use generic one, we don't need +# the flavor variant +BuildRequires: python3-Sphinx < 3.0 +BuildRequires: python3-python-docs-theme +BuildRequires: python3-sphinxcontrib-qthelp >= 1.0.2 +%endif +%if %{with general} +# required for idle3 (.desktop and .appdata.xml files) +BuildRequires: appstream-glib +BuildRequires: gcc-c++ +BuildRequires: gdbm-devel +BuildRequires: gettext +BuildRequires: readline-devel +BuildRequires: sqlite-devel +BuildRequires: update-desktop-files +BuildRequires: pkgconfig(ncurses) +BuildRequires: pkgconfig(tk) +BuildRequires: pkgconfig(x11) +Requires: %{python_pkg_name}-base = %{version} +Recommends: %{python_pkg_name}-curses +Recommends: %{python_pkg_name}-dbm +Recommends: %{python_pkg_name}-pip +Provides: python = %{python_version} +%if %{primary_interpreter} +Provides: python3 = %{python-version} +%endif +%endif + +%description +Python 3 is modern interpreted, object-oriented programming language, +often compared to Tcl, Perl, Scheme, or Java. You can find an overview +of Python in the documentation and tutorials included in the python3-doc +package. + +This package supplies rich command line features provided by readline, +and sqlite3 support for the interpreter core, thus forming a so called +"extended" runtime. +Installing "python3" is sufficient for the vast majority of usecases. +In addition, recommended packages provide UI toolkit support (python3-curses, +python3-tk), legacy UNIX database bindings (python3-dbm), and the IDLE +development environment (python3-idle). + +%package -n %{python_pkg_name}-tk +Summary: TkInter, a Python Tk Interface +Requires: %{python_pkg_name} = %{version} +%if %{primary_interpreter} +Provides: python3-tk = %{version} +%endif + +%description -n %{python_pkg_name}-tk +Python interface to Tk. Tk is the GUI toolkit that comes with Tcl. + +%package -n %{python_pkg_name}-curses +Summary: Python Interface to the (N)Curses Library +Requires: %{python_pkg_name} = %{version} +%if %{primary_interpreter} +Provides: python3-curses +%endif + +%description -n %{python_pkg_name}-curses +An easy to use interface to the (n)curses CUI library. CUI stands for +Console User Interface. + +%package -n %{python_pkg_name}-dbm +Summary: Python Interface to the GDBM Library +Requires: %{python_pkg_name} = %{version} +%if %{primary_interpreter} +Provides: python3-dbm +%endif + +%description -n %{python_pkg_name}-dbm +An easy to use interface for Unix DBM databases, and more specifically, +the GNU implementation GDBM. + +%package -n %{python_pkg_name}-idle +Summary: An Integrated Development Environment for Python +Requires: %{python_pkg_name} = %{version} +Requires: %{python_pkg_name}-tk +%if %{primary_interpreter} +Provides: python3-idle = %{version} +%endif + +%description -n %{python_pkg_name}-idle +IDLE is a Tkinter based integrated development environment for Python. +It features a multi-window text editor with multiple undo, Python +colorizing, and many other things, as well as a Python shell window and +a debugger. + +%package -n %{python_pkg_name}-doc +Summary: Package Documentation for Python 3 +Enhances: %{python_pkg_name} = %{python_version} + +%description -n %{python_pkg_name}-doc +Tutorial, Global Module Index, Language Reference, Library Reference, +Extending and Embedding Reference, Python/C API Reference, Documenting +Python, and Macintosh Module Reference in HTML format. + +%package -n %{python_pkg_name}-doc-devhelp +Summary: Additional Package Documentation for Python 3 in devhelp format + +%description -n %{python_pkg_name}-doc-devhelp +Tutorial, Global Module Index, Language Reference, Library Reference, +Extending and Embedding Reference, Python/C API Reference, Documenting +Python, and Macintosh Module Reference in format for devhelp. + +%package -n %{python_pkg_name}-base +Summary: Python 3 Interpreter and Stdlib Core +Requires: libpython%{so_version} = %{version} +Requires: python-rpm-macros +Recommends: %{python_pkg_name} = %{version} +#Recommends: python3-ensurepip +# python 3.1 didn't have a separate python-base, so it is wrongly +# not a conflict to have python3-3.1 and python3-base > 3.1 +Obsoletes: python3 < 3.2 +# no Provides, because python3 is obviously provided by package python3 +# python 3.4 provides asyncio +Provides: %{python_pkg_name}-asyncio = %{version} +# python 3.6 provides typing +Provides: %{python_pkg_name}-typing = %{version} +# python3-xml was merged into python3, now moved into -base +Provides: %{python_pkg_name}-xml = %{version} +# python-importlib-metadata was specifical project which was merged into 3.8 +Provides: %{python_pkg_name}-importlib-metadata = %{version} +# python-importlib_resources is a backport of 3.7 behaviour into older pythons +Provides: %{python_pkg_name}-importlib_resources = %{version} +%if %{primary_interpreter} +Provides: python3-base = %{version} +Provides: python3-asyncio = %{version} +Obsoletes: python3-asyncio < %{version} +Provides: python3-typing = %{version} +Obsoletes: python3-typing < %{version} +Provides: python3-xml = %{version} +Obsoletes: python3-xml < %{version} +Provides: python3-importlib-metadata = %{version} +Obsoletes: python3-importlib-metadata < %{version} +Provides: python3-importlib_resources = %{version} +Obsoletes: python3-importlib_resources < %{version} +%endif + +%description -n %{python_pkg_name}-base +Python is an interpreted, object-oriented programming language, and is +often compared to Tcl, Perl, Scheme, or Java. You can find an overview +of Python in the documentation and tutorials included in the python-doc +package. + +This package contains the interpreter core and most commonly used modules +from the standard library. This is sufficient for many usecases, but it +excludes components that depend on external libraries, most notably XML, +database and UI toolkits support. + +%package -n %{python_pkg_name}-tools +Summary: Python Utility and Demonstration Scripts +Requires: %{python_pkg_name}-base = %{version} +Provides: %{python_pkg_name}-demo = %{version} +Provides: %{python_pkg_name}-2to3 = %{version} +%if %{primary_interpreter} +Provides: pytohn3-tools = %{version} +Provides: python3-demo = %{version} +Provides: python3-2to3 = %{version} +Obsoletes: python3-demo < %{version} +Obsoletes: python3-2to3 < %{version} +%endif + +%description -n %{python_pkg_name}-tools +A number of scripts that are useful for building, testing or extending Python, +and a set of demonstration programs. + +%package -n %{python_pkg_name}-devel +Summary: Include Files and Libraries Mandatory for Building Python Modules +Requires: %{python_pkg_name}-base = %{version} +%if %{primary_interpreter} +Provides: python3-devel = %{version} +%endif + +%description -n %{python_pkg_name}-devel +The Python programming language's interpreter can be extended with +dynamically loaded extensions and can be embedded in other programs. + +This package contains header files, a static library, and development +tools for building Python modules, extending the Python interpreter or +embedding Python in applications. + +This also includes the Python distutils, which were in the Python +package up to version 2.2.2. + +%package -n %{python_pkg_name}-testsuite +Summary: Unit tests for Python and its standard library +Requires: %{python_pkg_name} = %{version} +Requires: %{python_pkg_name}-tk = %{version} +%if %{primary_interpreter} +Provides: pytohn3-testsuite = %{version} +%endif + +%description -n %{python_pkg_name}-testsuite +Unit tests that are useful for verifying integrity and functionality +of the installed Python interpreter and standard library. +They are a documented part of stdlib, as a module 'test'. + +%package -n libpython%{so_version} +Summary: Python Interpreter shared library +Requires: %{python_pkg_name}-base >= %{version} + +%description -n libpython%{so_version} +Python is an interpreted, object-oriented programming language, and is +often compared to Tcl, Perl, Scheme, or Java. You can find an overview +of Python in the documentation and tutorials included in the python-doc +(HTML) or python-doc-pdf (PDF) packages. + +This package contains libpython3.2 shared library for embedding in +other applications. + +%prep +%setup -q -n %{tarname} +%if "%{_lib}" == "lib64" +%patch01 -p1 +%endif +%patch02 -p1 +%if "%{_lib}" == "lib64" +%patch03 -p1 +%endif + +%patch04 -p1 +%patch06 -p1 +%patch07 -p1 +%patch08 -p1 +%patch09 -p1 +# %%patch12 -p1 +%patch15 -p1 +%ifarch ppc ppc64 ppc64le +%patch23 -p1 +%endif +%patch24 -p1 +%patch25 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch31 -p1 +%patch32 -p1 + +# drop Autoconf version requirement +sed -i 's/^AC_PREREQ/dnl AC_PREREQ/' configure.ac + +# fix shebangs - convert /usr/local/bin/python and /usr/bin/env/python to /usr/bin/python3 +for dir in Lib Tools; do + # find *.py, filter to files that contain bad shebangs + # break up "/""usr" like this to prevent replacing with %%{_prefix} + find $dir -name '*.py' -type f -print0 \ + | xargs -0 grep -lE '^#! *(/''usr/.*bin/(env +)?)?python' \ + | xargs sed -r -i -e '1s@^#![[:space:]]*(/''usr/(local/)?bin/(env +)?)?python([0-9]+(\.[0-9]+)?)?@#!%{_bindir}/python3@' +done + +# drop in-tree libffi and expat +rm -r Modules/_ctypes/libffi* Modules/_ctypes/darwin +rm -r Modules/expat + +# drop duplicate README from site-packages +rm Lib/site-packages/README.txt + +%build +%if %{with doc} +TODAY_DATE=`date -r %{SOURCE0} "+%%B %%d, %%Y"` +# TODO use not date of tarball but date of latest patch + +cd Doc +sed -i "s/^today = .*/today = '$TODAY_DATE'/" conf.py +%make_build -j1 html + +# Build also devhelp files +sphinx-build -a -b devhelp . build/devhelp +rm -rfv build/devhelp/.doctrees +%else +%define _lto_cflags %{nil} +# use rpm_opt_flags +export OPT="%{optflags} -DOPENSSL_LOAD_CONF -fwrapv $(pkg-config --cflags-only-I libffi) -fno-semantic-interposition" + +touch -r %{SOURCE0} Makefile.pre.in + +autoreconf -fvi + +%if 0%{?sles_version} +sed -e 's/-fprofile-correction//' -i Makefile.pre.in +%endif + +%configure \ + --docdir=%{_docdir}/python \ + --enable-ipv6 \ + --enable-shared \ + --with-ensurepip=no \ + --with-system-ffi \ + --with-system-expat \ + --with-lto \ +%if %{with profileopt} + --enable-optimizations \ +%endif + --enable-loadable-sqlite-extensions + +# prevent make from trying to rebuild PYTHON_FOR_GEN stuff +%make_build -t Python/Python-ast.c \ + Include/Python-ast.h \ + Objects/typeslots.inc \ + Python/opcode_targets.h \ + Include/opcode.h + +%if %{with general} +%make_build +%endif +%if %{with base} +%if %{with profileopt} + target=profile-opt +%else + target=all +%endif +LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH \ + %make_build $target +%endif +%endif + +%check +%if %{with general} +# exclude test_gdb -- it doesn't run in buildservice anyway, and fails on missing debuginfos +# when you install gdb into your test env +EXCLUDE="test_gdb" +# we patch out the message to recommend zypper in and thus this would fail +EXCLUDE="$EXCLUDE test_pydoc" + +%ifarch %{arm} s390x +# test_multiprocessing_forkserver is racy +EXCLUDE="$EXCLUDE test_multiprocessing_forkserver" +%endif +%ifarch ppc ppc64 ppc64le +# exclue test_faulthandler due to bnc#831629 +EXCLUDE="$EXCLUDE test_faulthandler" +%endif +# some tests break in QEMU +%if 0%{?qemu_user_space_build} +EXCLUDE="$EXCLUDE test_multiprocessing_forkserver test_multiprocessing_spawn test_os test_posix test_signal test_socket test_subprocess" +%endif + +# This test (part of test_uuid) requires real network interfaces +# so that ifconfig output has "HWaddr ". Some kvm instances +# done have any such interface breaking the uuid module. +EXCLUDE="$EXCLUDE test_uuid" + +# TEMPORARILY EXCLUDE test_capi bpo#37169 +EXCLUDE="$EXCLUDE test_capi" + +# Limit virtual memory to avoid spurious failures +if test $(ulimit -v) = unlimited || test $(ulimit -v) -gt 10000000; then + ulimit -v 10000000 || : +fi + +export PYTHONPATH="$(pwd -P)/Lib" +# Use timeout, like make target buildbottest +# We cannot run tests parallel, because osc build environment doesnā€™t +# have /dev/shm +%make_build -j1 test TESTOPTS="-u curses -v -x $EXCLUDE --timeout=1200" +# use network, be verbose: +#make test TESTOPTS="-l -u network -v" +%endif + +%install +%if %{with doc} +export PDOCS=%{buildroot}%{_docdir}/python%{python_version} +mkdir -p $PDOCS +# generated docs +rm Doc/build/*/.buildinfo +cp -r Doc/build/html $PDOCS +# misc +install -d -m 755 $PDOCS/Misc +rm Misc/README.AIX +for i in Misc/* ; do + [ -f $i ] && install -c -m 644 $i $PDOCS/Misc/ +done +# devhelp +mkdir -p %{buildroot}%{_datadir}/gtk-doc/html +cp -r Doc/build/devhelp %{buildroot}%{_datadir}/gtk-doc/html/Python%{python_version} +rm -rf %{buildroot}%{_datadir}/gtk-doc/html/Python%{python_version}/.doctrees +%endif +%if %{with general} +%make_install + +# clean out stuff that is in python-base and subpackages + +find %{buildroot}%{_bindir} -mindepth 1 -not -name "*idle3*" -print -delete +rm %{buildroot}%{_libdir}/lib* +rm -r %{buildroot}%{_libdir}/pkgconfig +rm -r %{buildroot}%{_mandir}/* +rm -r %{buildroot}%{_includedir}/* + +rm -r %{buildroot}%{sitedir}/config* +find %{buildroot}%{sitedir} -name "*.egg-info" -delete +rm -r %{buildroot}%{sitedir}/__pycache__ +rm -r %{buildroot}%{sitedir}/site-packages +rm %{buildroot}%{sitedir}/*.* + +for module in \ + asyncio ctypes collections concurrent distutils email encodings \ + ensurepip html http \ + importlib json logging multiprocessing pydoc_data unittest \ + urllib venv wsgiref lib2to3 test turtledemo \ + xml xmlrpc +do + rm -r %{buildroot}%{sitedir}/$module +done + +for library in \ + array _asyncio audioop binascii _bisect _bz2 cmath _codecs_* \ + _contextvars _crypt _csv _ctypes _datetime _decimal fcntl grp \ + _hashlib _heapq _json _lsprof _lzma math mmap _multibytecodec \ + _multiprocessing _opcode ossaudiodev parser _pickle _posixshmem \ + _posixsubprocess _queue _random resource select _ssl _socket spwd \ + _statistics _struct syslog termios _testbuffer _testimportmultiple \ + _testmultiphase unicodedata zlib _ctypes_test _testinternalcapi _testcapi xxlimited \ + _xxtestfuzz _xxsubinterpreters _elementtree pyexpat _md5 _sha1 \ + _sha256 _sha512 _blake2 _sha3 _uuid +do + eval rm "%{buildroot}%{sitedir}/lib-dynload/$library.*" +done + +# Idle is not packaged in base due to the appstream-glib dependency +# move idle config into /etc +install -d -m 755 %{buildroot}%{_sysconfdir}/idle%{python_version} +( + cd %{buildroot}/%{sitedir}/idlelib/ + for file in *.def ; do + mv $file %{buildroot}%{_sysconfdir}/idle%{python_version}/ + ln -sf %{_sysconfdir}/idle%{python_version}/$file %{buildroot}/%{sitedir}/idlelib/ + done +) + +# keep just idle3.X +rm %{buildroot}%{_bindir}/idle3 + +# install idle icons +for size in 16 32 48 ; do + install -m 644 -D Lib/idlelib/Icons/idle_${size}.png \ + %{buildroot}%{_datadir}/icons/hicolor/${size}x${size}/apps/idle%{python_version}.png +done + +# install idle desktop file +cp %{SOURCE19} idle%{python_version}.desktop +sed -i -e 's:idle3:idle%{python_version}:g' idle%{python_version}.desktop +install -m 644 -D -t %{buildroot}%{_datadir}/applications idle%{python_version}.desktop +%suse_update_desktop_file idle%{python_version} + +cp %{SOURCE20} idle%{python_version}.appdata.xml +sed -i -e 's:idle3.desktop:idle%{python_version}.desktop:g' idle%{python_version}.appdata.xml +install -m 644 -D -t %{buildroot}%{_datadir}/metainfo idle%{python_version}.appdata.xml +appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/idle%{python_version}.appdata.xml + +%fdupes %{buildroot}/%{_libdir}/python%{python_version} +%endif +%if %{with base} +%make_install + +# remove .a +find %{buildroot} -name "*.a" -delete + +# install "site-packages" and __pycache__ for third parties +install -d -m 755 %{buildroot}%{sitedir}/site-packages +install -d -m 755 %{buildroot}%{sitedir}/site-packages/__pycache__ +# and their 32bit counterparts explicitly +mkdir -p %{buildroot}%{_prefix}/lib/python%{python_version}/site-packages/__pycache__ + +# cleanup parts that don't belong +for dir in curses dbm sqlite3 tkinter idlelib; do + find "%{buildroot}/%{sitedir}/$dir"/* -maxdepth 0 -name "test" -o -exec rm -rf {} + +done +rm -fv %{buildroot}%{dynlib nis} + +# overwrite the copied binary with a link +ln -sf python%{python_version} %{buildroot}%{_bindir}/python3 + +# decide to ship python3 or just python3.X +%if !%{primary_interpreter} +# base +rm %{buildroot}%{_bindir}/python3 +rm %{buildroot}%{_bindir}/pydocs3 +rm %{buildroot}%{_mandir}/man1/python3.1 +# devel +rm %{buildroot}%{_bindir}/python3-config +rm %{buildroot}%{_libdir}/libpython3.so +rm %{buildroot}%{_libdir}/pkgconfig/{python3,python3-embed}.pc +%endif + +# link shared library instead of static library that tools expect +ln -s ../../libpython%{python_abi}.so %{buildroot}%{_libdir}/python%{python_version}/config-%{python_abi}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}/libpython%{python_abi}.so + +# delete idle3, which has to many packaging dependencies for base +rm %{buildroot}%{_bindir}/idle3* + +# delete the generic 2to3 binary if we are not primary +%if !%{primary_interpreter} +rm %{buildroot}%{_bindir}2to3 +%endif + +# replace duplicate .pyo/.pyc with hardlinks +%fdupes %{buildroot}/%{sitedir} + +# documentation +export PDOCS=%{buildroot}%{_docdir}/%{name} +install -d -m 755 $PDOCS +install -c -m 644 %{SOURCE3} $PDOCS/ +install -c -m 644 README.rst $PDOCS/ + +# tools +for x in `find Tools/ \( -not -name Makefile \) -print | sort` ; do + test -d $x && ( install -c -m 755 -d $PDOCS/$x ) \ + || ( install -c -m 644 $x $PDOCS/$x ) +done +# gdb script is shipped with devel subpackage +rm -r $PDOCS/Tools/gdb +# clean up the bat files +find "$PDOCS" -name "*.bat" -delete + +# put gdb helper script into place +install -m 755 -D Tools/gdb/libpython.py %{buildroot}%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py + +# install devel files to /config +#cp Makefile Makefile.pre.in Makefile.pre $RPM_BUILD_ROOT%{sitedir}/config-%{python_abi}/ + +# RPM macros +%if %{primary_interpreter} +mkdir -p %{buildroot}%{_rpmconfigdir}/macros.d/ +install -m 644 %{SOURCE7} %{buildroot}%{_rpmconfigdir}/macros.d/ # macros.python3 +%endif + +# import_failed hooks +FAILDIR=%{buildroot}/%{sitedir}/_import_failed +mkdir $FAILDIR +install -m 644 %{SOURCE8} %{SOURCE9} $FAILDIR # import_failed.* +LD_LIBRARY_PATH=. ./python -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')" +LD_LIBRARY_PATH=. ./python -O -c "from py_compile import compile; compile('$FAILDIR/import_failed.py', dfile='%{sitedir}/_import_failed/import_failed.py')" +( + cd $FAILDIR + while read package modules; do + for module in $modules; do + ln import_failed.py $module.py + pushd __pycache__ + for i in import_failed*; do + ln $i "$module${i#import_failed}" + done + popd + done + done < %{SOURCE9} +) +echo %{sitedir}/_import_failed > %{buildroot}/%{sitedir}/site-packages/zzzz-import-failed-hooks.pth +%endif + +%if %{with general} +%files -n %{python_pkg_name}-tk +%defattr(644, root, root, 755) +%{sitedir}/tkinter +%exclude %{sitedir}/tkinter/test +%{dynlib _tkinter} + +%files -n %{python_pkg_name}-curses +%defattr(644, root, root, 755) +%{sitedir}/curses +%{dynlib _curses} +%{dynlib _curses_panel} + +%files -n %{python_pkg_name}-dbm +%defattr(644, root, root, 755) +%{sitedir}/dbm +%{dynlib _dbm} +%{dynlib _gdbm} + +%files -n %{python_pkg_name} +%defattr(644, root, root, 755) +%dir %{sitedir} +%dir %{sitedir}/lib-dynload +%{sitedir}/sqlite3 +%exclude %{sitedir}/sqlite3/test +%{dynlib readline} +%{dynlib _sqlite3} +%{dynlib nis} + +%files -n %{python_pkg_name}-idle +%defattr(644, root, root, 755) +%{sitedir}/idlelib +%dir %{_sysconfdir}/idle%{python_version} +%config %{_sysconfdir}/idle%{python_version}/* +%doc Lib/idlelib/NEWS.txt +%doc Lib/idlelib/README.txt +%doc Lib/idlelib/TODO.txt +%doc Lib/idlelib/extend.txt +%doc Lib/idlelib/ChangeLog +%{_bindir}/idle%{python_version} +%{_datadir}/applications/idle%{python_version}.desktop +%{_datadir}/metainfo/idle%{python_version}.appdata.xml +%{_datadir}/icons/hicolor/*/apps/idle%{python_version}.png +%dir %{_datadir}/icons/hicolor +%dir %{_datadir}/icons/hicolor/16x16 +%dir %{_datadir}/icons/hicolor/32x32 +%dir %{_datadir}/icons/hicolor/48x48 +%dir %{_datadir}/icons/hicolor/*/apps +%attr(755, root, root) %{_bindir}/idle%{python_version} +# endif for if general +%endif + +%if %{with doc} +%files -n %{python_pkg_name}-doc +%dir %{_docdir}/python%{python_version} +%doc %{_docdir}/python%{python_version}/Misc +%doc %{_docdir}/python%{python_version}/html + +%files -n %{python_pkg_name}-doc-devhelp +%dir %{_datadir}/gtk-doc +%dir %{_datadir}/gtk-doc/html +%doc %{_datadir}/gtk-doc/html/Python%{python_version} +%endif + +%if %{with base} +%post -n libpython%{so_version} -p /sbin/ldconfig +%postun -n libpython%{so_version} -p /sbin/ldconfig + +%files -n libpython%{so_version} +%defattr(644, root,root) +%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor} + +%files -n %{python_pkg_name}-tools +%defattr(644, root, root, 755) +%{sitedir}/turtledemo +%if %{primary_interpreter} +%{_bindir}/2to3 +%endif +%attr(755, root, root)%{_bindir}/2to3-%{python_version} +%doc %{_docdir}/%{name}/Tools + +%files -n %{python_pkg_name}-devel +%defattr(644, root, root, 755) +%{_libdir}/libpython%{python_abi}.so +%if %{primary_interpreter} +%{_libdir}/libpython3.so +%endif +%{_libdir}/pkgconfig/* +%{_includedir}/python%{python_abi} +%{sitedir}/config-%{python_abi}-* +%defattr(755, root, root) +%{_bindir}/python%{python_abi}-config +%if %{primary_interpreter} +%{_bindir}/python3-config +%endif +# Own these directories to not depend on gdb +%dir %{_datadir}/gdb +%dir %{_datadir}/gdb/auto-load +%dir %{_datadir}/gdb/auto-load%{_prefix} +%dir %{_datadir}/gdb/auto-load%{_libdir} +%{_datadir}/gdb/auto-load/%{_libdir}/libpython%{python_abi}.so.%{so_major}.%{so_minor}-gdb.py + +%files -n %{python_pkg_name}-testsuite +%defattr(644, root, root, 755) +%{sitedir}/test +%{sitedir}/*/test +%{sitedir}/*/tests +%{dynlib _ctypes_test} +%{dynlib _testbuffer} +%{dynlib _testcapi} +%{dynlib _testinternalcapi} +%{dynlib _testimportmultiple} +%{dynlib _testmultiphase} +%{dynlib xxlimited} +# workaround for missing packages +%dir %{sitedir}/sqlite3 +%dir %{sitedir}/tkinter + +%files -n %{python_pkg_name}-base +%defattr(644, root, root, 755) +# docs +%dir %{_docdir}/%{name} +%doc %{_docdir}/%{name}/README.rst +%license LICENSE +%doc %{_docdir}/%{name}/README.SUSE +%if %{primary_interpreter} +%{_mandir}/man1/python3.1%{?ext_man} +%endif +%{_mandir}/man1/python%{python_version}.1%{?ext_man} +# license text, not a doc because the code can use it at run-time +%{sitedir}/LICENSE.txt +# RPM macros +%if %{primary_interpreter} +%{_rpmconfigdir}/macros.d/macros.python3 +%endif +# binary parts +%dir %{sitedir}/lib-dynload +%{dynlib array} +%{dynlib _asyncio} +%{dynlib audioop} +%{dynlib binascii} +%{dynlib _bisect} +%{dynlib _bz2} +%{dynlib cmath} +%{dynlib _codecs_cn} +%{dynlib _codecs_hk} +%{dynlib _codecs_iso2022} +%{dynlib _codecs_jp} +%{dynlib _codecs_kr} +%{dynlib _codecs_tw} +%{dynlib _contextvars} +%{dynlib _crypt} +%{dynlib _csv} +%{dynlib _ctypes} +%{dynlib _datetime} +%{dynlib _decimal} +%{dynlib _elementtree} +%{dynlib fcntl} +%{dynlib grp} +%{dynlib _hashlib} +%{dynlib _heapq} +%{dynlib _json} +%{dynlib _lsprof} +%{dynlib _lzma} +%{dynlib math} +%{dynlib mmap} +%{dynlib _multibytecodec} +%{dynlib _multiprocessing} +%{dynlib _opcode} +%{dynlib ossaudiodev} +%{dynlib parser} +%{dynlib _pickle} +%{dynlib _posixshmem} +%{dynlib _posixsubprocess} +%{dynlib pyexpat} +%{dynlib _queue} +%{dynlib _random} +%{dynlib resource} +%{dynlib select} +%{dynlib _socket} +%{dynlib spwd} +%{dynlib _ssl} +%{dynlib _statistics} +%{dynlib _struct} +%{dynlib syslog} +%{dynlib termios} +%{dynlib unicodedata} +%{dynlib _uuid} +%{dynlib _xxsubinterpreters} +%{dynlib _xxtestfuzz} +%{dynlib zlib} +# hashlib fallback modules +%{dynlib _blake2} +%{dynlib _md5} +%{dynlib _sha1} +%{dynlib _sha256} +%{dynlib _sha512} +%{dynlib _sha3} +# python parts +%dir %{_prefix}/lib/python%{python_version} +%dir %{_prefix}/lib/python%{python_version}/site-packages +%dir %{_prefix}/lib/python%{python_version}/site-packages/__pycache__ +%dir %{sitedir} +%dir %{sitedir}/site-packages +%dir %{sitedir}/site-packages/__pycache__ +%exclude %{sitedir}/*/test +%exclude %{sitedir}/*/tests +%{sitedir}/*.py +%{sitedir}/asyncio +%{sitedir}/ctypes +%{sitedir}/collections +%{sitedir}/concurrent +%{sitedir}/distutils +%{sitedir}/email +%{sitedir}/encodings +%{sitedir}/ensurepip +%{sitedir}/html +%{sitedir}/http +%{sitedir}/importlib +%{sitedir}/json +%{sitedir}/lib2to3 +%{sitedir}/logging +%{sitedir}/multiprocessing +%{sitedir}/pydoc_data +%{sitedir}/unittest +%{sitedir}/urllib +%{sitedir}/venv +%{sitedir}/wsgiref +%{sitedir}/xml +%{sitedir}/xmlrpc +%{sitedir}/__pycache__ +# import-failed hooks +%{sitedir}/_import_failed +%{sitedir}/site-packages/zzzz-import-failed-hooks.pth +# symlinks +%{_bindir}/python3 +%{_bindir}/pydoc3 +# executables +%attr(755, root, root) %{_bindir}/pydoc%{python_version} +# %%attr(755, root, root) %%{_bindir}/python%%{python_abi} +%attr(755, root, root) %{_bindir}/python%{python_version} +# endif for if base +%endif + +%changelog diff --git a/skip_random_failing_tests.patch b/skip_random_failing_tests.patch new file mode 100644 index 0000000..aa92541 --- /dev/null +++ b/skip_random_failing_tests.patch @@ -0,0 +1,145 @@ +From: Michel Normand +Subject: skip random failing tests +Date: Thu, 18 Jan 2018 15:48:52 +0100 + +skip random failing tests: +in _test_multiprocessing.py: + test_async_timeout + test_waitfor_timeout + test_wait_integer +in test_events.py: + test_run_until_complete + test_signal_handling_args + test_call_later + +Reported to fail on ppc64le host on multiple osc build trials: +(all failed for ppc64le, except one for ppc) +=== +[michel@abanc:~/work/home:michel_mno:branches:devel:languages:python:Factory/python3] +$idx=1; while test 1; do echo "trial $idx:"; osc build \ +--vm-type kvm -j 8 --threads 4 openSUSE_Factory_PowerPC ppc64le \ +>/tmp/python3_trialx_${idx}.log 2>&1 || break; ((idx++)); done +=== +FAIL: test_async_timeout (test.test_multiprocessing_fork.WithProcessesTestPool) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 2017, in test_async_timeout + self.assertRaises(multiprocessing.TimeoutError, get, timeout=TIMEOUT2) + AssertionError: TimeoutError not raised by +=== +FAIL: test_waitfor_timeout (test.test_multiprocessing_spawn.WithManagerTestCondition) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 1169, in test_waitfor_timeout + self.assertTrue(success.value) +AssertionError: False is not true +=== +FAIL: test_run_until_complete (test.test_asyncio.test_events.SelectEventLoopTests) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 285, in test_run_until_complete + self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) +AssertionError: False is not true : 3.966844968999993 +=== +FAIL: test_signal_handling_args (test.test_asyncio.test_events.SelectEventLoopTests) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 566, in test_signal_handling_args + self.assertEqual(caught, 1) +AssertionError: 0 != 1 +=== (ppc) +FAIL: test_wait_integer (test.test_multiprocessing_spawn.TestWait) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/_test_multiprocessing.py", line 3762, in test_wait_integer + self.assertLess(delta, expected + 2) +AssertionError: 5.576360702514648 not less than 5 +=== +=== +====================================================================== +FAIL: test_call_later (test.test_asyncio.test_events.PollEventLoopTests) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 309, in test_call_later + self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) +AssertionError: False is not true : 2.7154626529999746 + +====================================================================== +FAIL: test_call_later (test.test_asyncio.test_events.SelectEventLoopTests) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/abuild/rpmbuild/BUILD/Python-3.6.4/Lib/test/test_asyncio/test_events.py", line 309, in test_call_later + self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) +AssertionError: False is not true : 4.137590406000015 +=== + + +Signed-off-by: Michel Normand +--- + Lib/test/_test_multiprocessing.py | 3 +++ + Lib/test/test_asyncio/test_events.py | 4 +++- + 2 files changed, 6 insertions(+), 1 deletion(-) + +--- a/Lib/test/_test_multiprocessing.py ++++ b/Lib/test/_test_multiprocessing.py +@@ -1521,6 +1521,7 @@ class _TestCondition(BaseTestCase): + success.value = True + + @unittest.skipUnless(HAS_SHAREDCTYPES, 'needs sharedctypes') ++ @unittest.skip("transient failure on PowerPC") + def test_waitfor_timeout(self): + # based on test in test/lock_tests.py + cond = self.Condition() +@@ -2411,6 +2412,7 @@ class _TestPool(BaseTestCase): + self.assertEqual(get(), 49) + self.assertTimingAlmostEqual(get.elapsed, TIMEOUT1) + ++ @unittest.skip("transient failure on PowerPC") + def test_async_timeout(self): + res = self.pool.apply_async(sqr, (6, TIMEOUT2 + 1.0)) + get = TimingWrapper(res.get) +@@ -4564,6 +4566,7 @@ class TestWait(unittest.TestCase): + sem.release() + time.sleep(period) + ++ @unittest.skip("transient failure on PowerPC") + def test_wait_integer(self): + from multiprocessing.connection import wait + +--- a/Lib/test/test_asyncio/test_events.py ++++ b/Lib/test/test_asyncio/test_events.py +@@ -266,6 +266,7 @@ class EventLoopTestsMixin: + # Note: because of the default Windows timing granularity of + # 15.6 msec, we use fairly long sleep times here (~100 msec). + ++ @unittest.skip("transient failure on PowerPC") + def test_run_until_complete(self): + t0 = self.loop.time() + self.loop.run_until_complete(asyncio.sleep(0.1)) +@@ -293,7 +294,7 @@ class EventLoopTestsMixin: + self.loop.run_forever() + t1 = time.monotonic() + self.assertEqual(results, ['hello world']) +- self.assertTrue(0.08 <= t1-t0 <= 0.8, t1-t0) ++ self.assertTrue(0.08 <= t1-t0 <= 5.0, t1-t0) + + def test_call_soon(self): + results = [] +@@ -478,6 +479,7 @@ class EventLoopTestsMixin: + self.assertEqual(caught, 1) + + @unittest.skipUnless(hasattr(signal, 'SIGALRM'), 'No SIGALRM') ++ @unittest.skip("transient failure on PowerPC") + def test_signal_handling_args(self): + some_args = (42,) + caught = 0 +--- a/Lib/test/test_buffer.py ++++ b/Lib/test/test_buffer.py +@@ -2504,6 +2504,7 @@ class TestBufferProtocol(unittest.TestCa + a = ndarray(items, shape=[2, 2, 2], format="b") + check(memoryview(a), vsize(base_struct + 3 * per_dim)) + ++ @unittest.skip("transient failure on PowerPC") + def test_memoryview_struct_module(self): + + class INT(object): diff --git a/skipped_tests.py b/skipped_tests.py new file mode 100644 index 0000000..8b4d1a0 --- /dev/null +++ b/skipped_tests.py @@ -0,0 +1,69 @@ +#!/usr/bin/python3 +""" +Simple regexp-based skipped test checker. +It lists tests that are mentioned (presumably for exclusion) +in BASE, and in MAIN (presumably for inclusion) +and reports discrepancies. + +This will have a number of +""" + +MAIN = "python38.spec" + +import glob +import re +from os.path import basename + +alltests = set() +qemu_exclusions = set() + +for item in glob.glob("Python-*/Lib/test/test_*"): + testname = basename(item) + if testname.endswith(".py"): + testname = testname[:-3] + alltests.add(testname) + +testre = re.compile(r'[\s"](test_\w+)\b') + +def find_tests_in_spec(specname): + global qemu_exclusions + + found_tests = set() + with open(specname) as spec: + in_qemu = False + for line in spec: + line = line.strip() + if "#" in line: + line = line[:line.index("#")] + tests = set(testre.findall(line)) + found_tests |= tests + if line == "%if 0%{?qemu_user_space_build} > 0": + in_qemu = True + if in_qemu: + if line == "%endif": + in_qemu = False + qemu_exclusions |= tests + return found_tests + +excluded = find_tests_in_spec(MAIN) + +#print("--- excluded tests:", " ".join(sorted(excluded))) +#print("--- included tests:", " ".join(sorted(included))) + +mentioned = excluded +nonexistent = mentioned - alltests +missing = excluded - qemu_exclusions + +print("--- the following tests are excluded for QEMU and not tested in python") +print("--- (that probably means we don't need to worry about them)") +for test in sorted(qemu_exclusions - excluded): + print(test) + +print("--- the following tests might be excluded in python:") +for test in sorted(missing): + print(test) + +if nonexistent: + print("--- the following tests don't exist:") + for test in sorted(nonexistent): + print(test) diff --git a/subprocess-raise-timeout.patch b/subprocess-raise-timeout.patch new file mode 100644 index 0000000..98d751e --- /dev/null +++ b/subprocess-raise-timeout.patch @@ -0,0 +1,12 @@ +--- a/Lib/test/test_subprocess.py ++++ b/Lib/test/test_subprocess.py +@@ -1124,7 +1124,8 @@ class ProcessTestCase(BaseTestCase): + self.assertIn("0.0001", str(c.exception)) # For coverage of __str__. + # Some heavily loaded buildbots (sparc Debian 3.x) require this much + # time to start. +- self.assertEqual(p.wait(timeout=3), 0) ++ # OBS might require even more ++ self.assertEqual(p.wait(timeout=10), 0) + + def test_invalid_bufsize(self): + # an invalid type of the bufsize argument should raise