From bb3938b5bbc34ed9fc4a4ac768edf9f799a6d0ce Mon Sep 17 00:00:00 2001 From: "Yves.Duprat" Date: Wed, 11 Feb 2026 10:54:19 +0100 Subject: [PATCH 01/10] Initial commit --- Lib/profiling/tracing/__init__.py | 5 +- .../test_sampling_profiler/test_advanced.py | 47 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Lib/profiling/tracing/__init__.py b/Lib/profiling/tracing/__init__.py index bd3cbf299aab3b9..6423e8c9f4e93d8 100644 --- a/Lib/profiling/tracing/__init__.py +++ b/Lib/profiling/tracing/__init__.py @@ -197,7 +197,10 @@ def main(): # in the module's namespace. globs = module.__dict__ globs.update({ - '__spec__': spec, + # See gh-140729, set None to __spec__ according + # to the documentation, + # https://docs.python.org/3/reference/import.html#module-specs + '__spec__': None, '__file__': spec.origin, '__name__': spec.name, '__package__': None, diff --git a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py index 11b1ad84242fd43..67fb3f281e5a97f 100644 --- a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py +++ b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py @@ -234,3 +234,50 @@ def worker(x): self.assertIn("Results: [2, 4, 6]", stdout) self.assertNotIn("Can't pickle", stderr) + + +@requires_remote_subprocess_debugging() +class TestProcessRunSupport(unittest.TestCase): + """ + Test that Process works correctly with cProfile. + """ + + def test_process_run_pickle(self): + # gh-140729: test use Process in cProfile. + val = 10 + test_script = f''' +import multiprocessing + +def worker(x): + print(__name__) + exit(x ** 2) + +if __name__ == "__main__": + multiprocessing.set_start_method("spawn") + p = multiprocessing.Process(target=worker, args=({val},)) + p.start() + p.join() + print("p.exitcode =", p.exitcode) +''' + + with os_helper.temp_dir() as temp_dir: + script = script_helper.make_script( + temp_dir, 'test_process_run_pickle', test_script + ) + with SuppressCrashReport(): + with script_helper.spawn_python( + "-m", "cProfile", + script, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) as proc: + try: + stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT) + except subprocess.TimeoutExpired: + proc.kill() + stdout, stderr = proc.communicate() + + self.assertIn("__mp_main__", stdout) + self.assertIn(f"exitcode = {val**2}", stdout) + self.assertNotIn("Can't pickle", stderr) From 0a7badb3d278e110c133ea5f84fa1f128ec53bb2 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:47:32 +0000 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst new file mode 100644 index 000000000000000..ce099debc7e67ae --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -0,0 +1,2 @@ +Fix pickling error in the cProfile module when using ``multiprocessing.Process`` +script, which can not be properly pickled and executed. From b3ce881dd1856cb93a4c5f908e0688f0c9239b87 Mon Sep 17 00:00:00 2001 From: Duprat Date: Sun, 15 Feb 2026 22:09:52 +0100 Subject: [PATCH 03/10] Update Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst Co-authored-by: AN Long --- .../Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index ce099debc7e67ae..1b57da793e956d7 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1,2 +1,2 @@ -Fix pickling error in the cProfile module when using ``multiprocessing.Process`` -script, which can not be properly pickled and executed. +Fix pickling error in the :mode:`cProfile` module when using :class:`multiprocessing.Process` +script, which can not be properly pickled and executed. From e861c04d3e0ac6bb5e8fa7f1586c422258393103 Mon Sep 17 00:00:00 2001 From: Duprat Date: Mon, 16 Feb 2026 20:30:40 +0100 Subject: [PATCH 04/10] Fix nits in news file --- .../Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index 1b57da793e956d7..7119253183a9b40 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1,2 +1,3 @@ -Fix pickling error in the :mode:`cProfile` module when using :class:`multiprocessing.Process` +Fix pickling error in the :module:`cProfile` module when using :class:`multiprocessing.Process` script, which can not be properly pickled and executed. + From 6805048c2c2c7a1161f69e09949e2e2ac08434a8 Mon Sep 17 00:00:00 2001 From: Duprat Date: Tue, 17 Feb 2026 23:04:28 +0100 Subject: [PATCH 05/10] Fix nits --- .../Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index 7119253183a9b40..b065afebc815dd4 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1,3 +1,4 @@ -Fix pickling error in the :module:`cProfile` module when using :class:`multiprocessing.Process` +Fix pickling error in the :mod:`cProfile` module when using :class:`multiprocessing.Process` script, which can not be properly pickled and executed. + From d3ba6491e09922644d9101d38dbd5ede0bc360ea Mon Sep 17 00:00:00 2001 From: Duprat Date: Tue, 17 Feb 2026 23:14:59 +0100 Subject: [PATCH 06/10] Fix news file. --- .../Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index b065afebc815dd4..39aeb68a7695cd5 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1,4 +1,2 @@ -Fix pickling error in the :mod:`cProfile` module when using :class:`multiprocessing.Process` -script, which can not be properly pickled and executed. - - +Fix pickling error in the ``cProfile`` module when using :class:`multiprocessing.Process` +in script, which can not be properly pickled and executed. From 79d51cdc6ecb40b8ca4f38a1c6c391eb3fdec411 Mon Sep 17 00:00:00 2001 From: Duprat Date: Thu, 4 Jun 2026 14:48:27 +0200 Subject: [PATCH 07/10] Fix nits in news file --- .../Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index 39aeb68a7695cd5..cffee24938774ca 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1,2 +1 @@ -Fix pickling error in the ``cProfile`` module when using :class:`multiprocessing.Process` -in script, which can not be properly pickled and executed. +Fix pickling error in the ``cProfile`` module when using :class:`multiprocessing.Process` in script, which can not be properly pickled and executed. From 7c5f2d3bed568a55f684799a194043420ad1c0fd Mon Sep 17 00:00:00 2001 From: "Yves.Duprat" Date: Thu, 18 Jun 2026 17:59:19 +0200 Subject: [PATCH 08/10] Update from reviews + Move unittest + Update news file + run make regen-configure --- .../test_sampling_profiler/test_advanced.py | 47 ---------------- .../test_profiling/test_tracing_profiler.py | 54 ++++++++++++++++++- ...-02-11-16-47-27.gh-issue-140729.2uTPQp.rst | 2 +- Programs/test_frozenmain.h | 12 ++--- 4 files changed, 60 insertions(+), 55 deletions(-) diff --git a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py index 67fb3f281e5a97f..11b1ad84242fd43 100644 --- a/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py +++ b/Lib/test/test_profiling/test_sampling_profiler/test_advanced.py @@ -234,50 +234,3 @@ def worker(x): self.assertIn("Results: [2, 4, 6]", stdout) self.assertNotIn("Can't pickle", stderr) - - -@requires_remote_subprocess_debugging() -class TestProcessRunSupport(unittest.TestCase): - """ - Test that Process works correctly with cProfile. - """ - - def test_process_run_pickle(self): - # gh-140729: test use Process in cProfile. - val = 10 - test_script = f''' -import multiprocessing - -def worker(x): - print(__name__) - exit(x ** 2) - -if __name__ == "__main__": - multiprocessing.set_start_method("spawn") - p = multiprocessing.Process(target=worker, args=({val},)) - p.start() - p.join() - print("p.exitcode =", p.exitcode) -''' - - with os_helper.temp_dir() as temp_dir: - script = script_helper.make_script( - temp_dir, 'test_process_run_pickle', test_script - ) - with SuppressCrashReport(): - with script_helper.spawn_python( - "-m", "cProfile", - script, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True - ) as proc: - try: - stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT) - except subprocess.TimeoutExpired: - proc.kill() - stdout, stderr = proc.communicate() - - self.assertIn("__mp_main__", stdout) - self.assertIn(f"exitcode = {val**2}", stdout) - self.assertNotIn("Can't pickle", stderr) diff --git a/Lib/test/test_profiling/test_tracing_profiler.py b/Lib/test/test_profiling/test_tracing_profiler.py index 3668e24e073ce4d..5451e0846fa4b95 100644 --- a/Lib/test/test_profiling/test_tracing_profiler.py +++ b/Lib/test/test_profiling/test_tracing_profiler.py @@ -1,5 +1,5 @@ """Test suite for the cProfile module.""" - +import subprocess import sys import unittest @@ -9,6 +9,12 @@ import textwrap from test.test_profile import ProfileTest, regenerate_expected_output from test.support.script_helper import assert_python_failure, assert_python_ok +from test.support import ( + SHORT_TIMEOUT, + SuppressCrashReport, + os_helper, + script_helper, +) from test import support @@ -193,6 +199,52 @@ class Foo: assert_python_ok('-m', "cProfile", f.name) +class TestProcessRunSupport(unittest.TestCase): + """ + Test that Process works correctly with cProfile. + """ + + def test_process_run_pickle(self): + # gh-140729: test use Process in cProfile. + val = 10 + test_script = f''' +import multiprocessing + +def worker(x): + print(__name__) + exit(x ** 2) + +if __name__ == "__main__": + multiprocessing.set_start_method("spawn") + p = multiprocessing.Process(target=worker, args=({val},)) + p.start() + p.join() + print("p.exitcode =", p.exitcode) +''' + + with os_helper.temp_dir() as temp_dir: + script = script_helper.make_script( + temp_dir, 'test_process_run_pickle', test_script + ) + with SuppressCrashReport(): + with script_helper.spawn_python( + "-m", "cProfile", + script, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) as proc: + try: + stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT) + except subprocess.TimeoutExpired: + proc.kill() + stdout, stderr = proc.communicate() + + self.assertIn("__mp_main__", stdout) + self.assertIn(f"exitcode = {val**2}", stdout) + self.assertNotIn("Can't pickle", stderr) + + def main(): if '-r' not in sys.argv: unittest.main() diff --git a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst index cffee24938774ca..efe0efda798978b 100644 --- a/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst +++ b/Misc/NEWS.d/next/Library/2026-02-11-16-47-27.gh-issue-140729.2uTPQp.rst @@ -1 +1 @@ -Fix pickling error in the ``cProfile`` module when using :class:`multiprocessing.Process` in script, which can not be properly pickled and executed. +Fix pickling error in the ``cProfile`` module when using :class:`multiprocessing.Process` in script, which can not be properly pickled and executed. diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 1bcf98a7600851f..0f07d03b05a329d 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -13,10 +13,10 @@ unsigned char M_test_frozenmain[] = { 92,2,31,0,81,4,92,6,12,0,81,5,92,5,92,6, 42,26,0,0,0,0,0,0,0,0,0,0,12,0,48,4, 50,1,0,0,0,0,0,0,29,0,74,26,0,0,9,0, - 28,0,80,7,33,0,41,7,233,0,0,0,0,122,18,70, + 28,0,80,7,33,0,41,7,233,0,0,0,0,218,18,70, 114,111,122,101,110,32,72,101,108,108,111,32,87,111,114,108, - 100,122,8,115,121,115,46,97,114,103,118,218,6,99,111,110, - 102,105,103,122,7,99,111,110,102,105,103,32,122,2,58,32, + 100,218,8,115,121,115,46,97,114,103,118,218,6,99,111,110, + 102,105,103,218,7,99,111,110,102,105,103,32,218,2,58,32, 41,5,218,12,112,114,111,103,114,97,109,95,110,97,109,101, 218,10,101,120,101,99,117,116,97,98,108,101,218,15,117,115, 101,95,101,110,118,105,114,111,110,109,101,110,116,218,17,99, @@ -25,15 +25,15 @@ unsigned char M_test_frozenmain[] = { 41,7,218,3,115,121,115,218,17,95,116,101,115,116,105,110, 116,101,114,110,97,108,99,97,112,105,218,5,112,114,105,110, 116,218,4,97,114,103,118,218,11,103,101,116,95,99,111,110, - 102,105,103,115,114,3,0,0,0,218,3,107,101,121,169,0, + 102,105,103,115,114,5,0,0,0,218,3,107,101,121,169,0, 243,0,0,0,0,218,18,116,101,115,116,95,102,114,111,122, 101,110,109,97,105,110,46,112,121,218,8,60,109,111,100,117, - 108,101,62,114,18,0,0,0,1,0,0,0,115,94,0,0, + 108,101,62,114,22,0,0,0,1,0,0,0,115,94,0,0, 0,241,3,1,1,1,243,8,0,1,11,219,0,24,225,0, 5,208,6,26,212,0,27,217,0,5,128,106,144,35,151,40, 145,40,212,0,27,216,9,26,215,9,38,210,9,38,211,9, 40,168,24,213,9,50,128,6,244,2,6,12,2,128,67,241, 14,0,5,10,136,71,144,67,144,53,152,2,152,54,160,35, 157,59,152,45,208,10,40,214,4,41,243,15,6,12,2,114, - 16,0,0,0, + 20,0,0,0, }; From c57719e0101c0f73285a82e6bbb8934c6247a44f Mon Sep 17 00:00:00 2001 From: "Yves.Duprat" Date: Thu, 18 Jun 2026 19:20:15 +0200 Subject: [PATCH 09/10] refactor test code --- .../test_profiling/test_tracing_profiler.py | 70 ++++++------------- 1 file changed, 21 insertions(+), 49 deletions(-) diff --git a/Lib/test/test_profiling/test_tracing_profiler.py b/Lib/test/test_profiling/test_tracing_profiler.py index 5451e0846fa4b95..3ef33d1abb91408 100644 --- a/Lib/test/test_profiling/test_tracing_profiler.py +++ b/Lib/test/test_profiling/test_tracing_profiler.py @@ -1,5 +1,4 @@ """Test suite for the cProfile module.""" -import subprocess import sys import unittest @@ -9,12 +8,6 @@ import textwrap from test.test_profile import ProfileTest, regenerate_expected_output from test.support.script_helper import assert_python_failure, assert_python_ok -from test.support import ( - SHORT_TIMEOUT, - SuppressCrashReport, - os_helper, - script_helper, -) from test import support @@ -198,51 +191,30 @@ class Foo: f.close() assert_python_ok('-m', "cProfile", f.name) - -class TestProcessRunSupport(unittest.TestCase): - """ - Test that Process works correctly with cProfile. - """ - def test_process_run_pickle(self): # gh-140729: test use Process in cProfile. val = 10 - test_script = f''' -import multiprocessing - -def worker(x): - print(__name__) - exit(x ** 2) - -if __name__ == "__main__": - multiprocessing.set_start_method("spawn") - p = multiprocessing.Process(target=worker, args=({val},)) - p.start() - p.join() - print("p.exitcode =", p.exitcode) -''' - - with os_helper.temp_dir() as temp_dir: - script = script_helper.make_script( - temp_dir, 'test_process_run_pickle', test_script - ) - with SuppressCrashReport(): - with script_helper.spawn_python( - "-m", "cProfile", - script, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True - ) as proc: - try: - stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT) - except subprocess.TimeoutExpired: - proc.kill() - stdout, stderr = proc.communicate() - - self.assertIn("__mp_main__", stdout) - self.assertIn(f"exitcode = {val**2}", stdout) - self.assertNotIn("Can't pickle", stderr) + with tempfile.NamedTemporaryFile("w+", delete_on_close=False) as f: + f.write(textwrap.dedent( + f'''\ + import multiprocessing + + def worker(x): + print(__name__) + exit(x ** 2) + + if __name__ == "__main__": + multiprocessing.set_start_method("spawn") + p = multiprocessing.Process(target=worker, args=({val},)) + p.start() + p.join() + print("p.exitcode =", p.exitcode) + ''')) + f.close() + _, out, err = assert_python_ok('-m', "cProfile", f.name) + self.assertIn(b"__mp_main__", out) + self.assertIn(bytes(f"exitcode = {val**2}", encoding='utf8'), out) + self.assertNotIn(b"Can't pickle", err) def main(): From 437dcd933f334179d11d61c852b35e28fb5f3b39 Mon Sep 17 00:00:00 2001 From: "Yves.Duprat" Date: Fri, 19 Jun 2026 11:10:55 +0200 Subject: [PATCH 10/10] Cancel modifs to test_frozenmain.h --- Programs/test_frozenmain.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Programs/test_frozenmain.h b/Programs/test_frozenmain.h index 0f07d03b05a329d..1bcf98a7600851f 100644 --- a/Programs/test_frozenmain.h +++ b/Programs/test_frozenmain.h @@ -13,10 +13,10 @@ unsigned char M_test_frozenmain[] = { 92,2,31,0,81,4,92,6,12,0,81,5,92,5,92,6, 42,26,0,0,0,0,0,0,0,0,0,0,12,0,48,4, 50,1,0,0,0,0,0,0,29,0,74,26,0,0,9,0, - 28,0,80,7,33,0,41,7,233,0,0,0,0,218,18,70, + 28,0,80,7,33,0,41,7,233,0,0,0,0,122,18,70, 114,111,122,101,110,32,72,101,108,108,111,32,87,111,114,108, - 100,218,8,115,121,115,46,97,114,103,118,218,6,99,111,110, - 102,105,103,218,7,99,111,110,102,105,103,32,218,2,58,32, + 100,122,8,115,121,115,46,97,114,103,118,218,6,99,111,110, + 102,105,103,122,7,99,111,110,102,105,103,32,122,2,58,32, 41,5,218,12,112,114,111,103,114,97,109,95,110,97,109,101, 218,10,101,120,101,99,117,116,97,98,108,101,218,15,117,115, 101,95,101,110,118,105,114,111,110,109,101,110,116,218,17,99, @@ -25,15 +25,15 @@ unsigned char M_test_frozenmain[] = { 41,7,218,3,115,121,115,218,17,95,116,101,115,116,105,110, 116,101,114,110,97,108,99,97,112,105,218,5,112,114,105,110, 116,218,4,97,114,103,118,218,11,103,101,116,95,99,111,110, - 102,105,103,115,114,5,0,0,0,218,3,107,101,121,169,0, + 102,105,103,115,114,3,0,0,0,218,3,107,101,121,169,0, 243,0,0,0,0,218,18,116,101,115,116,95,102,114,111,122, 101,110,109,97,105,110,46,112,121,218,8,60,109,111,100,117, - 108,101,62,114,22,0,0,0,1,0,0,0,115,94,0,0, + 108,101,62,114,18,0,0,0,1,0,0,0,115,94,0,0, 0,241,3,1,1,1,243,8,0,1,11,219,0,24,225,0, 5,208,6,26,212,0,27,217,0,5,128,106,144,35,151,40, 145,40,212,0,27,216,9,26,215,9,38,210,9,38,211,9, 40,168,24,213,9,50,128,6,244,2,6,12,2,128,67,241, 14,0,5,10,136,71,144,67,144,53,152,2,152,54,160,35, 157,59,152,45,208,10,40,214,4,41,243,15,6,12,2,114, - 20,0,0,0, + 16,0,0,0, };