<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/c7b5f64a4df2c7a8f9542716940d5d4b9762db7f">https://github.com/macports/macports-ports/commit/c7b5f64a4df2c7a8f9542716940d5d4b9762db7f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit c7b5f64a4df2c7a8f9542716940d5d4b9762db7f
</span>Author: Steven Thomas Smith <s.t.smith@ieee.org>
AuthorDate: Mon Feb 14 20:34:44 2022 -0500

<span style='display:block; white-space:pre;color:#404040;'>    py-undetected-chromedriver: Submission
</span>---
 python/py-undetected-chromedriver/Portfile         | 88 ++++++++++++++++++++++
 .../patch-undetected_chromedriver-__init__-py.diff | 57 ++++++++++++++
 .../patch-undetected_chromedriver-patcher-py.diff  | 81 ++++++++++++++++++++
 3 files changed, 226 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/Portfile b/python/py-undetected-chromedriver/Portfile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..3fa1dd1b870
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,88 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortSystem          1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup           python 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+name                py-undetected-chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             3.1.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+categories-append   python www
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+maintainers         nomaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+license             GPL-3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+supported_archs     noarch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+description         Custom Selenium Chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long_description    {*}${description} | Zero-Config | \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    Passes ALL bot mitigation systems \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+homepage            https://github.com/ultrafunkamsterdam/undetected-chromedriver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  487c1f61efb09340b7db6bd2cd201a0a6c01ba26 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  d8884a9d2a65fbe272c184d4c8f92fc6c8e686aa49bf441dd63bf92ff58007e8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    39157
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+python.versions     37 38 39 310
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${name} ne ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_build-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:python${python.version} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:py${python.version}-requests \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:py${python.version}-setuptools \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:py${python.version}-websockets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:py${python.version}-selenium
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_test-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    port:py${python.version}-pytest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        fs-traverse f ${worksrcpath}/undetected_chromedriver {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[file isfile ${f}] && [string match "*.py" ${f}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                reinplace -E -q \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "1s|^(#!\[\[:space:]]*)/usr/bin/env\[\[:space:]]+python3|\\1${python.bin}|" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ${f}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.run        yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.env-append PYTHONPATH=${worksrcpath}/build/lib
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.cmd        py.test-${python.branch}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test.target     tests/v2/test_uc.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant port_chromedriver_binary \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    description {Patch the chromedriver port binary.} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${name} ne ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # diff -Naurd ./uc-orig/undetected_chromedriver/__init__.py ./uc-new/undetected_chromedriver/__init__.py | sed -E -e 's/\.\/uc-(orig|new)\//.\//g' | sed -E -e 's|/opt/local|@PREFIX@|g' > ~/Downloads/patch-undetected_chromedriver-__init__-py.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        patchfiles-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-undetected_chromedriver-__init__-py.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    patch-undetected_chromedriver-patcher-py.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace "s|@PREFIX@|${prefix}|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ${worksrcpath}/undetected_chromedriver/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            reinplace "s|@NAME@|chromedriver|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ${worksrcpath}/undetected_chromedriver/__init__.py
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    notes-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "This package is intended to be used with the port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    chromedriver +undetected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and the Python code:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    import undetected_chromedriver as uc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    driver = uc.Chrome()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To use separate chromedriver binaries with distinct signatures, use:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    driver = uc.Chrome(executable_path='${prefix}/bin/chromedriver-original', executable_path_mkdtemp=True)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    driver.delete_executable_path_mkdtemp()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default_variants-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    +port_chromedriver_binary
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..6c18ee32196
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-__init__-py.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,57 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./undetected_chromedriver/__init__.py  2022-02-14 13:34:12.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./undetected_chromedriver/__init__.py  2022-02-22 14:44:18.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -110,6 +110,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         patcher_force_close=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         suppress_welcome=True,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         use_subprocess=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        executable_path='@PREFIX@/bin/@NAME@',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        executable_path_mkdtemp=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         debug=False,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         **kw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -198,15 +200,30 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               in that case you can set this to `True`. The browser will start via subprocess, and will keep running most of times.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               ! setting it to True comes with NO support when being detected. !
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        executable_path: str, optional, default: '@PREFIX@/bin/@NAME@'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            a full file path to the patched chromedriver executable.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        executable_path_mkdtemp: bool or str, optional, default: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            Make a temporary directory, copy `chromedriver` there from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            `executable_path`, and patch the executable. The user must
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            delete this `chromedriver` copy and temporary path with the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            method `delete_executable_path_mkdtemp`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.debug = debug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         patcher = Patcher(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            executable_path=None,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            executable_path=executable_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            executable_path_mkdtemp=executable_path_mkdtemp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             force=patcher_force_close,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             version_main=version_main,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         patcher.auto()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if hasattr(patcher, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           and patcher.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           and isinstance(patcher.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            self.executable_path_mkdtemp = patcher.executable_path_mkdtemp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if not options:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             options = ChromeOptions()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -613,6 +630,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def __hash__(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return hash(self.options.debugger_address)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def delete_executable_path_mkdtemp(self):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if hasattr(self, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           and self.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           and isinstance(self.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            os.unlink(self.executable_path_mkdtemp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            os.rmdir(os.path.dirname(self.executable_path_mkdtemp))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def find_chrome_executable():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     """
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..fc40153ef38
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-undetected-chromedriver/files/patch-undetected_chromedriver-patcher-py.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,81 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ./undetected_chromedriver/patcher.py   2022-02-22 14:13:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ ./undetected_chromedriver/patcher.py   2022-02-22 14:42:04.000000000 -0500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6,8 +6,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import os
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import random
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import re
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import shutil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import sys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++import tempfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import zipfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from distutils.version import LooseVersion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ from urllib.request import urlopen, urlretrieve
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,12 +45,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         d = "~/.undetected_chromedriver"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     data_path = os.path.abspath(os.path.expanduser(d))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    def __init__(self, executable_path=None, force=False, version_main: int = 0):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def __init__(self, executable_path=None, executable_path_mkdtemp=False, force=False, version_main: int = 0):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         """
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         Args:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             executable_path: None = automatic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              a full file path to the chromedriver executable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            executable_path_mkdtemp: bool or str, optional, default: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                Make a temporary directory, copy `chromedriver` there from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                `executable_path`, and patch the executable.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             force: False
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     terminate processes which are holding lock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             version_main: 0 = auto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -78,16 +83,30 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if executable_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._custom_exe_path = True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.executable_path = executable_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if executable_path_mkdtemp:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                self.executable_path_mkdtemp = executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    if isinstance(executable_path_mkdtemp, str) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                       else os.path.join(tempfile.mkdtemp(), self.exe_name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.version_main = version_main
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         self.version_full = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    def auto(self, executable_path=None, force=False, version_main=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    def auto(self, executable_path=None, executable_path_mkdtemp=False, force=False, version_main=None):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         """"""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if executable_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self.executable_path = executable_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             self._custom_exe_path = True
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if executable_path_mkdtemp:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                self.executable_path_mkdtemp = executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    if isinstance(executable_path_mkdtemp, str) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                       else os.path.join(tempfile.mkdtemp(), self.exe_name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if self._custom_exe_path:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if hasattr(self, 'executable_path_mkdtemp') \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               and self.executable_path_mkdtemp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               and isinstance(self.executable_path_mkdtemp, str):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                shutil.copy(self.executable_path, self.executable_path_mkdtemp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                self.executable_path = self.executable_path_mkdtemp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             ispatched = self.is_binary_patched(self.executable_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if not ispatched:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return self.patch_exe()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -194,10 +213,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     @staticmethod
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def gen_random_cdc():
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        cdc = random.choices(string.ascii_lowercase, k=26)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        cdc[-6:-4] = map(str.upper, cdc[-6:-4])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        cdc[2] = cdc[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        cdc[3] = "_"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        """Generate a length 26 random bytestring that doesn't start with 'cdc_'."""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        while True:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            cdc = random.choices(string.ascii_lowercase, k=26)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if cdc[0] == 'c' and cdc[1] == 'd': continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            cdc[-6:-4] = map(str.upper, cdc[-6:-4])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            cdc[2] = cdc[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            cdc[3] = "_"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return "".join(cdc).encode()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def is_binary_patched(self, executable_path=None):
</span></pre><pre style='margin:0'>

</pre>