From 98980c441431fe42054a73436da3f8afc57e6a90 Mon Sep 17 00:00:00 2001 From: Colin Xu Date: Mon, 20 Feb 2023 17:07:45 +0800 Subject: [PATCH] Enable pykd for python 3.10. Signed-off-by: Colin Xu --- pykd.sln | 38 ++++++++ pykd/boost.python/exec.cpp | 6 +- pykd/packages.config | 2 + pykd/pykd.vcxproj | 184 ++++++++++++++++++++++++++++++++++++- setup/setup.py | 2 +- 5 files changed, 229 insertions(+), 3 deletions(-) diff --git a/pykd.sln b/pykd.sln index c8b5465..f5b0bf5 100644 --- a/pykd.sln +++ b/pykd.sln @@ -42,6 +42,8 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_2.7|Win32 = Debug_2.7|Win32 Debug_2.7|x64 = Debug_2.7|x64 + Debug_3.10|Win32 = Debug_3.10|Win32 + Debug_3.10|x64 = Debug_3.10|x64 Debug_3.5|Win32 = Debug_3.5|Win32 Debug_3.5|x64 = Debug_3.5|x64 Debug_3.6|Win32 = Debug_3.6|Win32 @@ -54,6 +56,8 @@ Global Debug_3.9|x64 = Debug_3.9|x64 Release_2.7|Win32 = Release_2.7|Win32 Release_2.7|x64 = Release_2.7|x64 + Release_3.10|Win32 = Release_3.10|Win32 + Release_3.10|x64 = Release_3.10|x64 Release_3.5|Win32 = Release_3.5|Win32 Release_3.5|x64 = Release_3.5|x64 Release_3.6|Win32 = Release_3.6|Win32 @@ -69,6 +73,8 @@ Global {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_2.7|Win32.ActiveCfg = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_2.7|Win32.Build.0 = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_2.7|x64.ActiveCfg = Debug|Any CPU + {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.10|Win32.ActiveCfg = Debug|Any CPU + {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.10|x64.ActiveCfg = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.5|Win32.ActiveCfg = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.5|x64.ActiveCfg = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.6|Win32.ActiveCfg = Debug|Any CPU @@ -81,6 +87,8 @@ Global {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Debug_3.9|x64.ActiveCfg = Debug|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_2.7|Win32.ActiveCfg = Release|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_2.7|x64.ActiveCfg = Release|Any CPU + {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.10|Win32.ActiveCfg = Release|Any CPU + {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.10|x64.ActiveCfg = Release|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.5|Win32.ActiveCfg = Release|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.5|x64.ActiveCfg = Release|Any CPU {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.6|Win32.ActiveCfg = Release|Any CPU @@ -93,6 +101,8 @@ Global {3F0BE77E-19B0-4192-B432-44A25805BCB8}.Release_3.9|x64.ActiveCfg = Release|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_2.7|Win32.ActiveCfg = Debug|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_2.7|x64.ActiveCfg = Debug|Any CPU + {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.10|Win32.ActiveCfg = Debug_3.10|Any CPU + {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.10|x64.ActiveCfg = Debug|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.5|Win32.ActiveCfg = Debug|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.5|x64.ActiveCfg = Debug|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.6|Win32.ActiveCfg = Debug|Any CPU @@ -105,6 +115,8 @@ Global {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Debug_3.9|x64.ActiveCfg = Debug|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_2.7|Win32.ActiveCfg = Release|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_2.7|x64.ActiveCfg = Release|Any CPU + {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.10|Win32.ActiveCfg = Release|Any CPU + {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.10|x64.ActiveCfg = Release|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.5|Win32.ActiveCfg = Release|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.5|x64.ActiveCfg = Release|Any CPU {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.6|Win32.ActiveCfg = Release|Any CPU @@ -117,6 +129,8 @@ Global {6471FEDC-3129-410F-BFFC-4BC89707E5EC}.Release_3.9|x64.ActiveCfg = Release|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_2.7|Win32.ActiveCfg = Debug|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_2.7|x64.ActiveCfg = Debug|Any CPU + {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.10|Win32.ActiveCfg = Debug|Any CPU + {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.10|x64.ActiveCfg = Debug|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.5|Win32.ActiveCfg = Debug|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.5|x64.ActiveCfg = Debug|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.6|Win32.ActiveCfg = Debug|Any CPU @@ -129,6 +143,8 @@ Global {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Debug_3.9|x64.ActiveCfg = Debug|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_2.7|Win32.ActiveCfg = Release|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_2.7|x64.ActiveCfg = Release|Any CPU + {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_3.10|Win32.ActiveCfg = Release|Any CPU + {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_3.10|x64.ActiveCfg = Release|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_3.5|Win32.ActiveCfg = Release|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_3.5|x64.ActiveCfg = Release|Any CPU {D78837DC-BF31-4FC4-88A5-7F2FADAFA795}.Release_3.6|Win32.ActiveCfg = Release|Any CPU @@ -143,6 +159,9 @@ Global {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_2.7|Win32.Build.0 = Debug|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_2.7|x64.ActiveCfg = Debug|x64 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_2.7|x64.Build.0 = Debug|x64 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.10|Win32.ActiveCfg = Debug_Static|Win32 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.10|x64.ActiveCfg = Debug|x64 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.10|x64.Build.0 = Debug|x64 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.5|Win32.ActiveCfg = Debug|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.5|Win32.Build.0 = Debug|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Debug_3.5|x64.ActiveCfg = Debug|x64 @@ -167,6 +186,10 @@ Global {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_2.7|Win32.Build.0 = Release_Static|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_2.7|x64.ActiveCfg = Release_Static|x64 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_2.7|x64.Build.0 = Release_Static|x64 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.10|Win32.ActiveCfg = Release_Static|Win32 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.10|Win32.Build.0 = Release_Static|Win32 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.10|x64.ActiveCfg = Release_Static|x64 + {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.10|x64.Build.0 = Release_Static|x64 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.5|Win32.ActiveCfg = Release_Static|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.5|Win32.Build.0 = Release_Static|Win32 {3E9C538F-F060-4E86-AB7D-D44439615B63}.Release_3.5|x64.ActiveCfg = Release_Static|x64 @@ -191,6 +214,10 @@ Global {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_2.7|Win32.Build.0 = Debug_2.7|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_2.7|x64.ActiveCfg = Debug_2.7|x64 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_2.7|x64.Build.0 = Debug_2.7|x64 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.10|Win32.ActiveCfg = Debug_3.10|Win32 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.10|Win32.Build.0 = Debug_3.10|Win32 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.10|x64.ActiveCfg = Debug_3.10|x64 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.10|x64.Build.0 = Debug_3.10|x64 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.5|Win32.ActiveCfg = Debug_3.5|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.5|Win32.Build.0 = Debug_3.5|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Debug_3.5|x64.ActiveCfg = Debug_3.5|x64 @@ -215,6 +242,10 @@ Global {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_2.7|Win32.Build.0 = Release_2.7|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_2.7|x64.ActiveCfg = Release_2.7|x64 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_2.7|x64.Build.0 = Release_2.7|x64 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.10|Win32.ActiveCfg = Release_3.10|Win32 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.10|Win32.Build.0 = Release_3.10|Win32 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.10|x64.ActiveCfg = Release_3.10|x64 + {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.10|x64.Build.0 = Release_3.10|x64 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.5|Win32.ActiveCfg = Release_3.5|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.5|Win32.Build.0 = Release_3.5|Win32 {C4C45791-0201-4406-BC5C-A384B01E3BF5}.Release_3.5|x64.ActiveCfg = Release_3.5|x64 @@ -239,6 +270,9 @@ Global {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_2.7|Win32.Build.0 = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_2.7|x64.ActiveCfg = Debug|x64 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_2.7|x64.Build.0 = Debug|x64 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.10|Win32.ActiveCfg = Debug_3.10|x64 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.10|x64.ActiveCfg = Debug|x64 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.10|x64.Build.0 = Debug|x64 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.5|Win32.ActiveCfg = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.5|Win32.Build.0 = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Debug_3.5|x64.ActiveCfg = Debug|x64 @@ -263,6 +297,10 @@ Global {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_2.7|Win32.Build.0 = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_2.7|x64.ActiveCfg = Debug|x64 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_2.7|x64.Build.0 = Debug|x64 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.10|Win32.ActiveCfg = Release|Win32 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.10|Win32.Build.0 = Release|Win32 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.10|x64.ActiveCfg = Release|x64 + {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.10|x64.Build.0 = Release|x64 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.5|Win32.ActiveCfg = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.5|Win32.Build.0 = Debug|Win32 {0E4CC688-F2F5-499F-9C07-0F2CAEE0D3EF}.Release_3.5|x64.ActiveCfg = Debug|x64 diff --git a/pykd/boost.python/exec.cpp b/pykd/boost.python/exec.cpp index 171c6f4..90e3ea2 100644 --- a/pykd/boost.python/exec.cpp +++ b/pykd/boost.python/exec.cpp @@ -105,7 +105,11 @@ object BOOST_PYTHON_DECL exec_file(char const *filename, object global, object l // should be 'char const *' but older python versions don't use 'const' yet. char *f = const_cast(filename); // Let python open the file to avoid potential binary incompatibilities. -#if PY_VERSION_HEX >= 0x03040000 +#if PY_VERSION_HEX >= 0x030a0000 + PyObject* fo = Py_BuildValue("s", f); + FILE* fs = _Py_fopen_obj(fo, "r"); + Py_DECREF(fo); +#elif PY_VERSION_HEX >= 0x03040000 FILE *fs = _Py_fopen(f, "r"); #elif PY_VERSION_HEX >= 0x03000000 PyObject *fo = Py_BuildValue("s", f); diff --git a/pykd/packages.config b/pykd/packages.config index fc0a8e9..38778f4 100644 --- a/pykd/packages.config +++ b/pykd/packages.config @@ -13,6 +13,8 @@ + + diff --git a/pykd/pykd.vcxproj b/pykd/pykd.vcxproj index c08859d..ac48de1 100644 --- a/pykd/pykd.vcxproj +++ b/pykd/pykd.vcxproj @@ -9,6 +9,14 @@ Debug_2.7 x64 + + Debug_3.10 + Win32 + + + Debug_3.10 + x64 + Debug_3.5 Win32 @@ -57,6 +65,14 @@ Release_2.7 x64 + + Release_3.10 + Win32 + + + Release_3.10 + x64 + Release_3.5 Win32 @@ -156,6 +172,14 @@ 3.9 MDd + + DynamicLibrary + true + Unicode + v141 + 3.10 + MDd + DynamicLibrary true @@ -204,6 +228,14 @@ 3.9 MDd + + DynamicLibrary + true + Unicode + v141 + 3.10 + MDd + DynamicLibrary false @@ -258,6 +290,15 @@ 3.9 MT + + DynamicLibrary + false + true + Unicode + v141 + 3.10 + MT + DynamicLibrary false @@ -312,6 +353,15 @@ 3.9 MT + + DynamicLibrary + false + true + Unicode + v141 + 3.10 + MT + @@ -333,6 +383,9 @@ + + + @@ -351,6 +404,9 @@ + + + @@ -369,6 +425,9 @@ + + + @@ -387,6 +446,9 @@ + + + bb9fbdf7 @@ -438,6 +500,14 @@ $(Platform)\$(Configuration)\ $(SolutionDir)out\$(Platform)\$(Configuration)\ + + true + .pyd + true + $(ProjectName) + $(Platform)\$(Configuration)\ + $(SolutionDir)out\$(Platform)\$(Configuration)\ + true .pyd @@ -486,6 +556,14 @@ $(SolutionDir)out\$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ + + true + .pyd + true + $(ProjectName) + $(SolutionDir)out\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false .pyd @@ -528,6 +606,13 @@ $(Platform)\$(Configuration)\ $(SolutionDir)out\$(Platform)\$(Configuration)\ + + false + .pyd + $(ProjectName) + $(Platform)\$(Configuration)\ + $(SolutionDir)out\$(Platform)\$(Configuration)\ + false .pyd @@ -570,6 +655,13 @@ $(SolutionDir)out\$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ + + false + .pyd + $(ProjectName) + $(SolutionDir)out\$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + Use @@ -703,6 +795,28 @@ + + + Use + Level3 + Disabled + WIN32;BOOST_PYTHON_STATIC_LIB;BOOST_PYTHON_NO_LIB;_DEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS;%(PreprocessorDefinitions);BOOST_PYTHON_NUMPY_INTERNAL + $(SolutionDir)\kdlibcpp\kdlib\include;$(SolutionDir)\numpy\include;$(SolutionDir)packages\pythonx86.3.10.10\tools\include + + + Windows + DebugFull + pykd.def + $(SolutionDir)packages\pythonx86.3.10.10\tools\libs;%(AdditionalLibraryDirectories) + + + copy $(OutDir)..\Debug\targetapp.exe $(OutDir) + + + + + + Use @@ -835,6 +949,28 @@ + + + Use + Level3 + Disabled + WIN32;BOOST_PYTHON_STATIC_LIB;BOOST_PYTHON_NO_LIB;_DEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS;%(PreprocessorDefinitions);BOOST_PYTHON_NUMPY_INTERNAL + $(SolutionDir)\kdlibcpp\kdlib\include;$(SolutionDir)\numpy\include;$(SolutionDir)packages\python.3.10.10\tools\include + + + Windows + DebugFull + pykd.def + $(SolutionDir)packages\python.3.10.10\tools\libs;%(AdditionalLibraryDirectories) + + + copy $(OutDir)..\Debug\targetapp.exe $(OutDir) + + + + + + Level3 @@ -973,6 +1109,29 @@ copy $(OutDir)..\Debug\targetapp.exe $(OutDir) + + + Level3 + Use + MaxSpeed + true + true + WIN32;BOOST_PYTHON_STATIC_LIB;BOOST_PYTHON_NO_LIB;NDEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS;%(PreprocessorDefinitions); + $(SolutionDir)\kdlibcpp\kdlib\include;$(SolutionDir)\numpy\include;$(SolutionDir)packages\pythonx86.3.10.10\tools\include + MultiThreaded + + + Windows + DebugFull + true + true + pykd.def + $(SolutionDir)packages\pythonx86.3.10.10\tools\libs;%(AdditionalLibraryDirectories) + + + copy $(OutDir)..\Release\targetapp.exe $(OutDir) + + Level3 @@ -1108,7 +1267,30 @@ %(AdditionalLibraryDirectories) - copy $(OutDir)..\Debug\targetapp.exe $(OutDir) + copy $(OutDir)..\Release\targetapp.exe $(OutDir) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;BOOST_PYTHON_STATIC_LIB;BOOST_PYTHON_NO_LIB;NDEBUG;_WINDOWS;_USRDLL;PYKD_EXPORTS;%(PreprocessorDefinitions); + $(SolutionDir)\kdlibcpp\kdlib\include;$(SolutionDir)\numpy\include;$(SolutionDir)packages\python.3.10.10\tools\include + MultiThreaded + + + Windows + DebugFull + true + true + pykd.def + $(SolutionDir)packages\python.3.10.10\tools\libs;%(AdditionalLibraryDirectories) + + + copy $(OutDir)..\Release\targetapp.exe $(OutDir) diff --git a/setup/setup.py b/setup/setup.py index 9e56212..6fbb74c 100644 --- a/setup/setup.py +++ b/setup/setup.py @@ -110,7 +110,7 @@ elif "bdist_zip" in sys.argv: elif "bdist_pdb" in sys.argv: #make pdb archive - pyVersion = ('2.7', '3.5', '3.6', '3.7', '3.8', '3.9') + pyVersion = ('2.7', '3.5', '3.6', '3.7', '3.8', '3.9', '3.10', '3.11') platform = ('Win32', 'x64') pdbFiles = [ os.path.join( platform, 'Release_' + version, 'pykd.pdb') for version, platform in itertools.product( pyVersion, platform ) ]