Update to python 3.9.2 on Windows as well. Mark old Python and Node packages. (#758)

diff --git a/README.md b/README.md
index 1d397e3..3d10f87 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,8 @@
 
 ### Mac OS X
 
-- `python`: Version 2.7.0 or above.
+- For Intel-based Macs, macOS 10.13 or newer. For ARM64 M1 based Macs, macOS
+  11.0 or newer.
 - `java`: For running closure compiler (optional).  After installing emscripten
   via emsdk, typing 'emcc --help' should pop up a OS X dialog "Java is not
   installed. To open java, you need a Java SE 6 runtime. Would you like to
diff --git a/emsdk.bat b/emsdk.bat
index 66f6d11..70e6b70 100644
--- a/emsdk.bat
+++ b/emsdk.bat
@@ -7,6 +7,13 @@
 :: When using our bundled python we never want the users

 :: PYTHONHOME or PYTHONPATH

 :: https://github.com/emscripten-core/emsdk/issues/598

+if exist "%~dp0python\3.9.2-1_64bit\python.exe" (

+  set EMSDK_PY="%~dp0python\3.9.2-1_64bit\python.exe"

+  set PYTHONHOME=

+  set PYTHONPATH=

+  goto end

+)

+

 if exist "%~dp0python\3.7.4-pywin32_64bit\python.exe" (

   set EMSDK_PY="%~dp0python\3.7.4-pywin32_64bit\python.exe"

   set PYTHONHOME=

diff --git a/emsdk.ps1 b/emsdk.ps1
index 694d8fe..f9ec036 100644
--- a/emsdk.ps1
+++ b/emsdk.ps1
@@ -1,6 +1,7 @@
 $ScriptDirectory = Split-Path -parent $PSCommandPath
 
 $PythonLocations = $(
+    "python\3.9.2-1_64bit\python.exe",
     "python\3.7.4-pywin32_64bit\python.exe",
     "python\3.7.4_64bit\python.exe",
     "python\2.7.13.1_64bit\python-2.7.13.amd64\python.exe",
diff --git a/emsdk_manifest.json b/emsdk_manifest.json
index b0000e0..c344458 100644
--- a/emsdk_manifest.json
+++ b/emsdk_manifest.json
@@ -150,7 +150,8 @@
     "linux_url": "node-v8.9.1-linux-x86.tar.xz",
     "activated_path": "%installation_dir%/bin",
     "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'",
-    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%"
+    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%",
+    "is_old": true
   },
   {
     "id": "node",
@@ -160,7 +161,8 @@
     "linux_url": "https://nodejs.org/dist/v8.9.1/node-v8.9.1-linux-armv7l.tar.xz",
     "activated_path": "%installation_dir%/bin",
     "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'",
-    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%"
+    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%",
+    "is_old": true
   },
   {
     "id": "node",
@@ -172,7 +174,8 @@
     "linux_url": "node-v8.9.1-linux-x64.tar.xz",
     "activated_path": "%installation_dir%/bin",
     "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'",
-    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%"
+    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%",
+    "is_old": true
   },
   {
     "id": "node",
@@ -182,7 +185,8 @@
     "linux_url": "node-v8.9.1-linux-arm64.tar.xz",
     "activated_path": "%installation_dir%/bin",
     "activated_cfg": "NODE_JS='%installation_dir%/bin/node%.exe%'",
-    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%"
+    "activated_env": "EMSDK_NODE=%installation_dir%/bin/node%.exe%",
+    "is_old": true
   },
   {
     "id": "node",
@@ -234,7 +238,8 @@
     "arch": "x86",
     "windows_url": "WinPython-32bit-2.7.13.1Zero.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python-2.7.13/python%.exe%'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python-2.7.13/python%.exe%"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python-2.7.13/python%.exe%",
+    "is_old": true
   },
   {
     "id": "python",
@@ -243,7 +248,8 @@
     "arch": "x86_64",
     "windows_url": "WinPython-64bit-2.7.13.1Zero.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python-2.7.13.amd64/python%.exe%'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python-2.7.13.amd64/python%.exe%"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python-2.7.13.amd64/python%.exe%",
+    "is_old": true
   },
   {
     "id": "python",
@@ -252,7 +258,8 @@
     "arch": "x86",
     "windows_url": "python-3.7.4-embed-win32-patched.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python.exe'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe",
+    "is_old": true
   },
   {
     "id": "python",
@@ -261,7 +268,8 @@
     "arch": "x86_64",
     "windows_url": "python-3.7.4-embed-amd64-patched.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python.exe'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe",
+    "is_old": true
   },
   {
     "id": "python",
@@ -270,7 +278,8 @@
     "arch": "x86",
     "windows_url": "python-3.7.4-embed-win32+pywin32.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python.exe'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe",
+    "is_old": true
   },
   {
     "id": "python",
@@ -279,7 +288,8 @@
     "arch": "x86_64",
     "windows_url": "python-3.7.4-embed-amd64+pywin32.zip",
     "activated_cfg": "PYTHON='%installation_dir%/python.exe'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe",
+    "is_old": true
   },
   {
     "id": "python",
@@ -288,7 +298,17 @@
     "arch": "x86_64",
     "macos_url": "python-3.7.4-2-macos.tar.gz",
     "activated_cfg": "PYTHON='%installation_dir%/bin/python3'",
-    "activated_env": "EMSDK_PYTHON=%installation_dir%/bin/python3;SSL_CERT_FILE=%installation_dir%/lib/python3.7/site-packages/certifi/cacert.pem"
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/bin/python3;SSL_CERT_FILE=%installation_dir%/lib/python3.7/site-packages/certifi/cacert.pem",
+    "is_old": true
+  },
+  {
+    "id": "python",
+    "version": "3.9.2-1",
+    "bitness": 64,
+    "arch": "x86_64",
+    "windows_url": "python-3.9.2-1-embed-amd64+pywin32.zip",
+    "activated_cfg": "PYTHON='%installation_dir%/python.exe'",
+    "activated_env": "EMSDK_PYTHON=%installation_dir%/python.exe"
   },
   {
     "id": "python",
@@ -506,7 +526,7 @@
   {
     "version": "upstream-main",
     "bitness": 64,
-    "uses": ["python-3.7.4-pywin32-64bit", "llvm-git-main-64bit", "node-14.15.5-64bit", "emscripten-main-64bit", "binaryen-main-64bit"],
+    "uses": ["python-3.9.2-1-64bit", "llvm-git-main-64bit", "node-14.15.5-64bit", "emscripten-main-64bit", "binaryen-main-64bit"],
     "os": "win"
   },
   {
@@ -573,7 +593,7 @@
   {
     "version": "releases-upstream-%releases-tag%",
     "bitness": 64,
-    "uses": ["node-14.15.5-64bit", "python-3.7.4-2-64bit", "releases-upstream-%releases-tag%-64bit"],
+    "uses": ["node-14.15.5-64bit", "python-3.9.2-1-64bit", "releases-upstream-%releases-tag%-64bit"],
     "os": "macos",
     "arch": "x86_64",
     "custom_install_script": "emscripten_npm_install"
@@ -581,7 +601,7 @@
   {
     "version": "releases-upstream-%releases-tag%",
     "bitness": 64,
-    "uses": ["node-14.15.5-64bit", "python-3.7.4-pywin32-64bit", "java-8.152-64bit", "releases-upstream-%releases-tag%-64bit"],
+    "uses": ["node-14.15.5-64bit", "python-3.9.2-1-64bit", "java-8.152-64bit", "releases-upstream-%releases-tag%-64bit"],
     "os": "win",
     "custom_install_script": "emscripten_npm_install"
   },
diff --git a/scripts/update_python.py b/scripts/update_python.py
index f7509aa..390aa71 100755
--- a/scripts/update_python.py
+++ b/scripts/update_python.py
@@ -42,13 +42,31 @@
 upload_base = 'gs://webassembly/emscripten-releases-builds/deps/'
 
 
+def unzip_cmd():
+    # Use 7-Zip if available (https://www.7-zip.org/)
+    sevenzip = os.path.join(os.getenv('ProgramFiles'), '7-Zip', '7z.exe')
+    if os.path.isfile(sevenzip):
+        return [sevenzip, 'x']
+    # Fall back to 'unzip' tool
+    return ['unzip', '-q']
+
+
+def zip_cmd():
+    # Use 7-Zip if available (https://www.7-zip.org/)
+    sevenzip = os.path.join(os.getenv('ProgramFiles'), '7-Zip', '7z.exe')
+    if os.path.isfile(sevenzip):
+        return [sevenzip, 'a', '-mx9']
+    # Fall back to 'zip' tool
+    return ['zip', '-rq']
+
+
 def make_python_patch(arch):
     if arch == 'amd64':
       pywin32_filename = 'pywin32-%s.win-%s-py%s.exe' % (pywin32_version, arch, major_minor_version)
     else:
       pywin32_filename = 'pywin32-%s.%s-py%s.exe' % (pywin32_version, arch, major_minor_version)
     filename = 'python-%s-embed-%s.zip' % (version, arch)
-    out_filename = 'python-%s-embed-%s+pywin32.zip' % (version, arch)
+    out_filename = 'python-%s-%s-embed-%s+pywin32.zip' % (version, revision, arch)
     if not os.path.exists(pywin32_filename):
         download_url = pywin32_base + pywin32_filename
         print('Downloading pywin32: ' + download_url)
@@ -60,17 +78,21 @@
         urllib.request.urlretrieve(download_url, filename)
 
     os.mkdir('python-embed')
-    check_call(['unzip', '-q', os.path.abspath(filename)], cwd='python-embed')
-    os.remove(os.path.join('python-embed', 'python37._pth'))
+    check_call(unzip_cmd() + [os.path.abspath(filename)], cwd='python-embed')
+    os.remove(os.path.join('python-embed', 'python%s._pth' % major_minor_version.replace('.', '')))
 
     os.mkdir('pywin32')
-    rtn = subprocess.call(['unzip', '-q', os.path.abspath(pywin32_filename)], cwd='pywin32')
+    rtn = subprocess.call(unzip_cmd() + [os.path.abspath(pywin32_filename)], cwd='pywin32')
     assert rtn in [0, 1]
 
     os.mkdir(os.path.join('python-embed', 'lib'))
     shutil.move(os.path.join('pywin32', 'PLATLIB'), os.path.join('python-embed', 'lib', 'site-packages'))
 
-    check_call(['zip', '-rq', os.path.join('..', out_filename), '.'], cwd='python-embed')
+    check_call(zip_cmd() + [os.path.join('..', out_filename), '.'], cwd='python-embed')
+
+    # cleanup if everything went fine
+    shutil.rmtree('python-embed')
+    shutil.rmtree('pywin32')
 
     upload_url = upload_base + out_filename
     print('Uploading: ' + upload_url)
@@ -78,10 +100,6 @@
     print(' '.join(cmd))
     check_call(cmd)
 
-    # cleanup if everything went fine
-    shutil.rmtree('python-embed')
-    shutil.rmtree('pywin32')
-
 
 def build_python():
     if sys.platform.startswith('darwin'):